Commit 14104eb6 authored by Kai Vehmanen's avatar Kai Vehmanen Committed by Mark Brown

ASoC: SOF: fix DSP oops definitions in FW ABI

The definitions for DSP oops structures were not aligned
correctly to current FW ABI version 3.6.0, leading to
invalid data being printed out to debug logs. Fix the structs
and update related platform code accordingly.
Signed-off-by: default avatarKai Vehmanen <kai.vehmanen@linux.intel.com>
Signed-off-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent d6947bb2
...@@ -155,6 +155,27 @@ struct sof_ipc_compound_hdr { ...@@ -155,6 +155,27 @@ struct sof_ipc_compound_hdr {
uint32_t count; /**< count of 0 means end of compound sequence */ uint32_t count; /**< count of 0 means end of compound sequence */
} __packed; } __packed;
/**
* OOPS header architecture specific data.
*/
struct sof_ipc_dsp_oops_arch_hdr {
uint32_t arch; /* Identifier of architecture */
uint32_t totalsize; /* Total size of oops message */
} __packed;
/**
* OOPS header platform specific data.
*/
struct sof_ipc_dsp_oops_plat_hdr {
uint32_t configidhi; /* ConfigID hi 32bits */
uint32_t configidlo; /* ConfigID lo 32bits */
uint32_t numaregs; /* Special regs num */
uint32_t stackoffset; /* Offset to stack pointer from beginning of
* oops message
*/
uint32_t stackptr; /* Stack ptr */
} __packed;
/** @}*/ /** @}*/
#endif #endif
...@@ -17,7 +17,8 @@ ...@@ -17,7 +17,8 @@
/* Xtensa Firmware Oops data */ /* Xtensa Firmware Oops data */
struct sof_ipc_dsp_oops_xtensa { struct sof_ipc_dsp_oops_xtensa {
struct sof_ipc_hdr hdr; struct sof_ipc_dsp_oops_arch_hdr arch_hdr;
struct sof_ipc_dsp_oops_plat_hdr plat_hdr;
uint32_t exccause; uint32_t exccause;
uint32_t excvaddr; uint32_t excvaddr;
uint32_t ps; uint32_t ps;
...@@ -38,7 +39,11 @@ struct sof_ipc_dsp_oops_xtensa { ...@@ -38,7 +39,11 @@ struct sof_ipc_dsp_oops_xtensa {
uint32_t intenable; uint32_t intenable;
uint32_t interrupt; uint32_t interrupt;
uint32_t sar; uint32_t sar;
uint32_t stack; uint32_t debugcause;
uint32_t windowbase;
uint32_t windowstart;
uint32_t excsave1;
uint32_t ar[];
} __packed; } __packed;
#endif #endif
...@@ -220,17 +220,20 @@ static void bdw_get_registers(struct snd_sof_dev *sdev, ...@@ -220,17 +220,20 @@ static void bdw_get_registers(struct snd_sof_dev *sdev,
struct sof_ipc_panic_info *panic_info, struct sof_ipc_panic_info *panic_info,
u32 *stack, size_t stack_words) u32 *stack, size_t stack_words)
{ {
/* first read regsisters */ u32 offset = sdev->dsp_oops_offset;
sof_mailbox_read(sdev, sdev->dsp_oops_offset, xoops, sizeof(*xoops));
/* first read registers */
sof_mailbox_read(sdev, offset, xoops, sizeof(*xoops));
/* note: variable AR register array is not read */
/* then get panic info */ /* then get panic info */
sof_mailbox_read(sdev, sdev->dsp_oops_offset + sizeof(*xoops), offset += xoops->arch_hdr.totalsize;
panic_info, sizeof(*panic_info)); sof_mailbox_read(sdev, offset, panic_info, sizeof(*panic_info));
/* then get the stack */ /* then get the stack */
sof_mailbox_read(sdev, sdev->dsp_oops_offset + sizeof(*xoops) + offset += sizeof(*panic_info);
sizeof(*panic_info), stack, sof_mailbox_read(sdev, offset, stack, stack_words * sizeof(u32));
stack_words * sizeof(u32));
} }
static void bdw_dump(struct snd_sof_dev *sdev, u32 flags) static void bdw_dump(struct snd_sof_dev *sdev, u32 flags)
......
...@@ -265,17 +265,20 @@ static void byt_get_registers(struct snd_sof_dev *sdev, ...@@ -265,17 +265,20 @@ static void byt_get_registers(struct snd_sof_dev *sdev,
struct sof_ipc_panic_info *panic_info, struct sof_ipc_panic_info *panic_info,
u32 *stack, size_t stack_words) u32 *stack, size_t stack_words)
{ {
u32 offset = sdev->dsp_oops_offset;
/* first read regsisters */ /* first read regsisters */
sof_mailbox_read(sdev, sdev->dsp_oops_offset, xoops, sizeof(*xoops)); sof_mailbox_read(sdev, offset, xoops, sizeof(*xoops));
/* note: variable AR register array is not read */
/* then get panic info */ /* then get panic info */
sof_mailbox_read(sdev, sdev->dsp_oops_offset + sizeof(*xoops), offset += xoops->arch_hdr.totalsize;
panic_info, sizeof(*panic_info)); sof_mailbox_read(sdev, offset, panic_info, sizeof(*panic_info));
/* then get the stack */ /* then get the stack */
sof_mailbox_read(sdev, sdev->dsp_oops_offset + sizeof(*xoops) + offset += sizeof(*panic_info);
sizeof(*panic_info), stack, sof_mailbox_read(sdev, offset, stack, stack_words * sizeof(u32));
stack_words * sizeof(u32));
} }
static void byt_dump(struct snd_sof_dev *sdev, u32 flags) static void byt_dump(struct snd_sof_dev *sdev, u32 flags)
......
...@@ -108,17 +108,21 @@ static void hda_dsp_get_registers(struct snd_sof_dev *sdev, ...@@ -108,17 +108,21 @@ static void hda_dsp_get_registers(struct snd_sof_dev *sdev,
struct sof_ipc_panic_info *panic_info, struct sof_ipc_panic_info *panic_info,
u32 *stack, size_t stack_words) u32 *stack, size_t stack_words)
{ {
u32 offset = sdev->dsp_oops_offset;
/* first read registers */ /* first read registers */
sof_block_read(sdev, sdev->mmio_bar, sdev->dsp_oops_offset, xoops, sof_mailbox_read(sdev, offset, xoops, sizeof(*xoops));
sizeof(*xoops));
/* note: variable AR register array is not read */
/* then get panic info */ /* then get panic info */
sof_block_read(sdev, sdev->mmio_bar, sdev->dsp_oops_offset + offset += xoops->arch_hdr.totalsize;
sizeof(*xoops), panic_info, sizeof(*panic_info)); sof_block_read(sdev, sdev->mmio_bar, offset,
panic_info, sizeof(*panic_info));
/* then get the stack */ /* then get the stack */
sof_block_read(sdev, sdev->mmio_bar, sdev->dsp_oops_offset + offset += sizeof(*panic_info);
sizeof(*xoops) + sizeof(*panic_info), stack, sof_block_read(sdev, sdev->mmio_bar, offset, stack,
stack_words * sizeof(u32)); stack_words * sizeof(u32));
} }
......
...@@ -110,7 +110,7 @@ static void xtensa_stack(struct snd_sof_dev *sdev, void *oops, u32 *stack, ...@@ -110,7 +110,7 @@ static void xtensa_stack(struct snd_sof_dev *sdev, void *oops, u32 *stack,
u32 stack_words) u32 stack_words)
{ {
struct sof_ipc_dsp_oops_xtensa *xoops = oops; struct sof_ipc_dsp_oops_xtensa *xoops = oops;
u32 stack_ptr = xoops->stack; u32 stack_ptr = xoops->plat_hdr.stackptr;
/* 4 * 8chars + 3 ws + 1 terminating NUL */ /* 4 * 8chars + 3 ws + 1 terminating NUL */
unsigned char buf[4 * 8 + 3 + 1]; unsigned char buf[4 * 8 + 3 + 1];
int i; int i;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment