drivers/firmware/cirrus/test/cs_dsp_test_control_parse.c

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

File Facts

System
Linux kernel
Corpus path
drivers/firmware/cirrus/test/cs_dsp_test_control_parse.c
Extension
.c
Size
68586 bytes
Lines
1844
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_xm_header *xm_header;
	struct cs_dsp_mock_wmfw_builder *wmfw_builder;
	int wmfw_version;
};

struct cs_dsp_ctl_parse_test_param {
	int mem_type;
	int alg_id;
	unsigned int offset;
	unsigned int length;
	u16 ctl_type;
	u16 flags;
};

static const struct cs_dsp_mock_alg_def cs_dsp_ctl_parse_test_algs[] = {
	{
		.id = 0xfafa,
		.ver = 0x100000,
		.xm_size_words = 164,
		.ym_size_words = 164,
		.zm_size_words = 164,
	},
	{
		.id = 0xb,
		.ver = 0x100001,
		.xm_size_words = 8,
		.ym_size_words = 8,
		.zm_size_words = 8,
	},
	{
		.id = 0x9f1234,
		.ver = 0x100500,
		.xm_size_words = 16,
		.ym_size_words = 16,
		.zm_size_words = 16,
	},
	{
		.id = 0xff00ff,
		.ver = 0x300113,
		.xm_size_words = 16,
		.ym_size_words = 16,
		.zm_size_words = 16,
	},
};

static const struct cs_dsp_mock_coeff_def mock_coeff_template = {
	.shortname = "Dummy Coeff",
	.type = WMFW_CTL_TYPE_BYTES,
	.mem_type = WMFW_ADSP2_YM,
	.flags = WMFW_CTL_FLAG_VOLATILE,
	.length_bytes = 4,
};

static char *cs_dsp_ctl_alloc_test_string(struct kunit *test, char c, size_t len)
{
	char *str;

	str = kunit_kmalloc(test, len + 1, GFP_KERNEL);
	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, str);
	memset(str, c, len);
	str[len] = '\0';

	return str;
}

/* Algorithm info block without controls should load */
static void cs_dsp_ctl_parse_no_coeffs(struct kunit *test)
{
	struct cs_dsp_test *priv = test->priv;
	struct cs_dsp_test_local *local = priv->local;
	struct firmware *wmfw;

	cs_dsp_mock_wmfw_start_alg_info_block(local->wmfw_builder,
					      cs_dsp_ctl_parse_test_algs[0].id,
					      "dummyalg", NULL);
	cs_dsp_mock_wmfw_end_alg_info_block(local->wmfw_builder);

	wmfw = cs_dsp_mock_wmfw_get_firmware(priv->local->wmfw_builder);
	KUNIT_ASSERT_EQ(test, cs_dsp_power_up(priv->dsp, wmfw, "mock_fw", NULL, NULL, "misc"), 0);
}

/*
 * V1 controls do not have names, the name field in the coefficient entry
 * should be ignored.
 */
static void cs_dsp_ctl_parse_v1_name(struct kunit *test)
{
	struct cs_dsp_test *priv = test->priv;
	struct cs_dsp_test_local *local = priv->local;

Annotation

Implementation Notes