From 387befd08116fb3c0e00f49977bea9b7aca6cd89 Mon Sep 17 00:00:00 2001 From: Rander Wang Date: Mon, 10 Sep 2018 14:54:41 +0800 Subject: [PATCH] ipc: remove waiti running in IRQ level higher than passive level waiti would cause FW panic if it is called in irq level higher than passive level Signed-off-by: Rander Wang --- src/include/sof/wait.h | 28 ++++++++++++++++++++++++++++ src/ipc/ipc.c | 5 +++-- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/include/sof/wait.h b/src/include/sof/wait.h index feb8b29b3149..b07302e76286 100644 --- a/src/include/sof/wait.h +++ b/src/include/sof/wait.h @@ -42,7 +42,10 @@ #include #include #include +#include +#include #include +#include #if DEBUG_LOCKS #define wait_atomic_check \ @@ -53,6 +56,8 @@ #define wait_atomic_check #endif +#define DEFAULT_TRY_TIMES 8 + typedef struct { uint32_t complete; struct work work; @@ -157,4 +162,27 @@ static inline void wait_delay(uint64_t number_of_clks) idelay(PLATFORM_DEFAULT_DELAY); } +static inline int poll_for_completion_delay(completion_t *comp, uint64_t us) +{ + uint64_t tick = clock_us_to_ticks(CLK_CPU, us); + uint32_t tries = DEFAULT_TRY_TIMES; + uint64_t delta = tick / tries; + + if (!delta) { + delta = us; + tries = 1; + } + + while (!wait_is_completed(comp)) { + if (!tries--) { + trace_error(TRACE_CLASS_WAIT, "ewt"); + return -EIO; + } + + wait_delay(delta); + } + + return 0; +} + #endif diff --git a/src/ipc/ipc.c b/src/ipc/ipc.c index 25d4471c6543..ae11827dd578 100644 --- a/src/ipc/ipc.c +++ b/src/ipc/ipc.c @@ -501,8 +501,9 @@ int ipc_get_page_descriptors(struct dma *dmac, uint8_t *page_table, } /* wait for DMA to complete */ - complete.timeout = PLATFORM_HOST_DMA_TIMEOUT; - ret = wait_for_completion_timeout(&complete); + ret = poll_for_completion_delay(&complete, PLATFORM_DMA_TIMEOUT); + if (ret < 0) + trace_ipc_error("eDt"); /* compressed page tables now in buffer at _ipc->page_table */ out: