122dcda45SBen Skeggs #ifndef __NVFW_ACR_H__
222dcda45SBen Skeggs #define __NVFW_ACR_H__
322dcda45SBen Skeggs 
422dcda45SBen Skeggs struct wpr_header {
522dcda45SBen Skeggs #define WPR_HEADER_V0_FALCON_ID_INVALID                              0xffffffff
622dcda45SBen Skeggs 	u32 falcon_id;
722dcda45SBen Skeggs 	u32 lsb_offset;
822dcda45SBen Skeggs 	u32 bootstrap_owner;
922dcda45SBen Skeggs 	u32 lazy_bootstrap;
1022dcda45SBen Skeggs #define WPR_HEADER_V0_STATUS_NONE                                             0
1122dcda45SBen Skeggs #define WPR_HEADER_V0_STATUS_COPY                                             1
1222dcda45SBen Skeggs #define WPR_HEADER_V0_STATUS_VALIDATION_CODE_FAILED                           2
1322dcda45SBen Skeggs #define WPR_HEADER_V0_STATUS_VALIDATION_DATA_FAILED                           3
1422dcda45SBen Skeggs #define WPR_HEADER_V0_STATUS_VALIDATION_DONE                                  4
1522dcda45SBen Skeggs #define WPR_HEADER_V0_STATUS_VALIDATION_SKIPPED                               5
1622dcda45SBen Skeggs #define WPR_HEADER_V0_STATUS_BOOTSTRAP_READY                                  6
1722dcda45SBen Skeggs 	u32 status;
1822dcda45SBen Skeggs };
1922dcda45SBen Skeggs 
2022dcda45SBen Skeggs void wpr_header_dump(struct nvkm_subdev *, const struct wpr_header *);
2122dcda45SBen Skeggs 
2222dcda45SBen Skeggs struct wpr_header_v1 {
2322dcda45SBen Skeggs #define WPR_HEADER_V1_FALCON_ID_INVALID                              0xffffffff
2422dcda45SBen Skeggs 	u32 falcon_id;
2522dcda45SBen Skeggs 	u32 lsb_offset;
2622dcda45SBen Skeggs 	u32 bootstrap_owner;
2722dcda45SBen Skeggs 	u32 lazy_bootstrap;
2822dcda45SBen Skeggs 	u32 bin_version;
2922dcda45SBen Skeggs #define WPR_HEADER_V1_STATUS_NONE                                             0
3022dcda45SBen Skeggs #define WPR_HEADER_V1_STATUS_COPY                                             1
3122dcda45SBen Skeggs #define WPR_HEADER_V1_STATUS_VALIDATION_CODE_FAILED                           2
3222dcda45SBen Skeggs #define WPR_HEADER_V1_STATUS_VALIDATION_DATA_FAILED                           3
3322dcda45SBen Skeggs #define WPR_HEADER_V1_STATUS_VALIDATION_DONE                                  4
3422dcda45SBen Skeggs #define WPR_HEADER_V1_STATUS_VALIDATION_SKIPPED                               5
3522dcda45SBen Skeggs #define WPR_HEADER_V1_STATUS_BOOTSTRAP_READY                                  6
3622dcda45SBen Skeggs #define WPR_HEADER_V1_STATUS_REVOCATION_CHECK_FAILED                          7
3722dcda45SBen Skeggs 	u32 status;
3822dcda45SBen Skeggs };
3922dcda45SBen Skeggs 
4022dcda45SBen Skeggs void wpr_header_v1_dump(struct nvkm_subdev *, const struct wpr_header_v1 *);
4122dcda45SBen Skeggs 
42*4b569dedSBen Skeggs struct wpr_generic_header {
43*4b569dedSBen Skeggs #define WPR_GENERIC_HEADER_ID_LSF_UCODE_DESC     1
44*4b569dedSBen Skeggs #define WPR_GENERIC_HEADER_ID_LSF_WPR_HEADER     2
45*4b569dedSBen Skeggs #define WPR_GENERIC_HEADER_ID_LSF_SHARED_SUB_WPR 3
46*4b569dedSBen Skeggs #define WPR_GENERIC_HEADER_ID_LSF_LSB_HEADER     4
47*4b569dedSBen Skeggs 	u16 identifier;
48*4b569dedSBen Skeggs 	u16 version;
49*4b569dedSBen Skeggs 	u32 size;
50*4b569dedSBen Skeggs };
51*4b569dedSBen Skeggs 
52*4b569dedSBen Skeggs struct wpr_header_v2 {
53*4b569dedSBen Skeggs 	struct wpr_generic_header hdr;
54*4b569dedSBen Skeggs 	struct wpr_header_v1 wpr;
55*4b569dedSBen Skeggs };
56*4b569dedSBen Skeggs 
57*4b569dedSBen Skeggs void wpr_header_v2_dump(struct nvkm_subdev *, const struct wpr_header_v2 *);
58*4b569dedSBen Skeggs 
5922dcda45SBen Skeggs struct lsf_signature {
6022dcda45SBen Skeggs 	u8 prd_keys[2][16];
6122dcda45SBen Skeggs 	u8 dbg_keys[2][16];
6222dcda45SBen Skeggs 	u32 b_prd_present;
6322dcda45SBen Skeggs 	u32 b_dbg_present;
6422dcda45SBen Skeggs 	u32 falcon_id;
6522dcda45SBen Skeggs };
6622dcda45SBen Skeggs 
6722dcda45SBen Skeggs struct lsf_signature_v1 {
6822dcda45SBen Skeggs 	u8 prd_keys[2][16];
6922dcda45SBen Skeggs 	u8 dbg_keys[2][16];
7022dcda45SBen Skeggs 	u32 b_prd_present;
7122dcda45SBen Skeggs 	u32 b_dbg_present;
7222dcda45SBen Skeggs 	u32 falcon_id;
7322dcda45SBen Skeggs 	u32 supports_versioning;
7422dcda45SBen Skeggs 	u32 version;
7522dcda45SBen Skeggs 	u32 depmap_count;
7622dcda45SBen Skeggs 	u8 depmap[11/*LSF_LSB_DEPMAP_SIZE*/ * 2 * 4];
7722dcda45SBen Skeggs 	u8 kdf[16];
7822dcda45SBen Skeggs };
7922dcda45SBen Skeggs 
8022dcda45SBen Skeggs struct lsb_header_tail {
8122dcda45SBen Skeggs 	u32 ucode_off;
8222dcda45SBen Skeggs 	u32 ucode_size;
8322dcda45SBen Skeggs 	u32 data_size;
8422dcda45SBen Skeggs 	u32 bl_code_size;
8522dcda45SBen Skeggs 	u32 bl_imem_off;
8622dcda45SBen Skeggs 	u32 bl_data_off;
8722dcda45SBen Skeggs 	u32 bl_data_size;
8822dcda45SBen Skeggs 	u32 app_code_off;
8922dcda45SBen Skeggs 	u32 app_code_size;
9022dcda45SBen Skeggs 	u32 app_data_off;
9122dcda45SBen Skeggs 	u32 app_data_size;
9222dcda45SBen Skeggs 	u32 flags;
9322dcda45SBen Skeggs };
9422dcda45SBen Skeggs 
9522dcda45SBen Skeggs struct lsb_header {
9622dcda45SBen Skeggs 	struct lsf_signature signature;
9722dcda45SBen Skeggs 	struct lsb_header_tail tail;
9822dcda45SBen Skeggs };
9922dcda45SBen Skeggs 
10022dcda45SBen Skeggs void lsb_header_dump(struct nvkm_subdev *, struct lsb_header *);
10122dcda45SBen Skeggs 
10222dcda45SBen Skeggs struct lsb_header_v1 {
10322dcda45SBen Skeggs 	struct lsf_signature_v1 signature;
10422dcda45SBen Skeggs 	struct lsb_header_tail tail;
10522dcda45SBen Skeggs };
10622dcda45SBen Skeggs 
10722dcda45SBen Skeggs void lsb_header_v1_dump(struct nvkm_subdev *, struct lsb_header_v1 *);
10822dcda45SBen Skeggs 
109*4b569dedSBen Skeggs struct lsb_header_v2 {
110*4b569dedSBen Skeggs 	struct wpr_generic_header hdr;
111*4b569dedSBen Skeggs 	struct lsf_signature_v2 {
112*4b569dedSBen Skeggs 		struct wpr_generic_header hdr;
113*4b569dedSBen Skeggs 		u32 falcon_id;
114*4b569dedSBen Skeggs 		u8 prd_present;
115*4b569dedSBen Skeggs 		u8 dbg_present;
116*4b569dedSBen Skeggs 		u16 reserved;
117*4b569dedSBen Skeggs 		u32 sig_size;
118*4b569dedSBen Skeggs 		u8 prod_sig[2][384 + 128];
119*4b569dedSBen Skeggs 		u8 debug_sig[2][384 + 128];
120*4b569dedSBen Skeggs 		u16 sig_algo_ver;
121*4b569dedSBen Skeggs 		u16 sig_algo;
122*4b569dedSBen Skeggs 		u16 hash_algo_ver;
123*4b569dedSBen Skeggs 		u16 hash_algo;
124*4b569dedSBen Skeggs 		u32 sig_algo_padding_type;
125*4b569dedSBen Skeggs 		u8 depmap[11 * 2 * 4];
126*4b569dedSBen Skeggs 		u32 depmap_count;
127*4b569dedSBen Skeggs 		u8 supports_versioning;
128*4b569dedSBen Skeggs 		u8 pad[3];
129*4b569dedSBen Skeggs 		u32 ls_ucode_version;
130*4b569dedSBen Skeggs 		u32 ls_ucode_id;
131*4b569dedSBen Skeggs 		u32 ucode_ls_encrypted;
132*4b569dedSBen Skeggs 		u32 ls_eng_algo_type;
133*4b569dedSBen Skeggs 		u32 ls_eng_algo_ver;
134*4b569dedSBen Skeggs 		u8 ls_enc_iv[16];
135*4b569dedSBen Skeggs 		u8 rsvd[36];
136*4b569dedSBen Skeggs 	} signature;
137*4b569dedSBen Skeggs 	u32 ucode_off;
138*4b569dedSBen Skeggs 	u32 ucode_size;
139*4b569dedSBen Skeggs 	u32 data_size;
140*4b569dedSBen Skeggs 	u32 bl_code_size;
141*4b569dedSBen Skeggs 	u32 bl_imem_off;
142*4b569dedSBen Skeggs 	u32 bl_data_off;
143*4b569dedSBen Skeggs 	u32 bl_data_size;
144*4b569dedSBen Skeggs 	u32 rsvd0;
145*4b569dedSBen Skeggs 	u32 app_code_off;
146*4b569dedSBen Skeggs 	u32 app_code_size;
147*4b569dedSBen Skeggs 	u32 app_data_off;
148*4b569dedSBen Skeggs 	u32 app_data_size;
149*4b569dedSBen Skeggs 	u32 app_imem_offset;
150*4b569dedSBen Skeggs 	u32 app_dmem_offset;
151*4b569dedSBen Skeggs 	u32 flags;
152*4b569dedSBen Skeggs 	u32 monitor_code_offset;
153*4b569dedSBen Skeggs 	u32 monitor_data_offset;
154*4b569dedSBen Skeggs 	u32 manifest_offset;
155*4b569dedSBen Skeggs 	struct hs_fmc_params {
156*4b569dedSBen Skeggs 		u8 hs_fmc;
157*4b569dedSBen Skeggs 		u8 padding[3];
158*4b569dedSBen Skeggs 		u16 pkc_algo;
159*4b569dedSBen Skeggs 		u16 pkc_algo_version;
160*4b569dedSBen Skeggs 		u32 engid_mask;
161*4b569dedSBen Skeggs 		u32 ucode_id;
162*4b569dedSBen Skeggs 		u32 fuse_ver;
163*4b569dedSBen Skeggs 		u8 pkc_signature[384 + 128];
164*4b569dedSBen Skeggs 		u8 pkc_key[2048];
165*4b569dedSBen Skeggs 		u8 rsvd[4];
166*4b569dedSBen Skeggs 	} hs_fmc_params;
167*4b569dedSBen Skeggs 	struct hs_ovl_sig_blob_params {
168*4b569dedSBen Skeggs 		u8 hs_ovl_sig_blob_present;
169*4b569dedSBen Skeggs 		u32 hs_ovl_sig_blob_offset;
170*4b569dedSBen Skeggs 		u32 hs_ovl_sig_blob_size;
171*4b569dedSBen Skeggs 	} hs_ovl_sig_blob_params;
172*4b569dedSBen Skeggs 	u8 rsvd[20];
173*4b569dedSBen Skeggs };
174*4b569dedSBen Skeggs 
175*4b569dedSBen Skeggs void lsb_header_v2_dump(struct nvkm_subdev *, struct lsb_header_v2 *);
176*4b569dedSBen Skeggs 
17722dcda45SBen Skeggs struct flcn_acr_desc {
17822dcda45SBen Skeggs 	union {
17922dcda45SBen Skeggs 		u8 reserved_dmem[0x200];
18022dcda45SBen Skeggs 		u32 signatures[4];
18122dcda45SBen Skeggs 	} ucode_reserved_space;
18222dcda45SBen Skeggs 	u32 wpr_region_id;
18322dcda45SBen Skeggs 	u32 wpr_offset;
18422dcda45SBen Skeggs 	u32 mmu_mem_range;
18522dcda45SBen Skeggs 	struct {
18622dcda45SBen Skeggs 		u32 no_regions;
18722dcda45SBen Skeggs 		struct {
18822dcda45SBen Skeggs 			u32 start_addr;
18922dcda45SBen Skeggs 			u32 end_addr;
19022dcda45SBen Skeggs 			u32 region_id;
19122dcda45SBen Skeggs 			u32 read_mask;
19222dcda45SBen Skeggs 			u32 write_mask;
19322dcda45SBen Skeggs 			u32 client_mask;
19422dcda45SBen Skeggs 		} region_props[2];
19522dcda45SBen Skeggs 	} regions;
19622dcda45SBen Skeggs 	u32 ucode_blob_size;
19722dcda45SBen Skeggs 	u64 ucode_blob_base __aligned(8);
19822dcda45SBen Skeggs 	struct {
19922dcda45SBen Skeggs 		u32 vpr_enabled;
20022dcda45SBen Skeggs 		u32 vpr_start;
20122dcda45SBen Skeggs 		u32 vpr_end;
20222dcda45SBen Skeggs 		u32 hdcp_policies;
20322dcda45SBen Skeggs 	} vpr_desc;
20422dcda45SBen Skeggs };
20522dcda45SBen Skeggs 
20622dcda45SBen Skeggs void flcn_acr_desc_dump(struct nvkm_subdev *, struct flcn_acr_desc *);
20722dcda45SBen Skeggs 
20822dcda45SBen Skeggs struct flcn_acr_desc_v1 {
20922dcda45SBen Skeggs 	u8 reserved_dmem[0x200];
21022dcda45SBen Skeggs 	u32 signatures[4];
21122dcda45SBen Skeggs 	u32 wpr_region_id;
21222dcda45SBen Skeggs 	u32 wpr_offset;
21322dcda45SBen Skeggs 	u32 mmu_memory_range;
21422dcda45SBen Skeggs 	struct {
21522dcda45SBen Skeggs 		u32 no_regions;
21622dcda45SBen Skeggs 		struct {
21722dcda45SBen Skeggs 			u32 start_addr;
21822dcda45SBen Skeggs 			u32 end_addr;
21922dcda45SBen Skeggs 			u32 region_id;
22022dcda45SBen Skeggs 			u32 read_mask;
22122dcda45SBen Skeggs 			u32 write_mask;
22222dcda45SBen Skeggs 			u32 client_mask;
22322dcda45SBen Skeggs 			u32 shadow_mem_start_addr;
22422dcda45SBen Skeggs 		} region_props[2];
22522dcda45SBen Skeggs 	} regions;
22622dcda45SBen Skeggs 	u32 ucode_blob_size;
22722dcda45SBen Skeggs 	u64 ucode_blob_base __aligned(8);
22822dcda45SBen Skeggs 	struct {
22922dcda45SBen Skeggs 		u32 vpr_enabled;
23022dcda45SBen Skeggs 		u32 vpr_start;
23122dcda45SBen Skeggs 		u32 vpr_end;
23222dcda45SBen Skeggs 		u32 hdcp_policies;
23322dcda45SBen Skeggs 	} vpr_desc;
23422dcda45SBen Skeggs };
23522dcda45SBen Skeggs 
23622dcda45SBen Skeggs void flcn_acr_desc_v1_dump(struct nvkm_subdev *, struct flcn_acr_desc_v1 *);
23722dcda45SBen Skeggs #endif
238