[PATCH v7 03/14] ASoC: Intel: catpt: Add IPC message handlers

Andy Shevchenko andriy.shevchenko at linux.intel.com
Mon Sep 21 14:59:34 CEST 2020


On Mon, Sep 21, 2020 at 01:54:13PM +0200, Cezary Rojewski wrote:
> Declare global and stream IPC message handlers for all known message
> types.

...

> +int catpt_coredump(struct catpt_dev *cdev)
> +{
> +	struct catpt_dump_section_hdr *hdr;
> +	size_t dump_size, regs_size;
> +	u8 *dump, *pos;
> +	int i, j;
> +
> +	regs_size = CATPT_SHIM_REGS_SIZE;
> +	regs_size += CATPT_DMA_COUNT * CATPT_DMA_REGS_SIZE;
> +	regs_size += CATPT_SSP_COUNT * CATPT_SSP_REGS_SIZE;
> +	dump_size = resource_size(&cdev->dram);
> +	dump_size += resource_size(&cdev->iram);
> +	dump_size += regs_size;

> +	dump_size += 4 * sizeof(*hdr) + 20; /* hdrs and fw hash */

Function is full of hard coded 20s. Can you provide descriptive macro?

> +	dump = vzalloc(dump_size);
> +	if (!dump)
> +		return -ENOMEM;
> +
> +	pos = dump;
> +
> +	hdr = (struct catpt_dump_section_hdr *)pos;
> +	hdr->magic = CATPT_DUMP_MAGIC;
> +	hdr->core_id = cdev->spec->core_id;
> +	hdr->section_id = CATPT_DUMP_SECTION_ID_FILE;
> +	hdr->size = dump_size - sizeof(*hdr);
> +	pos += sizeof(*hdr);
> +
> +	for (i = j = 0; i < FW_INFO_SIZE_MAX; i++)
> +		if (cdev->ipc.config.fw_info[i] == ' ')
> +			if (++j == 4)
> +				break;

> +	for (j = ++i; j < FW_INFO_SIZE_MAX && j - i < 20; j++) {

This should have static_assert() at the place where you define both constants
(2nd is mentioned above 20).

> +		if (cdev->ipc.config.fw_info[j] == ' ')
> +			break;
> +		*(pos + j - i) = cdev->ipc.config.fw_info[j];
> +	}
> +	pos += 20;

These two for-loops should have some comment to explain what's going on.

> +	hdr = (struct catpt_dump_section_hdr *)pos;
> +	hdr->magic = CATPT_DUMP_MAGIC;
> +	hdr->core_id = cdev->spec->core_id;
> +	hdr->section_id = CATPT_DUMP_SECTION_ID_IRAM;
> +	hdr->size = resource_size(&cdev->iram);
> +	pos += sizeof(*hdr);
> +
> +	memcpy_fromio(pos, cdev->lpe_ba + cdev->iram.start, hdr->size);
> +	pos += hdr->size;
> +
> +	hdr = (struct catpt_dump_section_hdr *)pos;
> +	hdr->magic = CATPT_DUMP_MAGIC;
> +	hdr->core_id = cdev->spec->core_id;
> +	hdr->section_id = CATPT_DUMP_SECTION_ID_DRAM;
> +	hdr->size = resource_size(&cdev->dram);
> +	pos += sizeof(*hdr);
> +
> +	memcpy_fromio(pos, cdev->lpe_ba + cdev->dram.start, hdr->size);
> +	pos += hdr->size;
> +
> +	hdr = (struct catpt_dump_section_hdr *)pos;
> +	hdr->magic = CATPT_DUMP_MAGIC;
> +	hdr->core_id = cdev->spec->core_id;
> +	hdr->section_id = CATPT_DUMP_SECTION_ID_REGS;
> +	hdr->size = regs_size;
> +	pos += sizeof(*hdr);
> +
> +	memcpy_fromio(pos, catpt_shim_addr(cdev), CATPT_SHIM_REGS_SIZE);
> +	pos += CATPT_SHIM_REGS_SIZE;
> +
> +	for (i = 0; i < CATPT_SSP_COUNT; i++) {
> +		memcpy_fromio(pos, catpt_ssp_addr(cdev, i),
> +			      CATPT_SSP_REGS_SIZE);
> +		pos += CATPT_SSP_REGS_SIZE;
> +	}
> +	for (i = 0; i < CATPT_DMA_COUNT; i++) {
> +		memcpy_fromio(pos, catpt_dma_addr(cdev, i),
> +			      CATPT_DMA_REGS_SIZE);
> +		pos += CATPT_DMA_REGS_SIZE;
> +	}
> +
> +	dev_coredumpv(cdev->dev, dump, dump_size, GFP_KERNEL);
> +
> +	return 0;
> +}

...

> +struct catpt_set_volume_input {
> +	u32 channel;
> +	u32 target_volume;
> +	u64 curve_duration;
> +	enum catpt_audio_curve_type curve_type __aligned(4);

> +} __packed;

How this __packed changes anything? In general __packed doesn't make sense for
in-kernel data structures. Otherwise you have to use proper (POD) types for
data. Ditto for all similar cases.

-- 
With Best Regards,
Andy Shevchenko




More information about the Alsa-devel mailing list