diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/mxgpu_vi.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/mxgpu_vi.c | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/mxgpu_vi.c b/drivers/gpu/drm/amd/amdgpu/mxgpu_vi.c index d2622b6f49fa..b8edfe5d9496 100644 --- a/drivers/gpu/drm/amd/amdgpu/mxgpu_vi.c +++ b/drivers/gpu/drm/amd/amdgpu/mxgpu_vi.c | |||
@@ -318,10 +318,25 @@ void xgpu_vi_init_golden_registers(struct amdgpu_device *adev) | |||
318 | static void xgpu_vi_mailbox_send_ack(struct amdgpu_device *adev) | 318 | static void xgpu_vi_mailbox_send_ack(struct amdgpu_device *adev) |
319 | { | 319 | { |
320 | u32 reg; | 320 | u32 reg; |
321 | int timeout = VI_MAILBOX_TIMEDOUT; | ||
322 | u32 mask = REG_FIELD_MASK(MAILBOX_CONTROL, RCV_MSG_VALID); | ||
321 | 323 | ||
322 | reg = RREG32(mmMAILBOX_CONTROL); | 324 | reg = RREG32(mmMAILBOX_CONTROL); |
323 | reg = REG_SET_FIELD(reg, MAILBOX_CONTROL, RCV_MSG_ACK, 1); | 325 | reg = REG_SET_FIELD(reg, MAILBOX_CONTROL, RCV_MSG_ACK, 1); |
324 | WREG32(mmMAILBOX_CONTROL, reg); | 326 | WREG32(mmMAILBOX_CONTROL, reg); |
327 | |||
328 | /*Wait for RCV_MSG_VALID to be 0*/ | ||
329 | reg = RREG32(mmMAILBOX_CONTROL); | ||
330 | while (reg & mask) { | ||
331 | if (timeout <= 0) { | ||
332 | pr_err("RCV_MSG_VALID is not cleared\n"); | ||
333 | break; | ||
334 | } | ||
335 | mdelay(1); | ||
336 | timeout -=1; | ||
337 | |||
338 | reg = RREG32(mmMAILBOX_CONTROL); | ||
339 | } | ||
325 | } | 340 | } |
326 | 341 | ||
327 | static void xgpu_vi_mailbox_set_valid(struct amdgpu_device *adev, bool val) | 342 | static void xgpu_vi_mailbox_set_valid(struct amdgpu_device *adev, bool val) |
@@ -351,6 +366,11 @@ static int xgpu_vi_mailbox_rcv_msg(struct amdgpu_device *adev, | |||
351 | enum idh_event event) | 366 | enum idh_event event) |
352 | { | 367 | { |
353 | u32 reg; | 368 | u32 reg; |
369 | u32 mask = REG_FIELD_MASK(MAILBOX_CONTROL, RCV_MSG_VALID); | ||
370 | |||
371 | reg = RREG32(mmMAILBOX_CONTROL); | ||
372 | if (!(reg & mask)) | ||
373 | return -ENOENT; | ||
354 | 374 | ||
355 | reg = RREG32(mmMAILBOX_MSGBUF_RCV_DW0); | 375 | reg = RREG32(mmMAILBOX_MSGBUF_RCV_DW0); |
356 | if (reg != event) | 376 | if (reg != event) |
@@ -419,7 +439,9 @@ static int xgpu_vi_send_access_requests(struct amdgpu_device *adev, | |||
419 | xgpu_vi_mailbox_set_valid(adev, false); | 439 | xgpu_vi_mailbox_set_valid(adev, false); |
420 | 440 | ||
421 | /* start to check msg if request is idh_req_gpu_init_access */ | 441 | /* start to check msg if request is idh_req_gpu_init_access */ |
422 | if (request == IDH_REQ_GPU_INIT_ACCESS) { | 442 | if (request == IDH_REQ_GPU_INIT_ACCESS || |
443 | request == IDH_REQ_GPU_FINI_ACCESS || | ||
444 | request == IDH_REQ_GPU_RESET_ACCESS) { | ||
423 | r = xgpu_vi_poll_msg(adev, IDH_READY_TO_ACCESS_GPU); | 445 | r = xgpu_vi_poll_msg(adev, IDH_READY_TO_ACCESS_GPU); |
424 | if (r) | 446 | if (r) |
425 | return r; | 447 | return r; |