[Sound-open-firmware] [PATCH v2] intel-ipc: fix host ring buffer size not page aligned issue

Jie, Yang yang.jie at intel.com
Thu Nov 16 15:43:11 CET 2017


>-----Original Message-----
>From: Pierre-Louis Bossart [mailto:pierre-louis.bossart at linux.intel.com]
>Sent: Wednesday, November 15, 2017 10:55 PM
>To: Keyon Jie <yang.jie at linux.intel.com>; sound-open-firmware at alsa-
>project.org; Girdwood, Liam R <liam.r.girdwood at intel.com>
>Cc: Jie, Yang <yang.jie at intel.com>
>Subject: Re: [Sound-open-firmware] [PATCH v2] intel-ipc: fix host ring buffer size
>not page aligned issue
>
>On 11/15/17 3:41 AM, Keyon Jie wrote:
>> The host ring buffer size may be not page aligned, but the last page
>> was utilized by host component wrongly, which may introduce beating
>> noise.
>>
>> Here change to correct size for the last element, which will fix the
>> issue.
>>
>> Signed-off-by: Keyon Jie <yang.jie at linux.intel.com>
>> ---
>>   src/ipc/intel-ipc.c | 10 ++++++++++
>>   1 file changed, 10 insertions(+)
>>
>> diff --git a/src/ipc/intel-ipc.c b/src/ipc/intel-ipc.c index
>> 56bd8ba..7de533a 100644
>> --- a/src/ipc/intel-ipc.c
>> +++ b/src/ipc/intel-ipc.c
>> @@ -175,6 +175,12 @@ static int parse_page_descriptors(struct intel_ipc_data
>*iipc,
>>   		host = (struct sof_ipc_comp_host *)&cd->comp;
>>   	}
>>
>> +	if (HOST_PAGE_SIZE * ring->pages < ring->size) {
>> +		/* host side passed in error ring buffer size */
>> +		trace_ipc_error("eBs");
>> +		return -EINVAL;
>> +	}
>> +
>>   	for (i = 0; i < ring->pages; i++) {
>>
>>   		idx = (((i << 2) + i)) >> 1;
>> @@ -192,6 +198,10 @@ static int parse_page_descriptors(struct intel_ipc_data
>*iipc,
>>   		else
>>   			elem.dest = phy_addr;
>>
>> +		/* the last page may be not full used */
>> +		if (i == (ring->pages - 1))
>> +			elem.size = ring->size - HOST_PAGE_SIZE * i;
>
>I was thrown off by the two changes, maybe document that the first case is
>indeed a bad configuration where the ring buffer uses too few pages and
>conversely in the second case that the ring buffer relies on an additional page
>which may not be completely used (not an error case).
>
>In the first test, maybe you should also check there is only one page which isn't
>partially used, or the second case will fail.
>something like
>
>if (HOST_PAGE_SIZE * ring->pages - ring->size >= HOST_PAGE_SIZE)
>	error("too many pages");

Good point, let me fix it and make it more clear.

Thanks,
~Keyon

>
>
>> +
>>   		if (is_trace)
>>   			err = dma_trace_host_buffer(d, &elem, ring->size);
>>   		else
>>



More information about the Sound-open-firmware mailing list