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/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/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 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/include/sof/panic.h b/src/include/sof/panic.h index 7c199393cdc0..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,23 +41,37 @@ #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; + 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); + + /* 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); @@ -68,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 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 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) 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 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) 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) {