1/* SPDX-License-Identifier: MIT */
2/*
3 * Copyright �� 2023 Intel Corporation
4 */
5
6#ifndef _INTEL_GSC_BINARY_HEADERS_H_
7#define _INTEL_GSC_BINARY_HEADERS_H_
8
9#include <linux/types.h>
10
11struct intel_gsc_version {
12	u16 major;
13	u16 minor;
14	u16 hotfix;
15	u16 build;
16} __packed;
17
18struct intel_gsc_partition {
19	u32 offset;
20	u32 size;
21} __packed;
22
23struct intel_gsc_layout_pointers {
24	u8 rom_bypass_vector[16];
25
26	/* size of pointers layout not including ROM bypass vector */
27	u16 size;
28
29	/*
30	 * bit0: Backup copy of layout pointers exist
31	 * bits1-15: reserved
32	 */
33	u8 flags;
34
35	u8 reserved;
36
37	u32 crc32;
38
39	struct intel_gsc_partition datap;
40	struct intel_gsc_partition boot1;
41	struct intel_gsc_partition boot2;
42	struct intel_gsc_partition boot3;
43	struct intel_gsc_partition boot4;
44	struct intel_gsc_partition boot5;
45	struct intel_gsc_partition temp_pages;
46} __packed;
47
48/* Boot partition structures */
49struct intel_gsc_bpdt_header {
50	u32 signature;
51#define INTEL_GSC_BPDT_HEADER_SIGNATURE 0x000055AA
52
53	u16 descriptor_count; /* num of entries after the header */
54
55	u8 version;
56	u8 configuration;
57
58	u32 crc32;
59
60	u32 build_version;
61	struct intel_gsc_version tool_version;
62} __packed;
63
64struct intel_gsc_bpdt_entry {
65	/*
66	 * Bits 0-15: BPDT entry type
67	 * Bits 16-17: reserved
68	 * Bit 18: code sub-partition
69	 * Bits 19-31: reserved
70	 */
71	u32 type;
72#define INTEL_GSC_BPDT_ENTRY_TYPE_MASK GENMASK(15, 0)
73#define INTEL_GSC_BPDT_ENTRY_TYPE_GSC_RBE 0x1
74
75	u32 sub_partition_offset; /* from the base of the BPDT header */
76	u32 sub_partition_size;
77} __packed;
78
79/* Code partition directory (CPD) structures */
80struct intel_gsc_cpd_header_v2 {
81	u32 header_marker;
82#define INTEL_GSC_CPD_HEADER_MARKER 0x44504324
83
84	u32 num_of_entries;
85	u8 header_version;
86	u8 entry_version;
87	u8 header_length; /* in bytes */
88	u8 flags;
89	u32 partition_name;
90	u32 crc32;
91} __packed;
92
93struct intel_gsc_cpd_entry {
94	u8 name[12];
95
96	/*
97	 * Bits 0-24: offset from the beginning of the code partition
98	 * Bit 25: huffman compressed
99	 * Bits 26-31: reserved
100	 */
101	u32 offset;
102#define INTEL_GSC_CPD_ENTRY_OFFSET_MASK GENMASK(24, 0)
103#define INTEL_GSC_CPD_ENTRY_HUFFMAN_COMP BIT(25)
104
105	/*
106	 * Module/Item length, in bytes. For Huffman-compressed modules, this
107	 * refers to the uncompressed size. For software-compressed modules,
108	 * this refers to the compressed size.
109	 */
110	u32 length;
111
112	u8 reserved[4];
113} __packed;
114
115struct intel_gsc_manifest_header {
116	u32 header_type; /* 0x4 for manifest type */
117	u32 header_length; /* in dwords */
118	u32 header_version;
119	u32 flags;
120	u32 vendor;
121	u32 date;
122	u32 size; /* In dwords, size of entire manifest (header + extensions) */
123	u32 header_id;
124	u32 internal_data;
125	struct intel_gsc_version fw_version;
126	u32 security_version;
127	struct intel_gsc_version meu_kit_version;
128	u32 meu_manifest_version;
129	u8 general_data[4];
130	u8 reserved3[56];
131	u32 modulus_size; /* in dwords */
132	u32 exponent_size; /* in dwords */
133} __packed;
134
135#endif
136