root/sound/soc/sof/ipc4-telemetry.h
/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */
/*
 * This file is provided under a dual BSD/GPLv2 license.  When using or
 * redistributing this file, you may do so under either license.
 *
 * Copyright(c) 2023 Intel Corporation
 */

#ifndef __SOUND_SOC_SOF_IPC4_TELEMETRY_H
#define __SOUND_SOC_SOF_IPC4_TELEMETRY_H

/* Target code */
enum sof_ipc4_coredump_tgt_code {
        COREDUMP_TGT_UNKNOWN = 0,
        COREDUMP_TGT_X86,
        COREDUMP_TGT_X86_64,
        COREDUMP_TGT_ARM_CORTEX_M,
        COREDUMP_TGT_RISC_V,
        COREDUMP_TGT_XTENSA,
};

#define COREDUMP_ARCH_HDR_ID 'A'
#define COREDUMP_HDR_ID0 'Z'
#define COREDUMP_HDR_ID1 'E'

#define XTENSA_BLOCK_HDR_VER            2
#define XTENSA_CORE_DUMP_SEPARATOR      0x0DEC0DEB
#define XTENSA_CORE_AR_REGS_COUNT       16
#define XTENSA_SOC_INTEL_ADSP           3
#define XTENSA_TOOL_CHAIN_ZEPHYR        1
#define XTENSA_TOOL_CHAIN_XCC           2

/* Coredump header */
struct sof_ipc4_coredump_hdr {
        /* 'Z', 'E' as identifier of file */
        char id[2];

        /* Identify the version of the header */
        u16 hdr_version;

        /* Indicate which target (e.g. architecture or SoC) */
        u16 tgt_code;

        /* Size of uintptr_t in power of 2. (e.g. 5 for 32-bit, 6 for 64-bit) */
        u8 ptr_size_bits;

        u8 flag;

        /* Reason for the fatal error */
        u32 reason;
} __packed;

/* Architecture-specific block header */
struct sof_ipc4_coredump_arch_hdr {
        /* COREDUMP_ARCH_HDR_ID to indicate this is a architecture-specific block */
        char id;

        /* Identify the version of this block */
        u16 hdr_version;

        /* Number of bytes following the header */
        u16 num_bytes;
} __packed;

struct sof_ipc4_telemetry_slot_data {
        u32 separator;
        struct sof_ipc4_coredump_hdr hdr;
        struct sof_ipc4_coredump_arch_hdr arch_hdr;
        u32 arch_data[];
} __packed;

void sof_ipc4_create_exception_debugfs_node(struct snd_sof_dev *sdev);
#endif