diff options
author | Gavin Wan <Gavin.Wan@amd.com> | 2017-06-23 13:55:15 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2017-07-14 11:05:52 -0400 |
commit | 890419409a3aba2ca7185a824e47d8ded8df11a2 (patch) | |
tree | 0b9575763284a062e87738446a7c77c44095fb98 /drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c | |
parent | 8e1b90cc44181405418071a13ead5892c3879239 (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.c | 46 |
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 | ||
75 | static 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 | |||
90 | static int xgpu_ai_mailbox_rcv_msg(struct amdgpu_device *adev, | 75 | static 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 | 142 | static void xgpu_ai_mailbox_trans_msg (struct amdgpu_device *adev, | |
158 | static 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 | |||
170 | static 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 | }; |