From c59d165f4f94d81785e69b61a7f68d458e78ea97 Mon Sep 17 00:00:00 2001 From: Pan Xiuli Date: Wed, 26 Sep 2018 15:47:53 +0800 Subject: [PATCH 1/8] panic: store register PS and dump it The register PS will always be changed due to the IRQ disable. Store the old PS and dump that value. Signed-off-by: Pan Xiuli --- src/arch/xtensa/include/arch/sof.h | 4 ++-- src/include/sof/panic.h | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/arch/xtensa/include/arch/sof.h b/src/arch/xtensa/include/arch/sof.h index abace8f01366..dc800d1d2c47 100644 --- a/src/arch/xtensa/include/arch/sof.h +++ b/src/arch/xtensa/include/arch/sof.h @@ -52,7 +52,7 @@ static inline void *arch_get_stack_ptr(void) return ptr; } -static inline void *arch_dump_regs(void) +static inline void *arch_dump_regs(uint32_t ps) { struct sof_ipc_dsp_oops_xtensa *x = (struct sof_ipc_dsp_oops_xtensa *) mailbox_get_exception_base(); @@ -62,7 +62,7 @@ static inline void *arch_dump_regs(void) /* Exception Vector address - 0x4 */ __asm__ __volatile__ ("rsr %0, EXCVADDR" : "=a" (x->excvaddr) : : "memory"); /* Exception Processor State - 0x8 */ - __asm__ __volatile__ ("rsr %0, PS" : "=a" (x->ps) : : "memory"); + x->ps = ps; /* Level 1 Exception PC - 0xc */ __asm__ __volatile__ ("rsr %0, EPC1" : "=a" (x->epc1) : : "memory"); /* Level 2 Exception PC - 0x10 */ diff --git a/src/include/sof/panic.h b/src/include/sof/panic.h index 7c199393cdc0..613737cfa441 100644 --- a/src/include/sof/panic.h +++ b/src/include/sof/panic.h @@ -45,12 +45,14 @@ static inline void panic_rewind(uint32_t p, uint32_t stack_rewind_frames) { void *ext_offset; size_t count; + uint32_t oldps; /* disable all IRQs */ - interrupt_global_disable(); + oldps = interrupt_global_disable(); /* dump DSP core registers */ - ext_offset = arch_dump_regs(); + ext_offset = arch_dump_regs(oldps); + count = MAILBOX_EXCEPTION_SIZE - (size_t)(ext_offset - mailbox_get_exception_base()); From a848c5c5209619ad3fa34a0eac851c6aa1c4c874 Mon Sep 17 00:00:00 2001 From: Pan Xiuli Date: Wed, 26 Sep 2018 15:53:27 +0800 Subject: [PATCH 2/8] alloc: fix some build issues in alloc Include dma.h in alloc.h will cause some error, remove the unneeded dma.h and add some need header after remove it. Also move some helper function into alloc.c to avoid some warnings. Signed-off-by: Pan Xiuli --- src/include/sof/alloc.h | 13 +++++-------- src/lib/alloc.c | 8 ++++++++ 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/include/sof/alloc.h b/src/include/sof/alloc.h index 13e834bd687f..fdb521b5c90d 100644 --- a/src/include/sof/alloc.h +++ b/src/include/sof/alloc.h @@ -35,8 +35,9 @@ #include #include #include -#include +#include #include +#include struct sof; @@ -66,6 +67,9 @@ struct sof; #define RZONE_TYPE_MASK 0xf #define RZONE_FLAG_MASK 0xf0 +struct dma_copy; +struct dma_sg_config; + struct mm_info { uint32_t used; uint32_t free; @@ -135,11 +139,4 @@ void init_heap(struct sof *sof); /* frees entire heap (supported for slave core system heap atm) */ void free_heap(int zone); -/* flush block map from cache to sram */ -static inline void flush_block_map(struct block_map *map) -{ - dcache_writeback_invalidate_region(map->block, - sizeof(*map->block) * map->count); - dcache_writeback_invalidate_region(map, sizeof(*map)); -} #endif diff --git a/src/lib/alloc.c b/src/lib/alloc.c index f2f9020f6205..e8198df9d5ec 100644 --- a/src/lib/alloc.c +++ b/src/lib/alloc.c @@ -71,6 +71,14 @@ extern struct mm memmap; */ +/* flush block map from cache to sram */ +static inline void flush_block_map(struct block_map *map) +{ + dcache_writeback_invalidate_region(map->block, + sizeof(*map->block) * map->count); + dcache_writeback_invalidate_region(map, sizeof(*map)); +} + /* total size of block */ static inline uint32_t block_get_size(struct block_map *map) { From 34312c08395cc821534275fe3bffebcd29a6a707 Mon Sep 17 00:00:00 2001 From: Pan Xiuli Date: Wed, 26 Sep 2018 15:55:44 +0800 Subject: [PATCH 3/8] clk: add missing header clk will use timer function, add timer.h include for it. Signed-off-by: Pan Xiuli --- src/drivers/intel/baytrail/clk.c | 1 + src/drivers/intel/cavs/clk.c | 1 + src/drivers/intel/haswell/clk.c | 1 + 3 files changed, 3 insertions(+) diff --git a/src/drivers/intel/baytrail/clk.c b/src/drivers/intel/baytrail/clk.c index b742ab44ca84..10e687b929a6 100644 --- a/src/drivers/intel/baytrail/clk.c +++ b/src/drivers/intel/baytrail/clk.c @@ -30,6 +30,7 @@ */ #include +#include #include #include #include diff --git a/src/drivers/intel/cavs/clk.c b/src/drivers/intel/cavs/clk.c index 5f147765e923..2d08558a0e8a 100644 --- a/src/drivers/intel/cavs/clk.c +++ b/src/drivers/intel/cavs/clk.c @@ -32,6 +32,7 @@ */ #include +#include #include #include #include diff --git a/src/drivers/intel/haswell/clk.c b/src/drivers/intel/haswell/clk.c index 0fc32ad7ba13..3fe15baba183 100644 --- a/src/drivers/intel/haswell/clk.c +++ b/src/drivers/intel/haswell/clk.c @@ -29,6 +29,7 @@ */ #include +#include #include #include #include From da2f2958a131af15978dbd943af8a59ff51aecaa Mon Sep 17 00:00:00 2001 From: Pan Xiuli Date: Wed, 26 Sep 2018 18:25:01 +0800 Subject: [PATCH 4/8] agent: add header for timer usage Signed-off-by: Pan Xiuli --- src/lib/agent.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lib/agent.c b/src/lib/agent.c index fc907408ca70..283aac63a2e5 100644 --- a/src/lib/agent.c +++ b/src/lib/agent.c @@ -44,6 +44,7 @@ #include #include #include +#include #define trace_sa(__e) trace_event_atomic(TRACE_CLASS_SA, __e) #define trace_sa_value(__e) trace_value_atomic(__e) From fda777c6f942c38474a30cdeacd7b22361cd4127 Mon Sep 17 00:00:00 2001 From: Pan Xiuli Date: Wed, 26 Sep 2018 18:41:50 +0800 Subject: [PATCH 5/8] pm: add header fix build Signed-off-by: Pan Xiuli --- src/include/sof/pm_runtime.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/include/sof/pm_runtime.h b/src/include/sof/pm_runtime.h index 166d89ecc9e5..b068cab35dd5 100644 --- a/src/include/sof/pm_runtime.h +++ b/src/include/sof/pm_runtime.h @@ -39,6 +39,7 @@ #include #include +#include /** \brief Power management trace function. */ #define trace_pm(__e) trace_event(TRACE_CLASS_POWER, __e) From aee5702bcbd4fb1fbc01ca67659584bb37a6cf17 Mon Sep 17 00:00:00 2001 From: Pan Xiuli Date: Wed, 26 Sep 2018 19:42:54 +0800 Subject: [PATCH 6/8] platform: fix build warning platform_panic is defined in platform/platform.h empty define in sof/platform.h is no use Signed-off-by: Pan Xiuli --- src/include/sof/platform.h | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/include/sof/platform.h b/src/include/sof/platform.h index dd9f3b65cc4c..ff1bd79469be 100644 --- a/src/include/sof/platform.h +++ b/src/include/sof/platform.h @@ -69,12 +69,6 @@ int platform_boot_complete(uint32_t boot_message); */ int platform_init(struct sof *sof); -/** - * \brief Called by the panic handler. - * \param[in] p Panic cause, one of SOF_IPC_PANIC_... codes (see ipc.h). - */ -static inline void platform_panic(uint32_t p); - /** @}*/ #endif From ed2ed1e877b8dd4063b71def29b9dd06ae437141 Mon Sep 17 00:00:00 2001 From: Pan Xiuli Date: Wed, 26 Sep 2018 18:42:37 +0800 Subject: [PATCH 7/8] uapi: ipc: add sof_ipc_panic_info Use sof_ipc_panic_info to store panic info inclueded filename and line number. Signed-off-by: Pan Xiuli --- src/include/uapi/ipc.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/include/uapi/ipc.h b/src/include/uapi/ipc.h index f5303a80e34a..38f8569427b1 100644 --- a/src/include/uapi/ipc.h +++ b/src/include/uapi/ipc.h @@ -1002,6 +1002,16 @@ struct sof_ipc_dsp_oops_xtensa { uint32_t stack; } __attribute__((packed)); +/* + * Commom debug + */ + +/* panic info include filename and line number */ +struct sof_ipc_panic_info { + char filename[32]; + uint32_t linenum; +} __attribute__((packed)); + /** @}*/ #endif From f3fc87aca2e76fd20700c1d9efbcef1d6f2a8679 Mon Sep 17 00:00:00 2001 From: Pan Xiuli Date: Wed, 26 Sep 2018 18:44:28 +0800 Subject: [PATCH 8/8] panic: add filename and line number into panic info Add filename and line number of the panic call into the panic info. Then dump this info to host. Signed-off-by: Pan Xiuli --- src/arch/xtensa/include/arch/init.h | 2 +- src/include/sof/panic.h | 35 ++++++++++++++++++++++++----- 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/src/arch/xtensa/include/arch/init.h b/src/arch/xtensa/include/arch/init.h index 3e018dee3a77..469d3c4a22f5 100644 --- a/src/arch/xtensa/include/arch/init.h +++ b/src/arch/xtensa/include/arch/init.h @@ -48,7 +48,7 @@ static inline void exception(void) { /* now panic and rewind 8 stack frames. */ /* TODO: we could invoke a GDB stub here */ - panic_rewind(SOF_IPC_PANIC_EXCEPTION, 8 * sizeof(uint32_t)); + panic_rewind(SOF_IPC_PANIC_EXCEPTION, 8 * sizeof(uint32_t), NULL); } /** diff --git a/src/include/sof/panic.h b/src/include/sof/panic.h index 613737cfa441..57687a940441 100644 --- a/src/include/sof/panic.h +++ b/src/include/sof/panic.h @@ -32,6 +32,7 @@ #define __INCLUDE_SOF_IPC_PANIC__ #include +#include #include #include #include @@ -40,8 +41,18 @@ #include #include +static inline void dump_panicinfo(void *addr, + struct sof_ipc_panic_info *panic_info) +{ + if (!panic_info) + return; + rmemcpy(addr, panic_info, sizeof(struct sof_ipc_panic_info)); + dcache_writeback_region(addr, sizeof(struct sof_ipc_panic_info)); +} + /* panic and rewind stack */ -static inline void panic_rewind(uint32_t p, uint32_t stack_rewind_frames) +static inline void panic_rewind(uint32_t p, uint32_t stack_rewind_frames, + struct sof_ipc_panic_info *panic_info) { void *ext_offset; size_t count; @@ -53,12 +64,14 @@ static inline void panic_rewind(uint32_t p, uint32_t stack_rewind_frames) /* dump DSP core registers */ ext_offset = arch_dump_regs(oldps); + /* dump panic info, filename ane linenum */ + dump_panicinfo(ext_offset, panic_info); + ext_offset += sizeof(struct sof_ipc_panic_info); + count = MAILBOX_EXCEPTION_SIZE - (size_t)(ext_offset - mailbox_get_exception_base()); - /* dump stack frames */ - p = dump_stack(p, ext_offset, stack_rewind_frames, - count * sizeof(uint32_t)); + p = dump_stack(p, ext_offset, stack_rewind_frames, count); /* panic - send IPC oops message to host */ platform_panic(p); @@ -70,9 +83,19 @@ static inline void panic_rewind(uint32_t p, uint32_t stack_rewind_frames) while (1) {}; } -static inline void panic(uint32_t p) +/* panic dump filename and linenumber of the call */ +#define panic(x) __panic((x), (__FILE__), (__LINE__)) + +static inline void __panic(uint32_t p, char *filename, uint32_t linenum) { - panic_rewind(p, 0); + struct sof_ipc_panic_info panicinfo; + int strlen; + + strlen = rstrlen(filename); + panicinfo.linenum = linenum; + rmemcpy(panicinfo.filename, filename, strlen + 1); + + panic_rewind(p, 0, &panicinfo); } #endif