[Sound-open-firmware] [PATCH] hsw: ipc: Fix IPC handler to align with logic on BYT

Liam Girdwood liam.r.girdwood at linux.intel.com
Mon Feb 26 12:38:59 CET 2018


Fix HSW handler so that it checks host_pending flag and aligns with
BYT IPC handler wrt trace messages.

Signed-off-by: Liam Girdwood <liam.r.girdwood at linux.intel.com>
---
 src/ipc/hsw-ipc.c | 20 +++++++++++++++-----
 1 file changed, 15 insertions(+), 5 deletions(-)

diff --git a/src/ipc/hsw-ipc.c b/src/ipc/hsw-ipc.c
index 6867be4..5f350c1 100644
--- a/src/ipc/hsw-ipc.c
+++ b/src/ipc/hsw-ipc.c
@@ -48,6 +48,7 @@
 #include <platform/platform.h>
 #include <reef/audio/component.h>
 #include <reef/audio/pipeline.h>
+#include <reef/panic.h>
 #include <uapi/ipc.h>
 #include <reef/intel-ipc.h>
 
@@ -85,7 +86,6 @@ out:
 	shim_write(SHIM_IMRD, shim_read(SHIM_IMRD) & ~SHIM_IMRD_DONE);
 }
 
-/* test code to check working IRQ */
 static void irq_handler(void *arg)
 {
 	uint32_t isr;
@@ -109,7 +109,11 @@ static void irq_handler(void *arg)
 		shim_write(SHIM_IMRD, shim_read(SHIM_IMRD) | SHIM_IMRD_BUSY);
 		interrupt_clear(PLATFORM_IPC_INTERUPT);
 
-		/* place message in Q and process later */
+		/* TODO: place message in Q and process later */
+		/* It's not Q ATM, may overwrite */
+		if (_ipc->host_pending)
+			trace_ipc_error("Pen");
+
 		_ipc->host_msg = shim_read(SHIM_IPCX);
 		_ipc->host_pending = 1;
 	}
@@ -139,6 +143,7 @@ void ipc_platform_do_cmd(struct ipc *ipc)
 	mailbox_hostbox_write(0, &reply, sizeof(reply));
 
 done:
+	ipc->host_pending = 0;
 
 	/* clear BUSY bit and set DONE bit - accept new messages */
 	ipcx = shim_read(SHIM_IPCX);
@@ -146,15 +151,19 @@ done:
 	ipcx |= SHIM_IPCX_DONE;
 	shim_write(SHIM_IPCX, ipcx);
 
+	/* unmask busy interrupt */
+	shim_write(SHIM_IMRD, shim_read(SHIM_IMRD) & ~SHIM_IMRD_BUSY);
+
 	// TODO: signal audio work to enter D3 in normal context
 	/* are we about to enter D3 ? */
 	if (iipc->pm_prepare_D3) {
-		while (1)
+		while (1) {
+			trace_ipc("pme");
 			wait_for_interrupt(0);
+		}
 	}
 
-	/* unmask busy interrupt */
-	shim_write(SHIM_IMRD, shim_read(SHIM_IMRD) & ~SHIM_IMRD_BUSY);
+	tracev_ipc("CmD");
 }
 
 void ipc_platform_send_msg(struct ipc *ipc)
@@ -205,6 +214,7 @@ int platform_ipc_init(struct ipc *ipc)
 	list_init(&ipc->empty_list);
 	list_init(&ipc->msg_list);
 	spinlock_init(&ipc->lock);
+
 	for (i = 0; i < MSG_QUEUE_SIZE; i++)
 		list_item_prepend(&ipc->message[i].list, &ipc->empty_list);
 
-- 
2.14.1



More information about the Sound-open-firmware mailing list