You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
194 lines
5.1 KiB
194 lines
5.1 KiB
/* |
|
* Copyright(c) 2017 Intel Corporation. All rights reserved. |
|
* |
|
* SPDX-License-Identifier: Apache-2.0 |
|
* |
|
* Author: Liam Girdwood <liam.r.girdwood@linux.intel.com> |
|
*/ |
|
|
|
#ifndef __INCLUDE_UAPI_USER_MANIFEST_H__ |
|
#define __INCLUDE_UAPI_USER_MANIFEST_H__ |
|
|
|
#include <stdint.h> |
|
|
|
/* start offset for base FW module */ |
|
#define SOF_MAN_ELF_TEXT_OFFSET 0x2000 |
|
|
|
/* FW Extended Manifest Header id = $AE1 */ |
|
#define SOF_MAN_EXT_HEADER_MAGIC 0x31454124 |
|
|
|
/* module type load type */ |
|
#define SOF_MAN_MOD_TYPE_BUILTIN 0 |
|
#define SOF_MAN_MOD_TYPE_MODULE 1 |
|
|
|
struct sof_man_module_type { |
|
uint32_t load_type:4; /* SOF_MAN_MOD_TYPE_ */ |
|
uint32_t auto_start:1; |
|
uint32_t domain_ll:1; |
|
uint32_t domain_dp:1; |
|
uint32_t lib_code:1; |
|
uint32_t rsvd_:24; |
|
}; |
|
|
|
/* segment flags.type */ |
|
#define SOF_MAN_SEGMENT_TEXT 0 |
|
#define SOF_MAN_SEGMENT_RODATA 1 |
|
#define SOF_MAN_SEGMENT_DATA 1 |
|
#define SOF_MAN_SEGMENT_BSS 2 |
|
#define SOF_MAN_SEGMENT_EMPTY 15 |
|
|
|
union sof_man_segment_flags { |
|
uint32_t ul; |
|
struct { |
|
uint32_t contents:1; |
|
uint32_t alloc:1; |
|
uint32_t load:1; |
|
uint32_t readonly:1; |
|
uint32_t code:1; |
|
uint32_t data:1; |
|
uint32_t _rsvd0:2; |
|
uint32_t type:4; /* MAN_SEGMENT_ */ |
|
uint32_t _rsvd1:4; |
|
uint32_t length:16; /* of segment in pages */ |
|
} r; |
|
} __attribute__((packed)); |
|
|
|
/* |
|
* Module segment descriptor. Used by ROM - Immutable. |
|
*/ |
|
struct sof_man_segment_desc { |
|
union sof_man_segment_flags flags; |
|
uint32_t v_base_addr; |
|
uint32_t file_offset; |
|
} __attribute__((packed)); |
|
|
|
/* |
|
* The firmware binary can be split into several modules. |
|
*/ |
|
|
|
#define SOF_MAN_MOD_ID_LEN 4 |
|
#define SOF_MAN_MOD_NAME_LEN 8 |
|
#define SOF_MAN_MOD_SHA256_LEN 32 |
|
#define SOF_MAN_MOD_ID {'$', 'A', 'M', 'E'} |
|
|
|
/* |
|
* Each module has an entry in the FW header. Used by ROM - Immutable. |
|
*/ |
|
struct sof_man_module { |
|
uint8_t struct_id[SOF_MAN_MOD_ID_LEN]; /* SOF_MAN_MOD_ID */ |
|
uint8_t name[SOF_MAN_MOD_NAME_LEN]; |
|
uint8_t uuid[16]; |
|
struct sof_man_module_type type; |
|
uint8_t hash[SOF_MAN_MOD_SHA256_LEN]; |
|
uint32_t entry_point; |
|
uint16_t cfg_offset; |
|
uint16_t cfg_count; |
|
uint32_t affinity_mask; |
|
uint16_t instance_max_count; /* max number of instances */ |
|
uint16_t instance_bss_size; /* instance (pages) */ |
|
struct sof_man_segment_desc segment[3]; |
|
} __attribute__((packed)); |
|
|
|
/* |
|
* Each module has a configuration in the FW header. Used by ROM - Immutable. |
|
*/ |
|
struct sof_man_mod_config { |
|
uint32_t par[4]; /* module parameters */ |
|
uint32_t is_pages; /* actual size of instance .bss (pages) */ |
|
uint32_t cps; /* cycles per second */ |
|
uint32_t ibs; /* input buffer size (bytes) */ |
|
uint32_t obs; /* output buffer size (bytes) */ |
|
uint32_t module_flags; /* flags, reserved for future use */ |
|
uint32_t cpc; /* cycles per single run */ |
|
uint32_t obls; /* output block size, reserved for future use */ |
|
} __attribute__((packed)); |
|
|
|
/* |
|
* FW Manifest Header |
|
*/ |
|
|
|
#define SOF_MAN_FW_HDR_FW_NAME_LEN 8 |
|
#define SOF_MAN_FW_HDR_ID {'$', 'A', 'M', '1'} |
|
#define SOF_MAN_FW_HDR_NAME "ADSPFW" |
|
#define SOF_MAN_FW_HDR_FLAGS 0x0 |
|
#define SOF_MAN_FW_HDR_FEATURES 0x1ff |
|
|
|
/* |
|
* The firmware has a standard header that is checked by the ROM on firmware |
|
* loading. preload_page_count is used by DMA code loader and is entire |
|
* image size on CNL. i.e. CNL: total size of the binary’s .text and .rodata |
|
* Used by ROM - Immutable. |
|
*/ |
|
struct sof_man_fw_header { |
|
uint8_t header_id[4]; |
|
uint32_t header_len; |
|
uint8_t name[SOF_MAN_FW_HDR_FW_NAME_LEN]; |
|
/* number of pages of preloaded image loaded by driver */ |
|
uint32_t preload_page_count; |
|
uint32_t fw_image_flags; |
|
uint32_t feature_mask; |
|
uint16_t major_version; |
|
uint16_t minor_version; |
|
uint16_t hotfix_version; |
|
uint16_t build_version; |
|
uint32_t num_module_entries; |
|
uint32_t hw_buf_base_addr; |
|
uint32_t hw_buf_length; |
|
/* target address for binary loading as offset in IMR |
|
* must be == base offset |
|
*/ |
|
uint32_t load_offset; |
|
} __attribute__((packed)); |
|
|
|
/* |
|
* Firmware manifest descriptor. This can contain N modules and N module |
|
* configs. Used by ROM - Immutable. |
|
*/ |
|
struct sof_man_fw_desc { |
|
struct sof_man_fw_header header; |
|
|
|
/* Warning - hack for module arrays. For some unknown reason the we |
|
* have a variable size array of struct man_module followed by a |
|
* variable size array of struct mod_config. These should have been |
|
* merged into a variable array of a parent structure. We have to hack |
|
* around this in many places.... |
|
* |
|
* struct sof_man_module man_module[]; |
|
* struct sof_man_mod_config mod_config[]; |
|
*/ |
|
|
|
struct sof_man_module man_module[]; |
|
} __attribute__((packed)); |
|
|
|
/* |
|
* Component Descriptor. Used by ROM - Immutable. |
|
*/ |
|
struct sof_man_component_desc { |
|
uint32_t reserved[2]; /* all 0 */ |
|
uint32_t version; |
|
uint8_t hash[SOF_MAN_MOD_SHA256_LEN]; |
|
uint32_t base_offset; |
|
uint32_t limit_offset; |
|
uint32_t attributes[4]; |
|
} __attribute__((packed)); |
|
|
|
/* |
|
* Audio DSP extended metadata. Used by ROM - Immutable. |
|
*/ |
|
struct sof_man_adsp_meta_file_ext { |
|
uint32_t ext_type; /* always 17 for ADSP extension */ |
|
uint32_t ext_len; |
|
uint32_t imr_type; |
|
uint8_t reserved[16]; /* all 0 */ |
|
struct sof_man_component_desc comp_desc[1]; |
|
} __attribute__((packed)); |
|
|
|
/* |
|
* Module Manifest for rimage module metadata. Not used by ROM. |
|
*/ |
|
struct sof_man_module_manifest { |
|
struct sof_man_module module; |
|
uint32_t text_size; |
|
}; |
|
|
|
#endif
|
|
|