| /* SPDX-License-Identifier: GPL-2.0-only OR MIT */ |
| /* Copyright (c) 2023 Imagination Technologies Ltd. */ |
| |
| #ifndef PVR_FW_INFO_H |
| #define PVR_FW_INFO_H |
| |
| #include <linux/bits.h> |
| #include <linux/sizes.h> |
| #include <linux/types.h> |
| |
| /* |
| * Firmware binary block unit in bytes. |
| * Raw data stored in FW binary will be aligned to this size. |
| */ |
| #define FW_BLOCK_SIZE SZ_4K |
| |
| /* Maximum number of entries in firmware layout table. */ |
| #define PVR_FW_INFO_MAX_NUM_ENTRIES 8 |
| |
| enum pvr_fw_section_id { |
| META_CODE = 0, |
| META_PRIVATE_DATA, |
| META_COREMEM_CODE, |
| META_COREMEM_DATA, |
| MIPS_CODE, |
| MIPS_EXCEPTIONS_CODE, |
| MIPS_BOOT_CODE, |
| MIPS_PRIVATE_DATA, |
| MIPS_BOOT_DATA, |
| MIPS_STACK, |
| RISCV_UNCACHED_CODE, |
| RISCV_CACHED_CODE, |
| RISCV_PRIVATE_DATA, |
| RISCV_COREMEM_CODE, |
| RISCV_COREMEM_DATA, |
| }; |
| |
| enum pvr_fw_section_type { |
| NONE = 0, |
| FW_CODE, |
| FW_DATA, |
| FW_COREMEM_CODE, |
| FW_COREMEM_DATA, |
| }; |
| |
| /* |
| * FW binary format with FW info attached: |
| * |
| * Contents Offset |
| * +-----------------+ |
| * | | 0 |
| * | | |
| * | Original binary | |
| * | file | |
| * | (.ldr/.elf) | |
| * | | |
| * | | |
| * +-----------------+ |
| * | Device info | FILE_SIZE - 4K - device_info_size |
| * +-----------------+ |
| * | FW info header | FILE_SIZE - 4K |
| * +-----------------+ |
| * | | |
| * | FW layout table | |
| * | | |
| * +-----------------+ |
| * FILE_SIZE |
| */ |
| |
| #define PVR_FW_INFO_VERSION 3 |
| |
| #define PVR_FW_FLAGS_OPEN_SOURCE BIT(0) |
| |
| /** struct pvr_fw_info_header - Firmware header */ |
| struct pvr_fw_info_header { |
| /** @info_version: FW info header version. */ |
| u32 info_version; |
| /** @header_len: Header length. */ |
| u32 header_len; |
| /** @layout_entry_num: Number of entries in the layout table. */ |
| u32 layout_entry_num; |
| /** @layout_entry_size: Size of an entry in the layout table. */ |
| u32 layout_entry_size; |
| /** @bvnc: GPU ID supported by firmware. */ |
| aligned_u64 bvnc; |
| /** @fw_page_size: Page size of processor on which firmware executes. */ |
| u32 fw_page_size; |
| /** @flags: Compatibility flags. */ |
| u32 flags; |
| /** @fw_version_major: Firmware major version number. */ |
| u16 fw_version_major; |
| /** @fw_version_minor: Firmware minor version number. */ |
| u16 fw_version_minor; |
| /** @fw_version_build: Firmware build number. */ |
| u32 fw_version_build; |
| /** @device_info_size: Size of device info structure. */ |
| u32 device_info_size; |
| /** @padding: Padding. */ |
| u32 padding; |
| }; |
| |
| /** |
| * struct pvr_fw_layout_entry - Entry in firmware layout table, describing a |
| * section of the firmware image |
| */ |
| struct pvr_fw_layout_entry { |
| /** @id: Section ID. */ |
| enum pvr_fw_section_id id; |
| /** @type: Section type. */ |
| enum pvr_fw_section_type type; |
| /** @base_addr: Base address of section in FW address space. */ |
| u32 base_addr; |
| /** @max_size: Maximum size of section, in bytes. */ |
| u32 max_size; |
| /** @alloc_size: Allocation size of section, in bytes. */ |
| u32 alloc_size; |
| /** @alloc_offset: Allocation offset of section. */ |
| u32 alloc_offset; |
| }; |
| |
| /** |
| * struct pvr_fw_device_info_header - Device information header. |
| */ |
| struct pvr_fw_device_info_header { |
| /** @brn_mask_size: BRN mask size (in u64s). */ |
| u64 brn_mask_size; |
| /** @ern_mask_size: ERN mask size (in u64s). */ |
| u64 ern_mask_size; |
| /** @feature_mask_size: Feature mask size (in u64s). */ |
| u64 feature_mask_size; |
| /** @feature_param_size: Feature parameter size (in u64s). */ |
| u64 feature_param_size; |
| }; |
| |
| #endif /* PVR_FW_INFO_H */ |