aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c
diff options
context:
space:
mode:
authorGavin Wan <Gavin.Wan@amd.com>2017-06-23 13:55:15 -0400
committerAlex Deucher <alexander.deucher@amd.com>2017-07-14 11:05:52 -0400
commit890419409a3aba2ca7185a824e47d8ded8df11a2 (patch)
tree0b9575763284a062e87738446a7c77c44095fb98 /drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c
parent8e1b90cc44181405418071a13ead5892c3879239 (diff)
drm/amdgpu: Support passing amdgpu critical error to host via GPU Mailbox.
This feature works for SRIOV enviroment. For non-SRIOV enviroment, the trans_error function does nothing. The error information includes error_code (16bit), error_flags(16bit) and error_data(64bit). Since there are not many errors, we keep the errors in an array and transfer all errors to Host before amdgpu initialization function (amdgpu_device_init) exit. Signed-off-by: Gavin Wan <Gavin.Wan@amd.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c46
1 files changed, 26 insertions, 20 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c b/drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c
index bde3ca3c21c1..2812d88a8bdd 100644
--- a/drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c
+++ b/drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c
@@ -72,21 +72,6 @@ static void xgpu_ai_mailbox_set_valid(struct amdgpu_device *adev, bool val)
72 reg); 72 reg);
73} 73}
74 74
75static void xgpu_ai_mailbox_trans_msg(struct amdgpu_device *adev,
76 enum idh_request req)
77{
78 u32 reg;
79
80 reg = RREG32_NO_KIQ(SOC15_REG_OFFSET(NBIO, 0,
81 mmBIF_BX_PF0_MAILBOX_MSGBUF_TRN_DW0));
82 reg = REG_SET_FIELD(reg, BIF_BX_PF0_MAILBOX_MSGBUF_TRN_DW0,
83 MSGBUF_DATA, req);
84 WREG32_NO_KIQ(SOC15_REG_OFFSET(NBIO, 0, mmBIF_BX_PF0_MAILBOX_MSGBUF_TRN_DW0),
85 reg);
86
87 xgpu_ai_mailbox_set_valid(adev, true);
88}
89
90static int xgpu_ai_mailbox_rcv_msg(struct amdgpu_device *adev, 75static int xgpu_ai_mailbox_rcv_msg(struct amdgpu_device *adev,
91 enum idh_event event) 76 enum idh_event event)
92{ 77{
@@ -154,13 +139,25 @@ static int xgpu_ai_poll_msg(struct amdgpu_device *adev, enum idh_event event)
154 return r; 139 return r;
155} 140}
156 141
157 142static void xgpu_ai_mailbox_trans_msg (struct amdgpu_device *adev,
158static int xgpu_ai_send_access_requests(struct amdgpu_device *adev, 143 enum idh_request req, u32 data1, u32 data2, u32 data3) {
159 enum idh_request req) 144 u32 reg;
160{
161 int r; 145 int r;
162 146
163 xgpu_ai_mailbox_trans_msg(adev, req); 147 reg = RREG32_NO_KIQ(SOC15_REG_OFFSET(NBIO, 0,
148 mmBIF_BX_PF0_MAILBOX_MSGBUF_TRN_DW0));
149 reg = REG_SET_FIELD(reg, BIF_BX_PF0_MAILBOX_MSGBUF_TRN_DW0,
150 MSGBUF_DATA, req);
151 WREG32_NO_KIQ(SOC15_REG_OFFSET(NBIO, 0, mmBIF_BX_PF0_MAILBOX_MSGBUF_TRN_DW0),
152 reg);
153 WREG32_NO_KIQ(SOC15_REG_OFFSET(NBIO, 0, mmBIF_BX_PF0_MAILBOX_MSGBUF_TRN_DW1),
154 data1);
155 WREG32_NO_KIQ(SOC15_REG_OFFSET(NBIO, 0, mmBIF_BX_PF0_MAILBOX_MSGBUF_TRN_DW2),
156 data2);
157 WREG32_NO_KIQ(SOC15_REG_OFFSET(NBIO, 0, mmBIF_BX_PF0_MAILBOX_MSGBUF_TRN_DW3),
158 data3);
159
160 xgpu_ai_mailbox_set_valid(adev, true);
164 161
165 /* start to poll ack */ 162 /* start to poll ack */
166 r = xgpu_ai_poll_ack(adev); 163 r = xgpu_ai_poll_ack(adev);
@@ -168,6 +165,14 @@ static int xgpu_ai_send_access_requests(struct amdgpu_device *adev,
168 pr_err("Doesn't get ack from pf, continue\n"); 165 pr_err("Doesn't get ack from pf, continue\n");
169 166
170 xgpu_ai_mailbox_set_valid(adev, false); 167 xgpu_ai_mailbox_set_valid(adev, false);
168}
169
170static int xgpu_ai_send_access_requests(struct amdgpu_device *adev,
171 enum idh_request req)
172{
173 int r;
174
175 xgpu_ai_mailbox_trans_msg(adev, req, 0, 0, 0);
171 176
172 /* start to check msg if request is idh_req_gpu_init_access */ 177 /* start to check msg if request is idh_req_gpu_init_access */
173 if (req == IDH_REQ_GPU_INIT_ACCESS || 178 if (req == IDH_REQ_GPU_INIT_ACCESS ||
@@ -342,4 +347,5 @@ const struct amdgpu_virt_ops xgpu_ai_virt_ops = {
342 .req_full_gpu = xgpu_ai_request_full_gpu_access, 347 .req_full_gpu = xgpu_ai_request_full_gpu_access,
343 .rel_full_gpu = xgpu_ai_release_full_gpu_access, 348 .rel_full_gpu = xgpu_ai_release_full_gpu_access,
344 .reset_gpu = xgpu_ai_request_reset, 349 .reset_gpu = xgpu_ai_request_reset,
350 .trans_msg = xgpu_ai_mailbox_trans_msg,
345}; 351};