drivers/firmware/cirrus/test/cs_dsp_test_bin_error.c

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

File Facts

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

struct cs_dsp_bin_test_param {
	int block_type;
};

static const struct cs_dsp_mock_alg_def cs_dsp_bin_err_test_mock_algs[] = {
	{
		.id = 0xfafa,
		.ver = 0x100000,
		.xm_size_words = 164,
		.ym_size_words = 164,
		.zm_size_words = 164,
	},
};

/* Load a bin containing unknown blocks. They should be skipped. */
static void bin_load_with_unknown_blocks(struct kunit *test)
{
	struct cs_dsp_test *priv = test->priv;
	struct cs_dsp_test_local *local = priv->local;
	struct firmware *bin;
	unsigned int reg_addr;
	u8 *payload_data, *readback;
	u8 random_data[8];
	const unsigned int payload_size_bytes = 64;

	payload_data = kunit_kmalloc(test, payload_size_bytes, GFP_KERNEL);
	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, payload_data);
	get_random_bytes(payload_data, payload_size_bytes);

	readback = kunit_kzalloc(test, payload_size_bytes, GFP_KERNEL);
	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, readback);

	/* Add some unknown blocks at the start of the bin */
	get_random_bytes(random_data, sizeof(random_data));
	cs_dsp_mock_bin_add_raw_block(local->bin_builder,
				      cs_dsp_bin_err_test_mock_algs[0].id,
				      cs_dsp_bin_err_test_mock_algs[0].ver,
				      0xf5, 0, 0,
				      random_data, sizeof(random_data));
	cs_dsp_mock_bin_add_raw_block(local->bin_builder,
				      cs_dsp_bin_err_test_mock_algs[0].id,
				      cs_dsp_bin_err_test_mock_algs[0].ver,
				      0xf500, 0, 0,
				      random_data, sizeof(random_data));
	cs_dsp_mock_bin_add_raw_block(local->bin_builder,
				      cs_dsp_bin_err_test_mock_algs[0].id,
				      cs_dsp_bin_err_test_mock_algs[0].ver,
				      0xc300, 0, 0,
				      random_data, sizeof(random_data));

	/* Add a single payload to be written to DSP memory */
	cs_dsp_mock_bin_add_raw_block(local->bin_builder,
				      cs_dsp_bin_err_test_mock_algs[0].id,
				      cs_dsp_bin_err_test_mock_algs[0].ver,
				      WMFW_ADSP2_YM, 0, 0,
				      payload_data, payload_size_bytes);

	bin = cs_dsp_mock_bin_get_firmware(local->bin_builder);
	KUNIT_EXPECT_EQ(test,
			cs_dsp_power_up(priv->dsp, local->wmfw, "wmfw", bin, "bin", "misc"),
			0);

	/* Check that the payload was written to memory */
	reg_addr = cs_dsp_mock_base_addr_for_mem(priv, WMFW_ADSP2_YM);
	KUNIT_EXPECT_EQ(test,
			regmap_raw_read(priv->dsp->regmap, reg_addr, readback, payload_size_bytes),
			0);
	KUNIT_EXPECT_MEMEQ(test, readback, payload_data, payload_size_bytes);
}

/* Load a bin that doesn't have a valid magic marker. */
static void bin_err_wrong_magic(struct kunit *test)
{
	struct cs_dsp_test *priv = test->priv;
	struct cs_dsp_test_local *local = priv->local;
	struct firmware *bin;

	/* Sanity-check that the wmfw loads ok without the bin */
	KUNIT_EXPECT_EQ(test,
			cs_dsp_power_up(priv->dsp, local->wmfw, "wmfw", NULL, NULL, "misc"),
			0);
	cs_dsp_power_down(priv->dsp);

Annotation

Implementation Notes