1 #ifndef __NVFW_ACR_H__ 2 #define __NVFW_ACR_H__ 3 4 struct wpr_header { 5 #define WPR_HEADER_V0_FALCON_ID_INVALID 0xffffffff 6 u32 falcon_id; 7 u32 lsb_offset; 8 u32 bootstrap_owner; 9 u32 lazy_bootstrap; 10 #define WPR_HEADER_V0_STATUS_NONE 0 11 #define WPR_HEADER_V0_STATUS_COPY 1 12 #define WPR_HEADER_V0_STATUS_VALIDATION_CODE_FAILED 2 13 #define WPR_HEADER_V0_STATUS_VALIDATION_DATA_FAILED 3 14 #define WPR_HEADER_V0_STATUS_VALIDATION_DONE 4 15 #define WPR_HEADER_V0_STATUS_VALIDATION_SKIPPED 5 16 #define WPR_HEADER_V0_STATUS_BOOTSTRAP_READY 6 17 u32 status; 18 }; 19 20 void wpr_header_dump(struct nvkm_subdev *, const struct wpr_header *); 21 22 struct wpr_header_v1 { 23 #define WPR_HEADER_V1_FALCON_ID_INVALID 0xffffffff 24 u32 falcon_id; 25 u32 lsb_offset; 26 u32 bootstrap_owner; 27 u32 lazy_bootstrap; 28 u32 bin_version; 29 #define WPR_HEADER_V1_STATUS_NONE 0 30 #define WPR_HEADER_V1_STATUS_COPY 1 31 #define WPR_HEADER_V1_STATUS_VALIDATION_CODE_FAILED 2 32 #define WPR_HEADER_V1_STATUS_VALIDATION_DATA_FAILED 3 33 #define WPR_HEADER_V1_STATUS_VALIDATION_DONE 4 34 #define WPR_HEADER_V1_STATUS_VALIDATION_SKIPPED 5 35 #define WPR_HEADER_V1_STATUS_BOOTSTRAP_READY 6 36 #define WPR_HEADER_V1_STATUS_REVOCATION_CHECK_FAILED 7 37 u32 status; 38 }; 39 40 void wpr_header_v1_dump(struct nvkm_subdev *, const struct wpr_header_v1 *); 41 42 struct wpr_generic_header { 43 #define WPR_GENERIC_HEADER_ID_LSF_UCODE_DESC 1 44 #define WPR_GENERIC_HEADER_ID_LSF_WPR_HEADER 2 45 #define WPR_GENERIC_HEADER_ID_LSF_SHARED_SUB_WPR 3 46 #define WPR_GENERIC_HEADER_ID_LSF_LSB_HEADER 4 47 u16 identifier; 48 u16 version; 49 u32 size; 50 }; 51 52 struct wpr_header_v2 { 53 struct wpr_generic_header hdr; 54 struct wpr_header_v1 wpr; 55 }; 56 57 void wpr_header_v2_dump(struct nvkm_subdev *, const struct wpr_header_v2 *); 58 59 struct lsf_signature { 60 u8 prd_keys[2][16]; 61 u8 dbg_keys[2][16]; 62 u32 b_prd_present; 63 u32 b_dbg_present; 64 u32 falcon_id; 65 }; 66 67 struct lsf_signature_v1 { 68 u8 prd_keys[2][16]; 69 u8 dbg_keys[2][16]; 70 u32 b_prd_present; 71 u32 b_dbg_present; 72 u32 falcon_id; 73 u32 supports_versioning; 74 u32 version; 75 u32 depmap_count; 76 u8 depmap[11/*LSF_LSB_DEPMAP_SIZE*/ * 2 * 4]; 77 u8 kdf[16]; 78 }; 79 80 struct lsb_header_tail { 81 u32 ucode_off; 82 u32 ucode_size; 83 u32 data_size; 84 u32 bl_code_size; 85 u32 bl_imem_off; 86 u32 bl_data_off; 87 u32 bl_data_size; 88 u32 app_code_off; 89 u32 app_code_size; 90 u32 app_data_off; 91 u32 app_data_size; 92 u32 flags; 93 }; 94 95 struct lsb_header { 96 struct lsf_signature signature; 97 struct lsb_header_tail tail; 98 }; 99 100 void lsb_header_dump(struct nvkm_subdev *, struct lsb_header *); 101 102 struct lsb_header_v1 { 103 struct lsf_signature_v1 signature; 104 struct lsb_header_tail tail; 105 }; 106 107 void lsb_header_v1_dump(struct nvkm_subdev *, struct lsb_header_v1 *); 108 109 struct lsb_header_v2 { 110 struct wpr_generic_header hdr; 111 struct lsf_signature_v2 { 112 struct wpr_generic_header hdr; 113 u32 falcon_id; 114 u8 prd_present; 115 u8 dbg_present; 116 u16 reserved; 117 u32 sig_size; 118 u8 prod_sig[2][384 + 128]; 119 u8 debug_sig[2][384 + 128]; 120 u16 sig_algo_ver; 121 u16 sig_algo; 122 u16 hash_algo_ver; 123 u16 hash_algo; 124 u32 sig_algo_padding_type; 125 u8 depmap[11 * 2 * 4]; 126 u32 depmap_count; 127 u8 supports_versioning; 128 u8 pad[3]; 129 u32 ls_ucode_version; 130 u32 ls_ucode_id; 131 u32 ucode_ls_encrypted; 132 u32 ls_eng_algo_type; 133 u32 ls_eng_algo_ver; 134 u8 ls_enc_iv[16]; 135 u8 rsvd[36]; 136 } signature; 137 u32 ucode_off; 138 u32 ucode_size; 139 u32 data_size; 140 u32 bl_code_size; 141 u32 bl_imem_off; 142 u32 bl_data_off; 143 u32 bl_data_size; 144 u32 rsvd0; 145 u32 app_code_off; 146 u32 app_code_size; 147 u32 app_data_off; 148 u32 app_data_size; 149 u32 app_imem_offset; 150 u32 app_dmem_offset; 151 u32 flags; 152 u32 monitor_code_offset; 153 u32 monitor_data_offset; 154 u32 manifest_offset; 155 struct hs_fmc_params { 156 u8 hs_fmc; 157 u8 padding[3]; 158 u16 pkc_algo; 159 u16 pkc_algo_version; 160 u32 engid_mask; 161 u32 ucode_id; 162 u32 fuse_ver; 163 u8 pkc_signature[384 + 128]; 164 u8 pkc_key[2048]; 165 u8 rsvd[4]; 166 } hs_fmc_params; 167 struct hs_ovl_sig_blob_params { 168 u8 hs_ovl_sig_blob_present; 169 u32 hs_ovl_sig_blob_offset; 170 u32 hs_ovl_sig_blob_size; 171 } hs_ovl_sig_blob_params; 172 u8 rsvd[20]; 173 }; 174 175 void lsb_header_v2_dump(struct nvkm_subdev *, struct lsb_header_v2 *); 176 177 struct flcn_acr_desc { 178 union { 179 u8 reserved_dmem[0x200]; 180 u32 signatures[4]; 181 } ucode_reserved_space; 182 u32 wpr_region_id; 183 u32 wpr_offset; 184 u32 mmu_mem_range; 185 struct { 186 u32 no_regions; 187 struct { 188 u32 start_addr; 189 u32 end_addr; 190 u32 region_id; 191 u32 read_mask; 192 u32 write_mask; 193 u32 client_mask; 194 } region_props[2]; 195 } regions; 196 u32 ucode_blob_size; 197 u64 ucode_blob_base __aligned(8); 198 struct { 199 u32 vpr_enabled; 200 u32 vpr_start; 201 u32 vpr_end; 202 u32 hdcp_policies; 203 } vpr_desc; 204 }; 205 206 void flcn_acr_desc_dump(struct nvkm_subdev *, struct flcn_acr_desc *); 207 208 struct flcn_acr_desc_v1 { 209 u8 reserved_dmem[0x200]; 210 u32 signatures[4]; 211 u32 wpr_region_id; 212 u32 wpr_offset; 213 u32 mmu_memory_range; 214 struct { 215 u32 no_regions; 216 struct { 217 u32 start_addr; 218 u32 end_addr; 219 u32 region_id; 220 u32 read_mask; 221 u32 write_mask; 222 u32 client_mask; 223 u32 shadow_mem_start_addr; 224 } region_props[2]; 225 } regions; 226 u32 ucode_blob_size; 227 u64 ucode_blob_base __aligned(8); 228 struct { 229 u32 vpr_enabled; 230 u32 vpr_start; 231 u32 vpr_end; 232 u32 hdcp_policies; 233 } vpr_desc; 234 }; 235 236 void flcn_acr_desc_v1_dump(struct nvkm_subdev *, struct flcn_acr_desc_v1 *); 237 #endif 238