From 14b43b369b7d72e67ab5331bf93ed3a14daee371 Mon Sep 17 00:00:00 2001 From: Keyon Jie Date: Thu, 16 Nov 2017 22:48:18 +0800 Subject: [PATCH] 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 --- src/ipc/intel-ipc.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/ipc/intel-ipc.c b/src/ipc/intel-ipc.c index 56bd8ba56..e13b5412c 100644 --- a/src/ipc/intel-ipc.c +++ b/src/ipc/intel-ipc.c @@ -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