aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChunming Zhou <David1.Zhou@amd.com>2016-07-18 05:02:57 -0400
committerAlex Deucher <alexander.deucher@amd.com>2016-08-08 11:32:10 -0400
commit1015a1b1750e578868a96d812d388d3c65d7faaf (patch)
treea80cc40ec6f4179b4e004c649f3c07c9f58d512b
parent50b0197abfa062d05f5f14a94e04ed7fd45cb003 (diff)
drm/amdgpu: implement vi ih check/pre/post_soft_reset
Signed-off-by: Chunming Zhou <David1.Zhou@amd.com> Reviewed-by: Christian König <christian.koenig@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_device.c1
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_irq.h1
-rw-r--r--drivers/gpu/drm/amd/amdgpu/tonga_ih.c49
3 files changed, 48 insertions, 3 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index 47f29f9e6df5..3640b124851e 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -1976,7 +1976,6 @@ int amdgpu_pre_soft_reset(struct amdgpu_device *adev)
1976static bool amdgpu_need_full_reset(struct amdgpu_device *adev) 1976static bool amdgpu_need_full_reset(struct amdgpu_device *adev)
1977{ 1977{
1978 if (adev->ip_block_status[AMD_IP_BLOCK_TYPE_GMC].hang || 1978 if (adev->ip_block_status[AMD_IP_BLOCK_TYPE_GMC].hang ||
1979 adev->ip_block_status[AMD_IP_BLOCK_TYPE_IH].hang ||
1980 adev->ip_block_status[AMD_IP_BLOCK_TYPE_SMC].hang || 1979 adev->ip_block_status[AMD_IP_BLOCK_TYPE_SMC].hang ||
1981 adev->ip_block_status[AMD_IP_BLOCK_TYPE_UVD].hang || 1980 adev->ip_block_status[AMD_IP_BLOCK_TYPE_UVD].hang ||
1982 adev->ip_block_status[AMD_IP_BLOCK_TYPE_VCE].hang || 1981 adev->ip_block_status[AMD_IP_BLOCK_TYPE_VCE].hang ||
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.h
index 7ef09352e534..f016464035b8 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.h
@@ -70,6 +70,7 @@ struct amdgpu_irq {
70 /* gen irq stuff */ 70 /* gen irq stuff */
71 struct irq_domain *domain; /* GPU irq controller domain */ 71 struct irq_domain *domain; /* GPU irq controller domain */
72 unsigned virq[AMDGPU_MAX_IRQ_SRC_ID]; 72 unsigned virq[AMDGPU_MAX_IRQ_SRC_ID];
73 uint32_t srbm_soft_reset;
73}; 74};
74 75
75void amdgpu_irq_preinstall(struct drm_device *dev); 76void amdgpu_irq_preinstall(struct drm_device *dev);
diff --git a/drivers/gpu/drm/amd/amdgpu/tonga_ih.c b/drivers/gpu/drm/amd/amdgpu/tonga_ih.c
index c92055805a45..d127d59f953a 100644
--- a/drivers/gpu/drm/amd/amdgpu/tonga_ih.c
+++ b/drivers/gpu/drm/amd/amdgpu/tonga_ih.c
@@ -373,10 +373,10 @@ static int tonga_ih_wait_for_idle(void *handle)
373 return -ETIMEDOUT; 373 return -ETIMEDOUT;
374} 374}
375 375
376static int tonga_ih_soft_reset(void *handle) 376static int tonga_ih_check_soft_reset(void *handle)
377{ 377{
378 u32 srbm_soft_reset = 0;
379 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 378 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
379 u32 srbm_soft_reset = 0;
380 u32 tmp = RREG32(mmSRBM_STATUS); 380 u32 tmp = RREG32(mmSRBM_STATUS);
381 381
382 if (tmp & SRBM_STATUS__IH_BUSY_MASK) 382 if (tmp & SRBM_STATUS__IH_BUSY_MASK)
@@ -384,6 +384,48 @@ static int tonga_ih_soft_reset(void *handle)
384 SOFT_RESET_IH, 1); 384 SOFT_RESET_IH, 1);
385 385
386 if (srbm_soft_reset) { 386 if (srbm_soft_reset) {
387 adev->ip_block_status[AMD_IP_BLOCK_TYPE_IH].hang = true;
388 adev->irq.srbm_soft_reset = srbm_soft_reset;
389 } else {
390 adev->ip_block_status[AMD_IP_BLOCK_TYPE_IH].hang = false;
391 adev->irq.srbm_soft_reset = 0;
392 }
393
394 return 0;
395}
396
397static int tonga_ih_pre_soft_reset(void *handle)
398{
399 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
400
401 if (!adev->ip_block_status[AMD_IP_BLOCK_TYPE_IH].hang)
402 return 0;
403
404 return tonga_ih_hw_fini(adev);
405}
406
407static int tonga_ih_post_soft_reset(void *handle)
408{
409 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
410
411 if (!adev->ip_block_status[AMD_IP_BLOCK_TYPE_IH].hang)
412 return 0;
413
414 return tonga_ih_hw_init(adev);
415}
416
417static int tonga_ih_soft_reset(void *handle)
418{
419 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
420 u32 srbm_soft_reset;
421
422 if (!adev->ip_block_status[AMD_IP_BLOCK_TYPE_IH].hang)
423 return 0;
424 srbm_soft_reset = adev->irq.srbm_soft_reset;
425
426 if (srbm_soft_reset) {
427 u32 tmp;
428
387 tmp = RREG32(mmSRBM_SOFT_RESET); 429 tmp = RREG32(mmSRBM_SOFT_RESET);
388 tmp |= srbm_soft_reset; 430 tmp |= srbm_soft_reset;
389 dev_info(adev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp); 431 dev_info(adev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp);
@@ -427,7 +469,10 @@ const struct amd_ip_funcs tonga_ih_ip_funcs = {
427 .resume = tonga_ih_resume, 469 .resume = tonga_ih_resume,
428 .is_idle = tonga_ih_is_idle, 470 .is_idle = tonga_ih_is_idle,
429 .wait_for_idle = tonga_ih_wait_for_idle, 471 .wait_for_idle = tonga_ih_wait_for_idle,
472 .check_soft_reset = tonga_ih_check_soft_reset,
473 .pre_soft_reset = tonga_ih_pre_soft_reset,
430 .soft_reset = tonga_ih_soft_reset, 474 .soft_reset = tonga_ih_soft_reset,
475 .post_soft_reset = tonga_ih_post_soft_reset,
431 .set_clockgating_state = tonga_ih_set_clockgating_state, 476 .set_clockgating_state = tonga_ih_set_clockgating_state,
432 .set_powergating_state = tonga_ih_set_powergating_state, 477 .set_powergating_state = tonga_ih_set_powergating_state,
433}; 478};