^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * This file is provided under a dual BSD/GPLv2 license. When using or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * redistributing this file, you may do so under either license.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Copyright(c) 2018 Intel Corporation. All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * Firmware file format .
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #ifndef __INCLUDE_UAPI_SOF_FW_H__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #define __INCLUDE_UAPI_SOF_FW_H__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #define SND_SOF_FW_SIG_SIZE 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #define SND_SOF_FW_ABI 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #define SND_SOF_FW_SIG "Reef"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) * Firmware module is made up of 1 . N blocks of different types. The
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) * Block header is used to determine where and how block is to be copied in the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) * DSP/host memory space.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) enum snd_sof_fw_blk_type {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) SOF_FW_BLK_TYPE_INVALID = -1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) SOF_FW_BLK_TYPE_START = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) SOF_FW_BLK_TYPE_RSRVD0 = SOF_FW_BLK_TYPE_START,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) SOF_FW_BLK_TYPE_IRAM = 1, /* local instruction RAM */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) SOF_FW_BLK_TYPE_DRAM = 2, /* local data RAM */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) SOF_FW_BLK_TYPE_SRAM = 3, /* system RAM */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) SOF_FW_BLK_TYPE_ROM = 4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) SOF_FW_BLK_TYPE_IMR = 5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) SOF_FW_BLK_TYPE_RSRVD6 = 6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) SOF_FW_BLK_TYPE_RSRVD7 = 7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) SOF_FW_BLK_TYPE_RSRVD8 = 8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) SOF_FW_BLK_TYPE_RSRVD9 = 9,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) SOF_FW_BLK_TYPE_RSRVD10 = 10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) SOF_FW_BLK_TYPE_RSRVD11 = 11,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) SOF_FW_BLK_TYPE_RSRVD12 = 12,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) SOF_FW_BLK_TYPE_RSRVD13 = 13,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) SOF_FW_BLK_TYPE_RSRVD14 = 14,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) /* use SOF_FW_BLK_TYPE_RSVRDX for new block types */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) SOF_FW_BLK_TYPE_NUM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) struct snd_sof_blk_hdr {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) enum snd_sof_fw_blk_type type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) __u32 size; /* bytes minus this header */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) __u32 offset; /* offset from base */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) * Firmware file is made up of 1 .. N different modules types. The module
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) * type is used to determine how to load and parse the module.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) enum snd_sof_fw_mod_type {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) SOF_FW_BASE = 0, /* base firmware image */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) SOF_FW_MODULE = 1, /* firmware module */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) struct snd_sof_mod_hdr {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) enum snd_sof_fw_mod_type type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) __u32 size; /* bytes minus this header */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) __u32 num_blocks; /* number of blocks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) * Firmware file header.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) struct snd_sof_fw_header {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) unsigned char sig[SND_SOF_FW_SIG_SIZE]; /* "Reef" */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) __u32 file_size; /* size of file minus this header */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) __u32 num_modules; /* number of modules */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) __u32 abi; /* version of header format */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) #endif