Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amdgpu/psp: use a function pointer structure

This way we can make all of the IP specific functions static,
and we only need a single entry point into the PSP IP modules.

Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

+113 -116
+2 -21
drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
··· 51 51 52 52 switch (adev->asic_type) { 53 53 case CHIP_VEGA10: 54 - psp->init_microcode = psp_v3_1_init_microcode; 55 - psp->bootloader_load_sysdrv = psp_v3_1_bootloader_load_sysdrv; 56 - psp->bootloader_load_sos = psp_v3_1_bootloader_load_sos; 57 - psp->prep_cmd_buf = psp_v3_1_prep_cmd_buf; 58 - psp->ring_init = psp_v3_1_ring_init; 59 - psp->ring_create = psp_v3_1_ring_create; 60 - psp->ring_stop = psp_v3_1_ring_stop; 61 - psp->ring_destroy = psp_v3_1_ring_destroy; 62 - psp->cmd_submit = psp_v3_1_cmd_submit; 63 - psp->compare_sram_data = psp_v3_1_compare_sram_data; 64 - psp->smu_reload_quirk = psp_v3_1_smu_reload_quirk; 65 - psp->mode1_reset = psp_v3_1_mode1_reset; 54 + psp_v3_1_set_psp_funcs(psp); 66 55 break; 67 56 case CHIP_RAVEN: 68 - psp->init_microcode = psp_v10_0_init_microcode; 69 - psp->prep_cmd_buf = psp_v10_0_prep_cmd_buf; 70 - psp->ring_init = psp_v10_0_ring_init; 71 - psp->ring_create = psp_v10_0_ring_create; 72 - psp->ring_stop = psp_v10_0_ring_stop; 73 - psp->ring_destroy = psp_v10_0_ring_destroy; 74 - psp->cmd_submit = psp_v10_0_cmd_submit; 75 - psp->compare_sram_data = psp_v10_0_compare_sram_data; 76 - psp->mode1_reset = psp_v10_0_mode1_reset; 57 + psp_v10_0_set_psp_funcs(psp); 77 58 break; 78 59 default: 79 60 return -EINVAL;
+24 -17
drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
··· 33 33 #define PSP_ASD_SHARED_MEM_SIZE 0x4000 34 34 #define PSP_1_MEG 0x100000 35 35 36 + struct psp_context; 37 + 36 38 enum psp_ring_type 37 39 { 38 40 PSP_RING_TYPE__INVALID = 0, ··· 55 53 uint32_t ring_size; 56 54 }; 57 55 58 - struct psp_context 56 + struct psp_funcs 59 57 { 60 - struct amdgpu_device *adev; 61 - struct psp_ring km_ring; 62 - struct psp_gfx_cmd_resp *cmd; 63 - 64 58 int (*init_microcode)(struct psp_context *psp); 65 59 int (*bootloader_load_sysdrv)(struct psp_context *psp); 66 60 int (*bootloader_load_sos)(struct psp_context *psp); ··· 75 77 enum AMDGPU_UCODE_ID ucode_type); 76 78 bool (*smu_reload_quirk)(struct psp_context *psp); 77 79 int (*mode1_reset)(struct psp_context *psp); 80 + }; 81 + 82 + struct psp_context 83 + { 84 + struct amdgpu_device *adev; 85 + struct psp_ring km_ring; 86 + struct psp_gfx_cmd_resp *cmd; 87 + 88 + const struct psp_funcs *funcs; 78 89 79 90 /* fence buffer */ 80 91 struct amdgpu_bo *fw_pri_bo; ··· 130 123 enum AMDGPU_UCODE_ID); 131 124 }; 132 125 133 - #define psp_prep_cmd_buf(ucode, type) (psp)->prep_cmd_buf((ucode), (type)) 134 - #define psp_ring_init(psp, type) (psp)->ring_init((psp), (type)) 135 - #define psp_ring_create(psp, type) (psp)->ring_create((psp), (type)) 136 - #define psp_ring_stop(psp, type) (psp)->ring_stop((psp), (type)) 137 - #define psp_ring_destroy(psp, type) ((psp)->ring_destroy((psp), (type))) 126 + #define psp_prep_cmd_buf(ucode, type) (psp)->funcs->prep_cmd_buf((ucode), (type)) 127 + #define psp_ring_init(psp, type) (psp)->funcs->ring_init((psp), (type)) 128 + #define psp_ring_create(psp, type) (psp)->funcs->ring_create((psp), (type)) 129 + #define psp_ring_stop(psp, type) (psp)->funcs->ring_stop((psp), (type)) 130 + #define psp_ring_destroy(psp, type) ((psp)->funcs->ring_destroy((psp), (type))) 138 131 #define psp_cmd_submit(psp, ucode, cmd_mc, fence_mc, index) \ 139 - (psp)->cmd_submit((psp), (ucode), (cmd_mc), (fence_mc), (index)) 132 + (psp)->funcs->cmd_submit((psp), (ucode), (cmd_mc), (fence_mc), (index)) 140 133 #define psp_compare_sram_data(psp, ucode, type) \ 141 - (psp)->compare_sram_data((psp), (ucode), (type)) 134 + (psp)->funcs->compare_sram_data((psp), (ucode), (type)) 142 135 #define psp_init_microcode(psp) \ 143 - ((psp)->init_microcode ? (psp)->init_microcode((psp)) : 0) 136 + ((psp)->funcs->init_microcode ? (psp)->funcs->init_microcode((psp)) : 0) 144 137 #define psp_bootloader_load_sysdrv(psp) \ 145 - ((psp)->bootloader_load_sysdrv ? (psp)->bootloader_load_sysdrv((psp)) : 0) 138 + ((psp)->funcs->bootloader_load_sysdrv ? (psp)->funcs->bootloader_load_sysdrv((psp)) : 0) 146 139 #define psp_bootloader_load_sos(psp) \ 147 - ((psp)->bootloader_load_sos ? (psp)->bootloader_load_sos((psp)) : 0) 140 + ((psp)->funcs->bootloader_load_sos ? (psp)->funcs->bootloader_load_sos((psp)) : 0) 148 141 #define psp_smu_reload_quirk(psp) \ 149 - ((psp)->smu_reload_quirk ? (psp)->smu_reload_quirk((psp)) : false) 142 + ((psp)->funcs->smu_reload_quirk ? (psp)->funcs->smu_reload_quirk((psp)) : false) 150 143 #define psp_mode1_reset(psp) \ 151 - ((psp)->mode1_reset ? (psp)->mode1_reset((psp)) : false) 144 + ((psp)->funcs->mode1_reset ? (psp)->funcs->mode1_reset((psp)) : false) 152 145 153 146 extern const struct amd_ip_funcs psp_ip_funcs; 154 147
+39 -17
drivers/gpu/drm/amd/amdgpu/psp_v10_0.c
··· 87 87 return 0; 88 88 } 89 89 90 - int psp_v10_0_init_microcode(struct psp_context *psp) 90 + static int psp_v10_0_init_microcode(struct psp_context *psp) 91 91 { 92 92 struct amdgpu_device *adev = psp->adev; 93 93 const char *chip_name; ··· 133 133 return err; 134 134 } 135 135 136 - int psp_v10_0_prep_cmd_buf(struct amdgpu_firmware_info *ucode, struct psp_gfx_cmd_resp *cmd) 136 + static int psp_v10_0_prep_cmd_buf(struct amdgpu_firmware_info *ucode, 137 + struct psp_gfx_cmd_resp *cmd) 137 138 { 138 139 int ret; 139 140 uint64_t fw_mem_mc_addr = ucode->mc_addr; ··· 153 152 return ret; 154 153 } 155 154 156 - int psp_v10_0_ring_init(struct psp_context *psp, enum psp_ring_type ring_type) 155 + static int psp_v10_0_ring_init(struct psp_context *psp, 156 + enum psp_ring_type ring_type) 157 157 { 158 158 int ret = 0; 159 159 struct psp_ring *ring; ··· 179 177 return 0; 180 178 } 181 179 182 - int psp_v10_0_ring_create(struct psp_context *psp, enum psp_ring_type ring_type) 180 + static int psp_v10_0_ring_create(struct psp_context *psp, 181 + enum psp_ring_type ring_type) 183 182 { 184 183 int ret = 0; 185 184 unsigned int psp_ring_reg = 0; ··· 211 208 return ret; 212 209 } 213 210 214 - int psp_v10_0_ring_stop(struct psp_context *psp, enum psp_ring_type ring_type) 211 + static int psp_v10_0_ring_stop(struct psp_context *psp, 212 + enum psp_ring_type ring_type) 215 213 { 216 214 int ret = 0; 217 215 struct psp_ring *ring; ··· 235 231 return ret; 236 232 } 237 233 238 - int psp_v10_0_ring_destroy(struct psp_context *psp, enum psp_ring_type ring_type) 234 + static int psp_v10_0_ring_destroy(struct psp_context *psp, 235 + enum psp_ring_type ring_type) 239 236 { 240 237 int ret = 0; 241 238 struct psp_ring *ring = &psp->km_ring; ··· 253 248 return ret; 254 249 } 255 250 256 - int psp_v10_0_cmd_submit(struct psp_context *psp, 257 - struct amdgpu_firmware_info *ucode, 258 - uint64_t cmd_buf_mc_addr, uint64_t fence_mc_addr, 259 - int index) 251 + static int psp_v10_0_cmd_submit(struct psp_context *psp, 252 + struct amdgpu_firmware_info *ucode, 253 + uint64_t cmd_buf_mc_addr, uint64_t fence_mc_addr, 254 + int index) 260 255 { 261 256 unsigned int psp_write_ptr_reg = 0; 262 257 struct psp_gfx_rb_frame * write_frame = psp->km_ring.ring_mem; ··· 303 298 304 299 static int 305 300 psp_v10_0_sram_map(struct amdgpu_device *adev, 306 - unsigned int *sram_offset, unsigned int *sram_addr_reg_offset, 307 - unsigned int *sram_data_reg_offset, 308 - enum AMDGPU_UCODE_ID ucode_id) 301 + unsigned int *sram_offset, unsigned int *sram_addr_reg_offset, 302 + unsigned int *sram_data_reg_offset, 303 + enum AMDGPU_UCODE_ID ucode_id) 309 304 { 310 305 int ret = 0; 311 306 ··· 388 383 return ret; 389 384 } 390 385 391 - bool psp_v10_0_compare_sram_data(struct psp_context *psp, 392 - struct amdgpu_firmware_info *ucode, 393 - enum AMDGPU_UCODE_ID ucode_type) 386 + static bool psp_v10_0_compare_sram_data(struct psp_context *psp, 387 + struct amdgpu_firmware_info *ucode, 388 + enum AMDGPU_UCODE_ID ucode_type) 394 389 { 395 390 int err = 0; 396 391 unsigned int fw_sram_reg_val = 0; ··· 424 419 } 425 420 426 421 427 - int psp_v10_0_mode1_reset(struct psp_context *psp) 422 + static int psp_v10_0_mode1_reset(struct psp_context *psp) 428 423 { 429 424 DRM_INFO("psp mode 1 reset not supported now! \n"); 430 425 return -EINVAL; 426 + } 427 + 428 + static const struct psp_funcs psp_v10_0_funcs = { 429 + .init_microcode = psp_v10_0_init_microcode, 430 + .prep_cmd_buf = psp_v10_0_prep_cmd_buf, 431 + .ring_init = psp_v10_0_ring_init, 432 + .ring_create = psp_v10_0_ring_create, 433 + .ring_stop = psp_v10_0_ring_stop, 434 + .ring_destroy = psp_v10_0_ring_destroy, 435 + .cmd_submit = psp_v10_0_cmd_submit, 436 + .compare_sram_data = psp_v10_0_compare_sram_data, 437 + .mode1_reset = psp_v10_0_mode1_reset, 438 + }; 439 + 440 + void psp_v10_0_set_psp_funcs(struct psp_context *psp) 441 + { 442 + psp->funcs = &psp_v10_0_funcs; 431 443 }
+1 -19
drivers/gpu/drm/amd/amdgpu/psp_v10_0.h
··· 27 27 28 28 #include "amdgpu_psp.h" 29 29 30 - extern int psp_v10_0_init_microcode(struct psp_context *psp); 31 - extern int psp_v10_0_prep_cmd_buf(struct amdgpu_firmware_info *ucode, 32 - struct psp_gfx_cmd_resp *cmd); 33 - extern int psp_v10_0_ring_init(struct psp_context *psp, 34 - enum psp_ring_type ring_type); 35 - extern int psp_v10_0_ring_create(struct psp_context *psp, 36 - enum psp_ring_type ring_type); 37 - extern int psp_v10_0_ring_stop(struct psp_context *psp, 38 - enum psp_ring_type ring_type); 39 - extern int psp_v10_0_ring_destroy(struct psp_context *psp, 40 - enum psp_ring_type ring_type); 41 - extern int psp_v10_0_cmd_submit(struct psp_context *psp, 42 - struct amdgpu_firmware_info *ucode, 43 - uint64_t cmd_buf_mc_addr, uint64_t fence_mc_addr, 44 - int index); 45 - extern bool psp_v10_0_compare_sram_data(struct psp_context *psp, 46 - struct amdgpu_firmware_info *ucode, 47 - enum AMDGPU_UCODE_ID ucode_type); 30 + void psp_v10_0_set_psp_funcs(struct psp_context *psp); 48 31 49 - extern int psp_v10_0_mode1_reset(struct psp_context *psp); 50 32 #endif
+45 -20
drivers/gpu/drm/amd/amdgpu/psp_v3_1.c
··· 93 93 return 0; 94 94 } 95 95 96 - int psp_v3_1_init_microcode(struct psp_context *psp) 96 + static int psp_v3_1_init_microcode(struct psp_context *psp) 97 97 { 98 98 struct amdgpu_device *adev = psp->adev; 99 99 const char *chip_name; ··· 161 161 return err; 162 162 } 163 163 164 - int psp_v3_1_bootloader_load_sysdrv(struct psp_context *psp) 164 + static int psp_v3_1_bootloader_load_sysdrv(struct psp_context *psp) 165 165 { 166 166 int ret; 167 167 uint32_t psp_gfxdrv_command_reg = 0; ··· 202 202 return ret; 203 203 } 204 204 205 - int psp_v3_1_bootloader_load_sos(struct psp_context *psp) 205 + static int psp_v3_1_bootloader_load_sos(struct psp_context *psp) 206 206 { 207 207 int ret; 208 208 unsigned int psp_gfxdrv_command_reg = 0; ··· 243 243 return ret; 244 244 } 245 245 246 - int psp_v3_1_prep_cmd_buf(struct amdgpu_firmware_info *ucode, struct psp_gfx_cmd_resp *cmd) 246 + static int psp_v3_1_prep_cmd_buf(struct amdgpu_firmware_info *ucode, 247 + struct psp_gfx_cmd_resp *cmd) 247 248 { 248 249 int ret; 249 250 uint64_t fw_mem_mc_addr = ucode->mc_addr; ··· 263 262 return ret; 264 263 } 265 264 266 - int psp_v3_1_ring_init(struct psp_context *psp, enum psp_ring_type ring_type) 265 + static int psp_v3_1_ring_init(struct psp_context *psp, 266 + enum psp_ring_type ring_type) 267 267 { 268 268 int ret = 0; 269 269 struct psp_ring *ring; ··· 289 287 return 0; 290 288 } 291 289 292 - int psp_v3_1_ring_create(struct psp_context *psp, enum psp_ring_type ring_type) 290 + static int psp_v3_1_ring_create(struct psp_context *psp, 291 + enum psp_ring_type ring_type) 293 292 { 294 293 int ret = 0; 295 294 unsigned int psp_ring_reg = 0; ··· 321 318 return ret; 322 319 } 323 320 324 - int psp_v3_1_ring_stop(struct psp_context *psp, enum psp_ring_type ring_type) 321 + static int psp_v3_1_ring_stop(struct psp_context *psp, 322 + enum psp_ring_type ring_type) 325 323 { 326 324 int ret = 0; 327 325 struct psp_ring *ring; ··· 345 341 return ret; 346 342 } 347 343 348 - int psp_v3_1_ring_destroy(struct psp_context *psp, enum psp_ring_type ring_type) 344 + static int psp_v3_1_ring_destroy(struct psp_context *psp, 345 + enum psp_ring_type ring_type) 349 346 { 350 347 int ret = 0; 351 348 struct psp_ring *ring = &psp->km_ring; ··· 363 358 return ret; 364 359 } 365 360 366 - int psp_v3_1_cmd_submit(struct psp_context *psp, 367 - struct amdgpu_firmware_info *ucode, 368 - uint64_t cmd_buf_mc_addr, uint64_t fence_mc_addr, 369 - int index) 361 + static int psp_v3_1_cmd_submit(struct psp_context *psp, 362 + struct amdgpu_firmware_info *ucode, 363 + uint64_t cmd_buf_mc_addr, uint64_t fence_mc_addr, 364 + int index) 370 365 { 371 366 unsigned int psp_write_ptr_reg = 0; 372 367 struct psp_gfx_rb_frame * write_frame = psp->km_ring.ring_mem; ··· 415 410 416 411 static int 417 412 psp_v3_1_sram_map(struct amdgpu_device *adev, 418 - unsigned int *sram_offset, unsigned int *sram_addr_reg_offset, 419 - unsigned int *sram_data_reg_offset, 420 - enum AMDGPU_UCODE_ID ucode_id) 413 + unsigned int *sram_offset, unsigned int *sram_addr_reg_offset, 414 + unsigned int *sram_data_reg_offset, 415 + enum AMDGPU_UCODE_ID ucode_id) 421 416 { 422 417 int ret = 0; 423 418 ··· 500 495 return ret; 501 496 } 502 497 503 - bool psp_v3_1_compare_sram_data(struct psp_context *psp, 504 - struct amdgpu_firmware_info *ucode, 505 - enum AMDGPU_UCODE_ID ucode_type) 498 + static bool psp_v3_1_compare_sram_data(struct psp_context *psp, 499 + struct amdgpu_firmware_info *ucode, 500 + enum AMDGPU_UCODE_ID ucode_type) 506 501 { 507 502 int err = 0; 508 503 unsigned int fw_sram_reg_val = 0; ··· 535 530 return true; 536 531 } 537 532 538 - bool psp_v3_1_smu_reload_quirk(struct psp_context *psp) 533 + static bool psp_v3_1_smu_reload_quirk(struct psp_context *psp) 539 534 { 540 535 struct amdgpu_device *adev = psp->adev; 541 536 uint32_t reg; ··· 546 541 return (reg & MP1_FIRMWARE_FLAGS__INTERRUPTS_ENABLED_MASK) ? true : false; 547 542 } 548 543 549 - int psp_v3_1_mode1_reset(struct psp_context *psp) 544 + static int psp_v3_1_mode1_reset(struct psp_context *psp) 550 545 { 551 546 int ret; 552 547 uint32_t offset; ··· 578 573 DRM_INFO("psp mode1 reset succeed \n"); 579 574 580 575 return 0; 576 + } 577 + 578 + static const struct psp_funcs psp_v3_1_funcs = { 579 + .init_microcode = psp_v3_1_init_microcode, 580 + .bootloader_load_sysdrv = psp_v3_1_bootloader_load_sysdrv, 581 + .bootloader_load_sos = psp_v3_1_bootloader_load_sos, 582 + .prep_cmd_buf = psp_v3_1_prep_cmd_buf, 583 + .ring_init = psp_v3_1_ring_init, 584 + .ring_create = psp_v3_1_ring_create, 585 + .ring_stop = psp_v3_1_ring_stop, 586 + .ring_destroy = psp_v3_1_ring_destroy, 587 + .cmd_submit = psp_v3_1_cmd_submit, 588 + .compare_sram_data = psp_v3_1_compare_sram_data, 589 + .smu_reload_quirk = psp_v3_1_smu_reload_quirk, 590 + .mode1_reset = psp_v3_1_mode1_reset, 591 + }; 592 + 593 + void psp_v3_1_set_psp_funcs(struct psp_context *psp) 594 + { 595 + psp->funcs = &psp_v3_1_funcs; 581 596 }
+2 -22
drivers/gpu/drm/amd/amdgpu/psp_v3_1.h
··· 32 32 enum { PSP_BOOTLOADER_1_MEG_ALIGNMENT = 0x100000 }; 33 33 enum { PSP_BOOTLOADER_8_MEM_ALIGNMENT = 0x800000 }; 34 34 35 - extern int psp_v3_1_init_microcode(struct psp_context *psp); 36 - extern int psp_v3_1_bootloader_load_sysdrv(struct psp_context *psp); 37 - extern int psp_v3_1_bootloader_load_sos(struct psp_context *psp); 38 - extern int psp_v3_1_prep_cmd_buf(struct amdgpu_firmware_info *ucode, 39 - struct psp_gfx_cmd_resp *cmd); 40 - extern int psp_v3_1_ring_init(struct psp_context *psp, 41 - enum psp_ring_type ring_type); 42 - extern int psp_v3_1_ring_create(struct psp_context *psp, 43 - enum psp_ring_type ring_type); 44 - extern int psp_v3_1_ring_stop(struct psp_context *psp, 45 - enum psp_ring_type ring_type); 46 - extern int psp_v3_1_ring_destroy(struct psp_context *psp, 47 - enum psp_ring_type ring_type); 48 - extern int psp_v3_1_cmd_submit(struct psp_context *psp, 49 - struct amdgpu_firmware_info *ucode, 50 - uint64_t cmd_buf_mc_addr, uint64_t fence_mc_addr, 51 - int index); 52 - extern bool psp_v3_1_compare_sram_data(struct psp_context *psp, 53 - struct amdgpu_firmware_info *ucode, 54 - enum AMDGPU_UCODE_ID ucode_type); 55 - extern bool psp_v3_1_smu_reload_quirk(struct psp_context *psp); 56 - extern int psp_v3_1_mode1_reset(struct psp_context *psp); 35 + void psp_v3_1_set_psp_funcs(struct psp_context *psp); 36 + 57 37 #endif