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

drm/amdgpu: add dummy event6 for vega10

[why]
Malicious mailbox event1 fails driver loading on vega10.
A dummy event6 prevent driver from taking response from malicious event1 as its own.

[how]
On vega10, send a mailbox event6 before sending event1.

Signed-off-by: James Yao <yiqing.yao@amd.com>
Reviewed-by: Jingwen Chen <Jingwen.Chen2@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

James Yao and committed by
Alex Deucher
216a9873 5b0ce2d4

+17
+4
drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c
··· 727 727 vi_set_virt_ops(adev); 728 728 break; 729 729 case CHIP_VEGA10: 730 + soc15_set_virt_ops(adev); 731 + /* send a dummy GPU_INIT_DATA request to host on vega10 */ 732 + amdgpu_virt_request_init_data(adev); 733 + break; 730 734 case CHIP_VEGA20: 731 735 case CHIP_ARCTURUS: 732 736 case CHIP_ALDEBARAN:
+11
drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c
··· 180 180 RREG32_NO_KIQ(SOC15_REG_OFFSET(NBIO, 0, 181 181 mmBIF_BX_PF0_MAILBOX_MSGBUF_RCV_DW2)); 182 182 } 183 + } else if (req == IDH_REQ_GPU_INIT_DATA){ 184 + /* Dummy REQ_GPU_INIT_DATA handling */ 185 + r = xgpu_ai_poll_msg(adev, IDH_REQ_GPU_INIT_DATA_READY); 186 + /* version set to 0 since dummy */ 187 + adev->virt.req_init_data_ver = 0; 183 188 } 184 189 185 190 return 0; ··· 386 381 amdgpu_irq_put(adev, &adev->virt.rcv_irq, 0); 387 382 } 388 383 384 + static int xgpu_ai_request_init_data(struct amdgpu_device *adev) 385 + { 386 + return xgpu_ai_send_access_requests(adev, IDH_REQ_GPU_INIT_DATA); 387 + } 388 + 389 389 const struct amdgpu_virt_ops xgpu_ai_virt_ops = { 390 390 .req_full_gpu = xgpu_ai_request_full_gpu_access, 391 391 .rel_full_gpu = xgpu_ai_release_full_gpu_access, 392 392 .reset_gpu = xgpu_ai_request_reset, 393 393 .wait_reset = NULL, 394 394 .trans_msg = xgpu_ai_mailbox_trans_msg, 395 + .req_init_data = xgpu_ai_request_init_data, 395 396 };
+2
drivers/gpu/drm/amd/amdgpu/mxgpu_ai.h
··· 35 35 IDH_REQ_GPU_FINI_ACCESS, 36 36 IDH_REL_GPU_FINI_ACCESS, 37 37 IDH_REQ_GPU_RESET_ACCESS, 38 + IDH_REQ_GPU_INIT_DATA, 38 39 39 40 IDH_LOG_VF_ERROR = 200, 40 41 IDH_READY_TO_RESET = 201, ··· 49 48 IDH_SUCCESS, 50 49 IDH_FAIL, 51 50 IDH_QUERY_ALIVE, 51 + IDH_REQ_GPU_INIT_DATA_READY, 52 52 53 53 IDH_TEXT_MESSAGE = 255, 54 54 };