intel-ipc: fix host ring buffer size not page aligned issue

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@linux.intel.com>
This commit is contained in:
Keyon Jie 2017-11-16 22:48:18 +08:00 committed by Liam Girdwood
parent 1aded4f4a6
commit 14b43b369b
1 changed files with 15 additions and 0 deletions

View File

@ -175,6 +175,17 @@ static int parse_page_descriptors(struct intel_ipc_data *iipc,
host = (struct sof_ipc_comp_host *)&cd->comp;
}
/* the ring size may be not multiple of the page size, the last
* page may be not full used. The used size should be in range
* of (ring->pages - 1, ring->pages] * PAGES.
*/
if ((ring->size <= HOST_PAGE_SIZE * (ring->pages - 1)) ||
(ring->size > HOST_PAGE_SIZE * ring->pages)) {
/* error buffer size */
trace_ipc_error("eBs");
return -EINVAL;
}
for (i = 0; i < ring->pages; i++) {
idx = (((i << 2) + i)) >> 1;
@ -192,6 +203,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;
if (is_trace)
err = dma_trace_host_buffer(d, &elem, ring->size);
else