drivers/firmware/cirrus/test/cs_dsp_mock_wmfw.c

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

File Facts

System
Linux kernel
Corpus path
drivers/firmware/cirrus/test/cs_dsp_mock_wmfw.c
Extension
.c
Size
15040 bytes
Lines
479
Domain
Driver Families
Bucket
drivers/firmware
Inferred role
Driver Families: exported/initcall integration point
Status
integration 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_mock_wmfw_builder {
	struct cs_dsp_test *test_priv;
	int format_version;
	void *buf;
	size_t buf_size_bytes;
	void *write_p;
	size_t bytes_used;

	void *alg_data_header;
	unsigned int num_coeffs;
};

struct wmfw_adsp2_halo_header {
	struct wmfw_header header;
	struct wmfw_adsp2_sizes sizes;
	struct wmfw_footer footer;
} __packed;

struct wmfw_long_string {
	__le16 len;
	u8 data[] __nonstring __counted_by(len);
} __packed;

struct wmfw_short_string {
	u8 len;
	u8 data[] __nonstring __counted_by(len);
} __packed;

KUNIT_DEFINE_ACTION_WRAPPER(vfree_action_wrapper, vfree, void *)

/**
 * cs_dsp_mock_wmfw_format_version() - Return format version.
 *
 * @builder:	Pointer to struct cs_dsp_mock_wmfw_builder.
 *
 * Return: Format version.
 */
int cs_dsp_mock_wmfw_format_version(struct cs_dsp_mock_wmfw_builder *builder)
{
	return builder->format_version;
}
EXPORT_SYMBOL_NS_GPL(cs_dsp_mock_wmfw_format_version, "FW_CS_DSP_KUNIT_TEST_UTILS");

/**
 * cs_dsp_mock_wmfw_get_firmware() - Get struct firmware wrapper for data.
 *
 * @builder:	Pointer to struct cs_dsp_mock_wmfw_builder.
 *
 * Return: Pointer to a struct firmware wrapper for the data.
 */
struct firmware *cs_dsp_mock_wmfw_get_firmware(struct cs_dsp_mock_wmfw_builder *builder)
{
	struct firmware *fw;

	if (!builder)
		return NULL;

	fw = kunit_kzalloc(builder->test_priv->test, sizeof(*fw), GFP_KERNEL);
	KUNIT_ASSERT_NOT_ERR_OR_NULL(builder->test_priv->test, fw);

	fw->data = builder->buf;
	fw->size = builder->bytes_used;

	return fw;
}
EXPORT_SYMBOL_NS_GPL(cs_dsp_mock_wmfw_get_firmware, "FW_CS_DSP_KUNIT_TEST_UTILS");

/**
 * cs_dsp_mock_wmfw_add_raw_block() - Add a block to the wmfw file.
 *
 * @builder:		Pointer to struct cs_dsp_mock_bin_builder.
 * @block_type:		Block type.
 * @offset:		Offset.
 * @payload_data:	Pointer to buffer containing the payload data,
 *			or NULL if no data.
 * @payload_len_bytes:	Length of payload data in bytes, or zero.
 */
void cs_dsp_mock_wmfw_add_raw_block(struct cs_dsp_mock_wmfw_builder *builder,
				    int block_type, unsigned int offset,
				    const void *payload_data, size_t payload_len_bytes)
{
	struct wmfw_region *header = builder->write_p;
	unsigned int bytes_needed = struct_size_t(struct wmfw_region, data, payload_len_bytes);

	KUNIT_ASSERT_TRUE(builder->test_priv->test,
			  (builder->write_p + bytes_needed) <
			  (builder->buf + CS_DSP_MOCK_WMFW_BUF_SIZE));

	header->offset = cpu_to_le32(offset | (block_type << 24));
	header->len = cpu_to_le32(payload_len_bytes);

Annotation

Implementation Notes