Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.1.
  1/* SPDX-License-Identifier: GPL-2.0-only OR MIT */
  2/* Copyright (c) 2023 Imagination Technologies Ltd. */
  3
  4#ifndef PVR_FW_INFO_H
  5#define PVR_FW_INFO_H
  6
  7#include <linux/bits.h>
  8#include <linux/sizes.h>
  9#include <linux/types.h>
 10
 11/*
 12 * Firmware binary block unit in bytes.
 13 * Raw data stored in FW binary will be aligned to this size.
 14 */
 15#define FW_BLOCK_SIZE SZ_4K
 16
 17/* Maximum number of entries in firmware layout table. */
 18#define PVR_FW_INFO_MAX_NUM_ENTRIES 8
 19
 20enum pvr_fw_section_id {
 21	META_CODE = 0,
 22	META_PRIVATE_DATA,
 23	META_COREMEM_CODE,
 24	META_COREMEM_DATA,
 25	MIPS_CODE,
 26	MIPS_EXCEPTIONS_CODE,
 27	MIPS_BOOT_CODE,
 28	MIPS_PRIVATE_DATA,
 29	MIPS_BOOT_DATA,
 30	MIPS_STACK,
 31	RISCV_UNCACHED_CODE,
 32	RISCV_CACHED_CODE,
 33	RISCV_PRIVATE_DATA,
 34	RISCV_COREMEM_CODE,
 35	RISCV_COREMEM_DATA,
 36};
 37
 38enum pvr_fw_section_type {
 39	NONE = 0,
 40	FW_CODE,
 41	FW_DATA,
 42	FW_COREMEM_CODE,
 43	FW_COREMEM_DATA,
 44};
 45
 46/*
 47 * FW binary format with FW info attached:
 48 *
 49 *          Contents        Offset
 50 *     +-----------------+
 51 *     |                 |    0
 52 *     |                 |
 53 *     | Original binary |
 54 *     |      file       |
 55 *     |   (.ldr/.elf)   |
 56 *     |                 |
 57 *     |                 |
 58 *     +-----------------+
 59 *     |   Device info   |  FILE_SIZE - 4K - device_info_size
 60 *     +-----------------+
 61 *     | FW info header  |  FILE_SIZE - 4K
 62 *     +-----------------+
 63 *     |                 |
 64 *     | FW layout table |
 65 *     |                 |
 66 *     +-----------------+
 67 *                          FILE_SIZE
 68 */
 69
 70#define PVR_FW_INFO_VERSION 3
 71
 72#define PVR_FW_FLAGS_OPEN_SOURCE BIT(0)
 73
 74/** struct pvr_fw_info_header - Firmware header */
 75struct pvr_fw_info_header {
 76	/** @info_version: FW info header version. */
 77	u32 info_version;
 78	/** @header_len: Header length. */
 79	u32 header_len;
 80	/** @layout_entry_num: Number of entries in the layout table. */
 81	u32 layout_entry_num;
 82	/** @layout_entry_size: Size of an entry in the layout table. */
 83	u32 layout_entry_size;
 84	/** @bvnc: GPU ID supported by firmware. */
 85	aligned_u64 bvnc;
 86	/** @fw_page_size: Page size of processor on which firmware executes. */
 87	u32 fw_page_size;
 88	/** @flags: Compatibility flags. */
 89	u32 flags;
 90	/** @fw_version_major: Firmware major version number. */
 91	u16 fw_version_major;
 92	/** @fw_version_minor: Firmware minor version number. */
 93	u16 fw_version_minor;
 94	/** @fw_version_build: Firmware build number. */
 95	u32 fw_version_build;
 96	/** @device_info_size: Size of device info structure. */
 97	u32 device_info_size;
 98	/** @padding: Padding. */
 99	u32 padding;
100};
101
102/**
103 * struct pvr_fw_layout_entry - Entry in firmware layout table, describing a
104 *                              section of the firmware image
105 */
106struct pvr_fw_layout_entry {
107	/** @id: Section ID. */
108	enum pvr_fw_section_id id;
109	/** @type: Section type. */
110	enum pvr_fw_section_type type;
111	/** @base_addr: Base address of section in FW address space. */
112	u32 base_addr;
113	/** @max_size: Maximum size of section, in bytes. */
114	u32 max_size;
115	/** @alloc_size: Allocation size of section, in bytes. */
116	u32 alloc_size;
117	/** @alloc_offset: Allocation offset of section. */
118	u32 alloc_offset;
119};
120
121/**
122 * struct pvr_fw_device_info_header - Device information header.
123 */
124struct pvr_fw_device_info_header {
125	/** @brn_mask_size: BRN mask size (in u64s). */
126	u64 brn_mask_size;
127	/** @ern_mask_size: ERN mask size (in u64s). */
128	u64 ern_mask_size;
129	/** @feature_mask_size: Feature mask size (in u64s). */
130	u64 feature_mask_size;
131	/** @feature_param_size: Feature parameter size (in u64s). */
132	u64 feature_param_size;
133};
134
135#endif /* PVR_FW_INFO_H */