162306a36Sopenharmony_ci#ifndef __NVFW_ACR_H__
262306a36Sopenharmony_ci#define __NVFW_ACR_H__
362306a36Sopenharmony_ci
462306a36Sopenharmony_cistruct wpr_header {
562306a36Sopenharmony_ci#define WPR_HEADER_V0_FALCON_ID_INVALID                              0xffffffff
662306a36Sopenharmony_ci	u32 falcon_id;
762306a36Sopenharmony_ci	u32 lsb_offset;
862306a36Sopenharmony_ci	u32 bootstrap_owner;
962306a36Sopenharmony_ci	u32 lazy_bootstrap;
1062306a36Sopenharmony_ci#define WPR_HEADER_V0_STATUS_NONE                                             0
1162306a36Sopenharmony_ci#define WPR_HEADER_V0_STATUS_COPY                                             1
1262306a36Sopenharmony_ci#define WPR_HEADER_V0_STATUS_VALIDATION_CODE_FAILED                           2
1362306a36Sopenharmony_ci#define WPR_HEADER_V0_STATUS_VALIDATION_DATA_FAILED                           3
1462306a36Sopenharmony_ci#define WPR_HEADER_V0_STATUS_VALIDATION_DONE                                  4
1562306a36Sopenharmony_ci#define WPR_HEADER_V0_STATUS_VALIDATION_SKIPPED                               5
1662306a36Sopenharmony_ci#define WPR_HEADER_V0_STATUS_BOOTSTRAP_READY                                  6
1762306a36Sopenharmony_ci	u32 status;
1862306a36Sopenharmony_ci};
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_civoid wpr_header_dump(struct nvkm_subdev *, const struct wpr_header *);
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_cistruct wpr_header_v1 {
2362306a36Sopenharmony_ci#define WPR_HEADER_V1_FALCON_ID_INVALID                              0xffffffff
2462306a36Sopenharmony_ci	u32 falcon_id;
2562306a36Sopenharmony_ci	u32 lsb_offset;
2662306a36Sopenharmony_ci	u32 bootstrap_owner;
2762306a36Sopenharmony_ci	u32 lazy_bootstrap;
2862306a36Sopenharmony_ci	u32 bin_version;
2962306a36Sopenharmony_ci#define WPR_HEADER_V1_STATUS_NONE                                             0
3062306a36Sopenharmony_ci#define WPR_HEADER_V1_STATUS_COPY                                             1
3162306a36Sopenharmony_ci#define WPR_HEADER_V1_STATUS_VALIDATION_CODE_FAILED                           2
3262306a36Sopenharmony_ci#define WPR_HEADER_V1_STATUS_VALIDATION_DATA_FAILED                           3
3362306a36Sopenharmony_ci#define WPR_HEADER_V1_STATUS_VALIDATION_DONE                                  4
3462306a36Sopenharmony_ci#define WPR_HEADER_V1_STATUS_VALIDATION_SKIPPED                               5
3562306a36Sopenharmony_ci#define WPR_HEADER_V1_STATUS_BOOTSTRAP_READY                                  6
3662306a36Sopenharmony_ci#define WPR_HEADER_V1_STATUS_REVOCATION_CHECK_FAILED                          7
3762306a36Sopenharmony_ci	u32 status;
3862306a36Sopenharmony_ci};
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_civoid wpr_header_v1_dump(struct nvkm_subdev *, const struct wpr_header_v1 *);
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_cistruct wpr_generic_header {
4362306a36Sopenharmony_ci#define WPR_GENERIC_HEADER_ID_LSF_UCODE_DESC     1
4462306a36Sopenharmony_ci#define WPR_GENERIC_HEADER_ID_LSF_WPR_HEADER     2
4562306a36Sopenharmony_ci#define WPR_GENERIC_HEADER_ID_LSF_SHARED_SUB_WPR 3
4662306a36Sopenharmony_ci#define WPR_GENERIC_HEADER_ID_LSF_LSB_HEADER     4
4762306a36Sopenharmony_ci	u16 identifier;
4862306a36Sopenharmony_ci	u16 version;
4962306a36Sopenharmony_ci	u32 size;
5062306a36Sopenharmony_ci};
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_cistruct wpr_header_v2 {
5362306a36Sopenharmony_ci	struct wpr_generic_header hdr;
5462306a36Sopenharmony_ci	struct wpr_header_v1 wpr;
5562306a36Sopenharmony_ci};
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_civoid wpr_header_v2_dump(struct nvkm_subdev *, const struct wpr_header_v2 *);
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_cistruct lsf_signature {
6062306a36Sopenharmony_ci	u8 prd_keys[2][16];
6162306a36Sopenharmony_ci	u8 dbg_keys[2][16];
6262306a36Sopenharmony_ci	u32 b_prd_present;
6362306a36Sopenharmony_ci	u32 b_dbg_present;
6462306a36Sopenharmony_ci	u32 falcon_id;
6562306a36Sopenharmony_ci};
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_cistruct lsf_signature_v1 {
6862306a36Sopenharmony_ci	u8 prd_keys[2][16];
6962306a36Sopenharmony_ci	u8 dbg_keys[2][16];
7062306a36Sopenharmony_ci	u32 b_prd_present;
7162306a36Sopenharmony_ci	u32 b_dbg_present;
7262306a36Sopenharmony_ci	u32 falcon_id;
7362306a36Sopenharmony_ci	u32 supports_versioning;
7462306a36Sopenharmony_ci	u32 version;
7562306a36Sopenharmony_ci	u32 depmap_count;
7662306a36Sopenharmony_ci	u8 depmap[11/*LSF_LSB_DEPMAP_SIZE*/ * 2 * 4];
7762306a36Sopenharmony_ci	u8 kdf[16];
7862306a36Sopenharmony_ci};
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_cistruct lsb_header_tail {
8162306a36Sopenharmony_ci	u32 ucode_off;
8262306a36Sopenharmony_ci	u32 ucode_size;
8362306a36Sopenharmony_ci	u32 data_size;
8462306a36Sopenharmony_ci	u32 bl_code_size;
8562306a36Sopenharmony_ci	u32 bl_imem_off;
8662306a36Sopenharmony_ci	u32 bl_data_off;
8762306a36Sopenharmony_ci	u32 bl_data_size;
8862306a36Sopenharmony_ci	u32 app_code_off;
8962306a36Sopenharmony_ci	u32 app_code_size;
9062306a36Sopenharmony_ci	u32 app_data_off;
9162306a36Sopenharmony_ci	u32 app_data_size;
9262306a36Sopenharmony_ci	u32 flags;
9362306a36Sopenharmony_ci};
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_cistruct lsb_header {
9662306a36Sopenharmony_ci	struct lsf_signature signature;
9762306a36Sopenharmony_ci	struct lsb_header_tail tail;
9862306a36Sopenharmony_ci};
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_civoid lsb_header_dump(struct nvkm_subdev *, struct lsb_header *);
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_cistruct lsb_header_v1 {
10362306a36Sopenharmony_ci	struct lsf_signature_v1 signature;
10462306a36Sopenharmony_ci	struct lsb_header_tail tail;
10562306a36Sopenharmony_ci};
10662306a36Sopenharmony_ci
10762306a36Sopenharmony_civoid lsb_header_v1_dump(struct nvkm_subdev *, struct lsb_header_v1 *);
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_cistruct lsb_header_v2 {
11062306a36Sopenharmony_ci	struct wpr_generic_header hdr;
11162306a36Sopenharmony_ci	struct lsf_signature_v2 {
11262306a36Sopenharmony_ci		struct wpr_generic_header hdr;
11362306a36Sopenharmony_ci		u32 falcon_id;
11462306a36Sopenharmony_ci		u8 prd_present;
11562306a36Sopenharmony_ci		u8 dbg_present;
11662306a36Sopenharmony_ci		u16 reserved;
11762306a36Sopenharmony_ci		u32 sig_size;
11862306a36Sopenharmony_ci		u8 prod_sig[2][384 + 128];
11962306a36Sopenharmony_ci		u8 debug_sig[2][384 + 128];
12062306a36Sopenharmony_ci		u16 sig_algo_ver;
12162306a36Sopenharmony_ci		u16 sig_algo;
12262306a36Sopenharmony_ci		u16 hash_algo_ver;
12362306a36Sopenharmony_ci		u16 hash_algo;
12462306a36Sopenharmony_ci		u32 sig_algo_padding_type;
12562306a36Sopenharmony_ci		u8 depmap[11 * 2 * 4];
12662306a36Sopenharmony_ci		u32 depmap_count;
12762306a36Sopenharmony_ci		u8 supports_versioning;
12862306a36Sopenharmony_ci		u8 pad[3];
12962306a36Sopenharmony_ci		u32 ls_ucode_version;
13062306a36Sopenharmony_ci		u32 ls_ucode_id;
13162306a36Sopenharmony_ci		u32 ucode_ls_encrypted;
13262306a36Sopenharmony_ci		u32 ls_eng_algo_type;
13362306a36Sopenharmony_ci		u32 ls_eng_algo_ver;
13462306a36Sopenharmony_ci		u8 ls_enc_iv[16];
13562306a36Sopenharmony_ci		u8 rsvd[36];
13662306a36Sopenharmony_ci	} signature;
13762306a36Sopenharmony_ci	u32 ucode_off;
13862306a36Sopenharmony_ci	u32 ucode_size;
13962306a36Sopenharmony_ci	u32 data_size;
14062306a36Sopenharmony_ci	u32 bl_code_size;
14162306a36Sopenharmony_ci	u32 bl_imem_off;
14262306a36Sopenharmony_ci	u32 bl_data_off;
14362306a36Sopenharmony_ci	u32 bl_data_size;
14462306a36Sopenharmony_ci	u32 rsvd0;
14562306a36Sopenharmony_ci	u32 app_code_off;
14662306a36Sopenharmony_ci	u32 app_code_size;
14762306a36Sopenharmony_ci	u32 app_data_off;
14862306a36Sopenharmony_ci	u32 app_data_size;
14962306a36Sopenharmony_ci	u32 app_imem_offset;
15062306a36Sopenharmony_ci	u32 app_dmem_offset;
15162306a36Sopenharmony_ci	u32 flags;
15262306a36Sopenharmony_ci	u32 monitor_code_offset;
15362306a36Sopenharmony_ci	u32 monitor_data_offset;
15462306a36Sopenharmony_ci	u32 manifest_offset;
15562306a36Sopenharmony_ci	struct hs_fmc_params {
15662306a36Sopenharmony_ci		u8 hs_fmc;
15762306a36Sopenharmony_ci		u8 padding[3];
15862306a36Sopenharmony_ci		u16 pkc_algo;
15962306a36Sopenharmony_ci		u16 pkc_algo_version;
16062306a36Sopenharmony_ci		u32 engid_mask;
16162306a36Sopenharmony_ci		u32 ucode_id;
16262306a36Sopenharmony_ci		u32 fuse_ver;
16362306a36Sopenharmony_ci		u8 pkc_signature[384 + 128];
16462306a36Sopenharmony_ci		u8 pkc_key[2048];
16562306a36Sopenharmony_ci		u8 rsvd[4];
16662306a36Sopenharmony_ci	} hs_fmc_params;
16762306a36Sopenharmony_ci	struct hs_ovl_sig_blob_params {
16862306a36Sopenharmony_ci		u8 hs_ovl_sig_blob_present;
16962306a36Sopenharmony_ci		u32 hs_ovl_sig_blob_offset;
17062306a36Sopenharmony_ci		u32 hs_ovl_sig_blob_size;
17162306a36Sopenharmony_ci	} hs_ovl_sig_blob_params;
17262306a36Sopenharmony_ci	u8 rsvd[20];
17362306a36Sopenharmony_ci};
17462306a36Sopenharmony_ci
17562306a36Sopenharmony_civoid lsb_header_v2_dump(struct nvkm_subdev *, struct lsb_header_v2 *);
17662306a36Sopenharmony_ci
17762306a36Sopenharmony_cistruct flcn_acr_desc {
17862306a36Sopenharmony_ci	union {
17962306a36Sopenharmony_ci		u8 reserved_dmem[0x200];
18062306a36Sopenharmony_ci		u32 signatures[4];
18162306a36Sopenharmony_ci	} ucode_reserved_space;
18262306a36Sopenharmony_ci	u32 wpr_region_id;
18362306a36Sopenharmony_ci	u32 wpr_offset;
18462306a36Sopenharmony_ci	u32 mmu_mem_range;
18562306a36Sopenharmony_ci	struct {
18662306a36Sopenharmony_ci		u32 no_regions;
18762306a36Sopenharmony_ci		struct {
18862306a36Sopenharmony_ci			u32 start_addr;
18962306a36Sopenharmony_ci			u32 end_addr;
19062306a36Sopenharmony_ci			u32 region_id;
19162306a36Sopenharmony_ci			u32 read_mask;
19262306a36Sopenharmony_ci			u32 write_mask;
19362306a36Sopenharmony_ci			u32 client_mask;
19462306a36Sopenharmony_ci		} region_props[2];
19562306a36Sopenharmony_ci	} regions;
19662306a36Sopenharmony_ci	u32 ucode_blob_size;
19762306a36Sopenharmony_ci	u64 ucode_blob_base __aligned(8);
19862306a36Sopenharmony_ci	struct {
19962306a36Sopenharmony_ci		u32 vpr_enabled;
20062306a36Sopenharmony_ci		u32 vpr_start;
20162306a36Sopenharmony_ci		u32 vpr_end;
20262306a36Sopenharmony_ci		u32 hdcp_policies;
20362306a36Sopenharmony_ci	} vpr_desc;
20462306a36Sopenharmony_ci};
20562306a36Sopenharmony_ci
20662306a36Sopenharmony_civoid flcn_acr_desc_dump(struct nvkm_subdev *, struct flcn_acr_desc *);
20762306a36Sopenharmony_ci
20862306a36Sopenharmony_cistruct flcn_acr_desc_v1 {
20962306a36Sopenharmony_ci	u8 reserved_dmem[0x200];
21062306a36Sopenharmony_ci	u32 signatures[4];
21162306a36Sopenharmony_ci	u32 wpr_region_id;
21262306a36Sopenharmony_ci	u32 wpr_offset;
21362306a36Sopenharmony_ci	u32 mmu_memory_range;
21462306a36Sopenharmony_ci	struct {
21562306a36Sopenharmony_ci		u32 no_regions;
21662306a36Sopenharmony_ci		struct {
21762306a36Sopenharmony_ci			u32 start_addr;
21862306a36Sopenharmony_ci			u32 end_addr;
21962306a36Sopenharmony_ci			u32 region_id;
22062306a36Sopenharmony_ci			u32 read_mask;
22162306a36Sopenharmony_ci			u32 write_mask;
22262306a36Sopenharmony_ci			u32 client_mask;
22362306a36Sopenharmony_ci			u32 shadow_mem_start_addr;
22462306a36Sopenharmony_ci		} region_props[2];
22562306a36Sopenharmony_ci	} regions;
22662306a36Sopenharmony_ci	u32 ucode_blob_size;
22762306a36Sopenharmony_ci	u64 ucode_blob_base __aligned(8);
22862306a36Sopenharmony_ci	struct {
22962306a36Sopenharmony_ci		u32 vpr_enabled;
23062306a36Sopenharmony_ci		u32 vpr_start;
23162306a36Sopenharmony_ci		u32 vpr_end;
23262306a36Sopenharmony_ci		u32 hdcp_policies;
23362306a36Sopenharmony_ci	} vpr_desc;
23462306a36Sopenharmony_ci};
23562306a36Sopenharmony_ci
23662306a36Sopenharmony_civoid flcn_acr_desc_v1_dump(struct nvkm_subdev *, struct flcn_acr_desc_v1 *);
23762306a36Sopenharmony_ci#endif
238