drivers/firmware/cirrus/test/cs_dsp_test_bin.c

Source file repositories/reference/linux-study-clean/drivers/firmware/cirrus/test/cs_dsp_test_bin.c

File Facts

System
Linux kernel
Corpus path
drivers/firmware/cirrus/test/cs_dsp_test_bin.c
Extension
.c
Size
112749 bytes
Lines
2871
Domain
Driver Families
Bucket
drivers/firmware
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

struct cs_dsp_test_local {
	struct cs_dsp_mock_bin_builder *bin_builder;
	struct cs_dsp_mock_wmfw_builder *wmfw_builder;
	struct firmware *wmfw;
};

struct bin_test_param {
	const char *name;
	int mem_type;
	unsigned int offset_words;
	int alg_idx;
	void (*add_patch)(struct cs_dsp_mock_bin_builder *builder,
			  unsigned int alg_id, unsigned int alg_ver,
			  int mem_region, unsigned int reg_addr_offset,
			  const void *payload_data, size_t payload_len_bytes);
};

static const struct cs_dsp_mock_alg_def bin_test_mock_algs[] = {
	{
		.id = 0xfafa,
		.ver = 0x100000,
		.xm_size_words = 164,
		.ym_size_words = 164,
		.zm_size_words = 164,
	},
	{
		.id = 0xfbfb,
		.ver = 0x100000,
		.xm_size_words = 99,
		.ym_size_words = 99,
		.zm_size_words = 99,
	},
	{
		.id = 0xc321,
		.ver = 0x100000,
		.xm_size_words = 120,
		.ym_size_words = 120,
		.zm_size_words = 120,
	},
	{
		.id = 0xb123,
		.ver = 0x100000,
		.xm_size_words = 96,
		.ym_size_words = 96,
		.zm_size_words = 96,
	},
};

/*
 * Convert number of DSP words to number of packed registers rounded
 * down to the nearest register.
 * There are 3 registers for every 4 packed words.
 */
static unsigned int _num_words_to_num_packed_regs(unsigned int num_dsp_words)
{
	return (num_dsp_words * 3) / 4;
}

/* bin file that patches a single DSP word */
static void bin_patch_one_word(struct kunit *test)
{
	struct cs_dsp_test *priv = test->priv;
	const struct bin_test_param *param = test->param_value;
	unsigned int reg_inc_per_word = cs_dsp_mock_reg_addr_inc_per_unpacked_word(priv);
	u32 reg_val, payload_data;
	unsigned int alg_base_words, reg_addr;
	struct firmware *fw;

	get_random_bytes(&payload_data, sizeof(payload_data));

	alg_base_words = cs_dsp_mock_xm_header_get_alg_base_in_words(priv,
							bin_test_mock_algs[param->alg_idx].id,
							param->mem_type);

	param->add_patch(priv->local->bin_builder,
			 bin_test_mock_algs[param->alg_idx].id,
			 bin_test_mock_algs[param->alg_idx].ver,
			 param->mem_type,
			 param->offset_words * reg_inc_per_word,
			 &payload_data, sizeof(payload_data));

	fw = cs_dsp_mock_bin_get_firmware(priv->local->bin_builder);
	KUNIT_ASSERT_EQ(test,
			cs_dsp_power_up(priv->dsp, priv->local->wmfw, "mock_wmfw",
					fw, "mock_bin", "misc"),
			0);

	/* Content of registers should match payload_data */
	reg_addr = cs_dsp_mock_base_addr_for_mem(priv, param->mem_type) +
		   ((alg_base_words + param->offset_words) * reg_inc_per_word);

Annotation

Implementation Notes