0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025 #ifndef __AMDGPU_PSP_H__
0026 #define __AMDGPU_PSP_H__
0027
0028 #include "amdgpu.h"
0029 #include "psp_gfx_if.h"
0030 #include "ta_xgmi_if.h"
0031 #include "ta_ras_if.h"
0032 #include "ta_rap_if.h"
0033 #include "ta_secureDisplay_if.h"
0034
0035 #define PSP_FENCE_BUFFER_SIZE 0x1000
0036 #define PSP_CMD_BUFFER_SIZE 0x1000
0037 #define PSP_1_MEG 0x100000
0038 #define PSP_TMR_SIZE(adev) ((adev)->asic_type == CHIP_ALDEBARAN ? 0x800000 : 0x400000)
0039 #define PSP_TMR_ALIGNMENT 0x100000
0040 #define PSP_FW_NAME_LEN 0x24
0041
0042 enum psp_shared_mem_size {
0043 PSP_ASD_SHARED_MEM_SIZE = 0x0,
0044 PSP_XGMI_SHARED_MEM_SIZE = 0x4000,
0045 PSP_RAS_SHARED_MEM_SIZE = 0x4000,
0046 PSP_HDCP_SHARED_MEM_SIZE = 0x4000,
0047 PSP_DTM_SHARED_MEM_SIZE = 0x4000,
0048 PSP_RAP_SHARED_MEM_SIZE = 0x4000,
0049 PSP_SECUREDISPLAY_SHARED_MEM_SIZE = 0x4000,
0050 };
0051
0052 enum ta_type_id {
0053 TA_TYPE_XGMI = 1,
0054 TA_TYPE_RAS,
0055 TA_TYPE_HDCP,
0056 TA_TYPE_DTM,
0057 TA_TYPE_RAP,
0058 TA_TYPE_SECUREDISPLAY,
0059
0060 TA_TYPE_MAX_INDEX,
0061 };
0062
0063 struct psp_context;
0064 struct psp_xgmi_node_info;
0065 struct psp_xgmi_topology_info;
0066 struct psp_bin_desc;
0067
0068 enum psp_bootloader_cmd {
0069 PSP_BL__LOAD_SYSDRV = 0x10000,
0070 PSP_BL__LOAD_SOSDRV = 0x20000,
0071 PSP_BL__LOAD_KEY_DATABASE = 0x80000,
0072 PSP_BL__LOAD_SOCDRV = 0xB0000,
0073 PSP_BL__LOAD_DBGDRV = 0xC0000,
0074 PSP_BL__LOAD_INTFDRV = 0xD0000,
0075 PSP_BL__DRAM_LONG_TRAIN = 0x100000,
0076 PSP_BL__DRAM_SHORT_TRAIN = 0x200000,
0077 PSP_BL__LOAD_TOS_SPL_TABLE = 0x10000000,
0078 };
0079
0080 enum psp_ring_type
0081 {
0082 PSP_RING_TYPE__INVALID = 0,
0083
0084
0085
0086
0087 PSP_RING_TYPE__UM = 1,
0088 PSP_RING_TYPE__KM = 2
0089 };
0090
0091 struct psp_ring
0092 {
0093 enum psp_ring_type ring_type;
0094 struct psp_gfx_rb_frame *ring_mem;
0095 uint64_t ring_mem_mc_addr;
0096 void *ring_mem_handle;
0097 uint32_t ring_size;
0098 uint32_t ring_wptr;
0099 };
0100
0101
0102 enum psp_reg_prog_id {
0103 PSP_REG_IH_RB_CNTL = 0,
0104 PSP_REG_IH_RB_CNTL_RING1 = 1,
0105 PSP_REG_IH_RB_CNTL_RING2 = 2,
0106 PSP_REG_LAST
0107 };
0108
0109 struct psp_funcs
0110 {
0111 int (*init_microcode)(struct psp_context *psp);
0112 int (*bootloader_load_kdb)(struct psp_context *psp);
0113 int (*bootloader_load_spl)(struct psp_context *psp);
0114 int (*bootloader_load_sysdrv)(struct psp_context *psp);
0115 int (*bootloader_load_soc_drv)(struct psp_context *psp);
0116 int (*bootloader_load_intf_drv)(struct psp_context *psp);
0117 int (*bootloader_load_dbg_drv)(struct psp_context *psp);
0118 int (*bootloader_load_sos)(struct psp_context *psp);
0119 int (*ring_init)(struct psp_context *psp, enum psp_ring_type ring_type);
0120 int (*ring_create)(struct psp_context *psp,
0121 enum psp_ring_type ring_type);
0122 int (*ring_stop)(struct psp_context *psp,
0123 enum psp_ring_type ring_type);
0124 int (*ring_destroy)(struct psp_context *psp,
0125 enum psp_ring_type ring_type);
0126 bool (*smu_reload_quirk)(struct psp_context *psp);
0127 int (*mode1_reset)(struct psp_context *psp);
0128 int (*mem_training)(struct psp_context *psp, uint32_t ops);
0129 uint32_t (*ring_get_wptr)(struct psp_context *psp);
0130 void (*ring_set_wptr)(struct psp_context *psp, uint32_t value);
0131 int (*load_usbc_pd_fw)(struct psp_context *psp, uint64_t fw_pri_mc_addr);
0132 int (*read_usbc_pd_fw)(struct psp_context *psp, uint32_t *fw_ver);
0133 int (*update_spirom)(struct psp_context *psp, uint64_t fw_pri_mc_addr);
0134 int (*vbflash_stat)(struct psp_context *psp);
0135 };
0136
0137 #define AMDGPU_XGMI_MAX_CONNECTED_NODES 64
0138 struct psp_xgmi_node_info {
0139 uint64_t node_id;
0140 uint8_t num_hops;
0141 uint8_t is_sharing_enabled;
0142 enum ta_xgmi_assigned_sdma_engine sdma_engine;
0143 uint8_t num_links;
0144 };
0145
0146 struct psp_xgmi_topology_info {
0147 uint32_t num_nodes;
0148 struct psp_xgmi_node_info nodes[AMDGPU_XGMI_MAX_CONNECTED_NODES];
0149 };
0150
0151 struct psp_bin_desc {
0152 uint32_t fw_version;
0153 uint32_t feature_version;
0154 uint32_t size_bytes;
0155 uint8_t *start_addr;
0156 };
0157
0158 struct ta_mem_context {
0159 struct amdgpu_bo *shared_bo;
0160 uint64_t shared_mc_addr;
0161 void *shared_buf;
0162 enum psp_shared_mem_size shared_mem_size;
0163 };
0164
0165 struct ta_context {
0166 bool initialized;
0167 uint32_t session_id;
0168 uint32_t resp_status;
0169 struct ta_mem_context mem_context;
0170 struct psp_bin_desc bin_desc;
0171 enum psp_gfx_cmd_id ta_load_type;
0172 enum ta_type_id ta_type;
0173 };
0174
0175 struct ta_cp_context {
0176 struct ta_context context;
0177 struct mutex mutex;
0178 };
0179
0180 struct psp_xgmi_context {
0181 struct ta_context context;
0182 struct psp_xgmi_topology_info top_info;
0183 bool supports_extended_data;
0184 };
0185
0186 struct psp_ras_context {
0187 struct ta_context context;
0188 struct amdgpu_ras *ras;
0189 };
0190
0191 #define MEM_TRAIN_SYSTEM_SIGNATURE 0x54534942
0192 #define GDDR6_MEM_TRAINING_DATA_SIZE_IN_BYTES 0x1000
0193 #define GDDR6_MEM_TRAINING_OFFSET 0x8000
0194
0195 #define GDDR6_MEM_TRAINING_ENCROACHED_SIZE 0x2000000
0196
0197 enum psp_memory_training_init_flag {
0198 PSP_MEM_TRAIN_NOT_SUPPORT = 0x0,
0199 PSP_MEM_TRAIN_SUPPORT = 0x1,
0200 PSP_MEM_TRAIN_INIT_FAILED = 0x2,
0201 PSP_MEM_TRAIN_RESERVE_SUCCESS = 0x4,
0202 PSP_MEM_TRAIN_INIT_SUCCESS = 0x8,
0203 };
0204
0205 enum psp_memory_training_ops {
0206 PSP_MEM_TRAIN_SEND_LONG_MSG = 0x1,
0207 PSP_MEM_TRAIN_SAVE = 0x2,
0208 PSP_MEM_TRAIN_RESTORE = 0x4,
0209 PSP_MEM_TRAIN_SEND_SHORT_MSG = 0x8,
0210 PSP_MEM_TRAIN_COLD_BOOT = PSP_MEM_TRAIN_SEND_LONG_MSG,
0211 PSP_MEM_TRAIN_RESUME = PSP_MEM_TRAIN_SEND_SHORT_MSG,
0212 };
0213
0214 struct psp_memory_training_context {
0215
0216 u64 train_data_size;
0217
0218
0219
0220
0221
0222 void *sys_cache;
0223
0224
0225 u64 p2c_train_data_offset;
0226
0227
0228 u64 c2p_train_data_offset;
0229 struct amdgpu_bo *c2p_bo;
0230
0231 enum psp_memory_training_init_flag init;
0232 u32 training_cnt;
0233 bool enable_mem_training;
0234 };
0235
0236
0237 #define PSP_RUNTIME_DB_SIZE_IN_BYTES 0x10000
0238 #define PSP_RUNTIME_DB_OFFSET 0x100000
0239 #define PSP_RUNTIME_DB_COOKIE_ID 0x0ed5
0240 #define PSP_RUNTIME_DB_VER_1 0x0100
0241 #define PSP_RUNTIME_DB_DIAG_ENTRY_MAX_COUNT 0x40
0242
0243 enum psp_runtime_entry_type {
0244 PSP_RUNTIME_ENTRY_TYPE_INVALID = 0x0,
0245 PSP_RUNTIME_ENTRY_TYPE_TEST = 0x1,
0246 PSP_RUNTIME_ENTRY_TYPE_MGPU_COMMON = 0x2,
0247 PSP_RUNTIME_ENTRY_TYPE_MGPU_WAFL = 0x3,
0248 PSP_RUNTIME_ENTRY_TYPE_MGPU_XGMI = 0x4,
0249 PSP_RUNTIME_ENTRY_TYPE_BOOT_CONFIG = 0x5,
0250 PSP_RUNTIME_ENTRY_TYPE_PPTABLE_ERR_STATUS = 0x6,
0251 };
0252
0253
0254 struct psp_runtime_data_header {
0255
0256 uint16_t cookie;
0257
0258 uint16_t version;
0259 };
0260
0261
0262 struct psp_runtime_entry {
0263
0264 uint32_t entry_type;
0265
0266 uint16_t offset;
0267
0268 uint16_t size;
0269 };
0270
0271
0272 struct psp_runtime_data_directory {
0273
0274 uint16_t entry_count;
0275
0276 struct psp_runtime_entry entry_list[PSP_RUNTIME_DB_DIAG_ENTRY_MAX_COUNT];
0277 };
0278
0279
0280 enum psp_runtime_boot_cfg_feature {
0281 BOOT_CFG_FEATURE_GECC = 0x1,
0282 BOOT_CFG_FEATURE_TWO_STAGE_DRAM_TRAINING = 0x2,
0283 };
0284
0285
0286 enum psp_runtime_scpm_authentication {
0287 SCPM_DISABLE = 0x0,
0288 SCPM_ENABLE = 0x1,
0289 SCPM_ENABLE_WITH_SCPM_ERR = 0x2,
0290 };
0291
0292
0293 struct psp_runtime_boot_cfg_entry {
0294 uint32_t boot_cfg_bitmask;
0295 uint32_t reserved;
0296 };
0297
0298
0299 struct psp_runtime_scpm_entry {
0300 enum psp_runtime_scpm_authentication scpm_status;
0301 };
0302
0303 struct psp_context
0304 {
0305 struct amdgpu_device *adev;
0306 struct psp_ring km_ring;
0307 struct psp_gfx_cmd_resp *cmd;
0308
0309 const struct psp_funcs *funcs;
0310
0311
0312 struct amdgpu_bo *fw_pri_bo;
0313 uint64_t fw_pri_mc_addr;
0314 void *fw_pri_buf;
0315
0316
0317 const struct firmware *sos_fw;
0318 struct psp_bin_desc sys;
0319 struct psp_bin_desc sos;
0320 struct psp_bin_desc toc;
0321 struct psp_bin_desc kdb;
0322 struct psp_bin_desc spl;
0323 struct psp_bin_desc rl;
0324 struct psp_bin_desc soc_drv;
0325 struct psp_bin_desc intf_drv;
0326 struct psp_bin_desc dbg_drv;
0327
0328
0329 struct amdgpu_bo *tmr_bo;
0330 uint64_t tmr_mc_addr;
0331
0332
0333 const struct firmware *asd_fw;
0334
0335
0336 const struct firmware *toc_fw;
0337
0338
0339 const struct firmware *cap_fw;
0340
0341
0342 struct amdgpu_bo *fence_buf_bo;
0343 uint64_t fence_buf_mc_addr;
0344 void *fence_buf;
0345
0346
0347 struct amdgpu_bo *cmd_buf_bo;
0348 uint64_t cmd_buf_mc_addr;
0349 struct psp_gfx_cmd_resp *cmd_buf_mem;
0350
0351
0352 atomic_t fence_value;
0353
0354 bool autoload_supported;
0355
0356 bool pmfw_centralized_cstate_management;
0357
0358
0359 const struct firmware *ta_fw;
0360 uint32_t ta_fw_version;
0361
0362 uint32_t cap_fw_version;
0363 uint32_t cap_feature_version;
0364 uint32_t cap_ucode_size;
0365
0366 struct ta_context asd_context;
0367 struct psp_xgmi_context xgmi_context;
0368 struct psp_ras_context ras_context;
0369 struct ta_cp_context hdcp_context;
0370 struct ta_cp_context dtm_context;
0371 struct ta_cp_context rap_context;
0372 struct ta_cp_context securedisplay_context;
0373 struct mutex mutex;
0374 struct psp_memory_training_context mem_train_ctx;
0375
0376 uint32_t boot_cfg_bitmask;
0377
0378 char *vbflash_tmp_buf;
0379 size_t vbflash_image_size;
0380 bool vbflash_done;
0381 };
0382
0383 struct amdgpu_psp_funcs {
0384 bool (*check_fw_loading_status)(struct amdgpu_device *adev,
0385 enum AMDGPU_UCODE_ID);
0386 };
0387
0388
0389 #define psp_ring_init(psp, type) (psp)->funcs->ring_init((psp), (type))
0390 #define psp_ring_create(psp, type) (psp)->funcs->ring_create((psp), (type))
0391 #define psp_ring_stop(psp, type) (psp)->funcs->ring_stop((psp), (type))
0392 #define psp_ring_destroy(psp, type) ((psp)->funcs->ring_destroy((psp), (type)))
0393 #define psp_init_microcode(psp) \
0394 ((psp)->funcs->init_microcode ? (psp)->funcs->init_microcode((psp)) : 0)
0395 #define psp_bootloader_load_kdb(psp) \
0396 ((psp)->funcs->bootloader_load_kdb ? (psp)->funcs->bootloader_load_kdb((psp)) : 0)
0397 #define psp_bootloader_load_spl(psp) \
0398 ((psp)->funcs->bootloader_load_spl ? (psp)->funcs->bootloader_load_spl((psp)) : 0)
0399 #define psp_bootloader_load_sysdrv(psp) \
0400 ((psp)->funcs->bootloader_load_sysdrv ? (psp)->funcs->bootloader_load_sysdrv((psp)) : 0)
0401 #define psp_bootloader_load_soc_drv(psp) \
0402 ((psp)->funcs->bootloader_load_soc_drv ? (psp)->funcs->bootloader_load_soc_drv((psp)) : 0)
0403 #define psp_bootloader_load_intf_drv(psp) \
0404 ((psp)->funcs->bootloader_load_intf_drv ? (psp)->funcs->bootloader_load_intf_drv((psp)) : 0)
0405 #define psp_bootloader_load_dbg_drv(psp) \
0406 ((psp)->funcs->bootloader_load_dbg_drv ? (psp)->funcs->bootloader_load_dbg_drv((psp)) : 0)
0407 #define psp_bootloader_load_sos(psp) \
0408 ((psp)->funcs->bootloader_load_sos ? (psp)->funcs->bootloader_load_sos((psp)) : 0)
0409 #define psp_smu_reload_quirk(psp) \
0410 ((psp)->funcs->smu_reload_quirk ? (psp)->funcs->smu_reload_quirk((psp)) : false)
0411 #define psp_mode1_reset(psp) \
0412 ((psp)->funcs->mode1_reset ? (psp)->funcs->mode1_reset((psp)) : false)
0413 #define psp_mem_training(psp, ops) \
0414 ((psp)->funcs->mem_training ? (psp)->funcs->mem_training((psp), (ops)) : 0)
0415
0416 #define psp_ring_get_wptr(psp) (psp)->funcs->ring_get_wptr((psp))
0417 #define psp_ring_set_wptr(psp, value) (psp)->funcs->ring_set_wptr((psp), (value))
0418
0419 #define psp_load_usbc_pd_fw(psp, fw_pri_mc_addr) \
0420 ((psp)->funcs->load_usbc_pd_fw ? \
0421 (psp)->funcs->load_usbc_pd_fw((psp), (fw_pri_mc_addr)) : -EINVAL)
0422
0423 #define psp_read_usbc_pd_fw(psp, fw_ver) \
0424 ((psp)->funcs->read_usbc_pd_fw ? \
0425 (psp)->funcs->read_usbc_pd_fw((psp), fw_ver) : -EINVAL)
0426
0427 #define psp_update_spirom(psp, fw_pri_mc_addr) \
0428 ((psp)->funcs->update_spirom ? \
0429 (psp)->funcs->update_spirom((psp), fw_pri_mc_addr) : -EINVAL)
0430
0431 #define psp_vbflash_status(psp) \
0432 ((psp)->funcs->vbflash_stat ? \
0433 (psp)->funcs->vbflash_stat((psp)) : -EINVAL)
0434
0435 extern const struct amd_ip_funcs psp_ip_funcs;
0436
0437 extern const struct amdgpu_ip_block_version psp_v3_1_ip_block;
0438 extern const struct amdgpu_ip_block_version psp_v10_0_ip_block;
0439 extern const struct amdgpu_ip_block_version psp_v11_0_ip_block;
0440 extern const struct amdgpu_ip_block_version psp_v11_0_8_ip_block;
0441 extern const struct amdgpu_ip_block_version psp_v12_0_ip_block;
0442 extern const struct amdgpu_ip_block_version psp_v13_0_ip_block;
0443 extern const struct amdgpu_ip_block_version psp_v13_0_4_ip_block;
0444
0445 extern int psp_wait_for(struct psp_context *psp, uint32_t reg_index,
0446 uint32_t field_val, uint32_t mask, bool check_changed);
0447
0448 int psp_gpu_reset(struct amdgpu_device *adev);
0449 int psp_update_vcn_sram(struct amdgpu_device *adev, int inst_idx,
0450 uint64_t cmd_gpu_addr, int cmd_size);
0451
0452 int psp_ta_init_shared_buf(struct psp_context *psp,
0453 struct ta_mem_context *mem_ctx);
0454 void psp_ta_free_shared_buf(struct ta_mem_context *mem_ctx);
0455 int psp_ta_unload(struct psp_context *psp, struct ta_context *context);
0456 int psp_ta_load(struct psp_context *psp, struct ta_context *context);
0457 int psp_ta_invoke(struct psp_context *psp,
0458 uint32_t ta_cmd_id,
0459 struct ta_context *context);
0460 int psp_ta_invoke_indirect(struct psp_context *psp,
0461 uint32_t ta_cmd_id,
0462 struct ta_context *context);
0463
0464 int psp_xgmi_initialize(struct psp_context *psp, bool set_extended_data, bool load_ta);
0465 int psp_xgmi_terminate(struct psp_context *psp);
0466 int psp_xgmi_invoke(struct psp_context *psp, uint32_t ta_cmd_id);
0467 int psp_xgmi_get_hive_id(struct psp_context *psp, uint64_t *hive_id);
0468 int psp_xgmi_get_node_id(struct psp_context *psp, uint64_t *node_id);
0469 int psp_xgmi_get_topology_info(struct psp_context *psp,
0470 int number_devices,
0471 struct psp_xgmi_topology_info *topology,
0472 bool get_extended_data);
0473 int psp_xgmi_set_topology_info(struct psp_context *psp,
0474 int number_devices,
0475 struct psp_xgmi_topology_info *topology);
0476
0477 int psp_ras_invoke(struct psp_context *psp, uint32_t ta_cmd_id);
0478 int psp_ras_enable_features(struct psp_context *psp,
0479 union ta_ras_cmd_input *info, bool enable);
0480 int psp_ras_trigger_error(struct psp_context *psp,
0481 struct ta_ras_trigger_error_input *info);
0482 int psp_ras_terminate(struct psp_context *psp);
0483
0484 int psp_hdcp_invoke(struct psp_context *psp, uint32_t ta_cmd_id);
0485 int psp_dtm_invoke(struct psp_context *psp, uint32_t ta_cmd_id);
0486 int psp_rap_invoke(struct psp_context *psp, uint32_t ta_cmd_id, enum ta_rap_status *status);
0487 int psp_securedisplay_invoke(struct psp_context *psp, uint32_t ta_cmd_id);
0488
0489 int psp_rlc_autoload_start(struct psp_context *psp);
0490
0491 int psp_reg_program(struct psp_context *psp, enum psp_reg_prog_id reg,
0492 uint32_t value);
0493 int psp_ring_cmd_submit(struct psp_context *psp,
0494 uint64_t cmd_buf_mc_addr,
0495 uint64_t fence_mc_addr,
0496 int index);
0497 int psp_init_asd_microcode(struct psp_context *psp,
0498 const char *chip_name);
0499 int psp_init_toc_microcode(struct psp_context *psp,
0500 const char *chip_name);
0501 int psp_init_sos_microcode(struct psp_context *psp,
0502 const char *chip_name);
0503 int psp_init_ta_microcode(struct psp_context *psp,
0504 const char *chip_name);
0505 int psp_init_cap_microcode(struct psp_context *psp,
0506 const char *chip_name);
0507 int psp_get_fw_attestation_records_addr(struct psp_context *psp,
0508 uint64_t *output_ptr);
0509
0510 int psp_load_fw_list(struct psp_context *psp,
0511 struct amdgpu_firmware_info **ucode_list, int ucode_count);
0512 void psp_copy_fw(struct psp_context *psp, uint8_t *start_addr, uint32_t bin_size);
0513
0514 int is_psp_fw_valid(struct psp_bin_desc bin);
0515
0516 int amdgpu_psp_sysfs_init(struct amdgpu_device *adev);
0517 void amdgpu_psp_sysfs_fini(struct amdgpu_device *adev);
0518 #endif