diff options
author | Chunming Zhou <David1.Zhou@amd.com> | 2016-07-18 05:02:57 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2016-08-08 11:32:10 -0400 |
commit | 1015a1b1750e578868a96d812d388d3c65d7faaf (patch) | |
tree | a80cc40ec6f4179b4e004c649f3c07c9f58d512b | |
parent | 50b0197abfa062d05f5f14a94e04ed7fd45cb003 (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.c | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_irq.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/tonga_ih.c | 49 |
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) | |||
1976 | static bool amdgpu_need_full_reset(struct amdgpu_device *adev) | 1976 | static 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 | ||
75 | void amdgpu_irq_preinstall(struct drm_device *dev); | 76 | void 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 | ||
376 | static int tonga_ih_soft_reset(void *handle) | 376 | static 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 | |||
397 | static 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 | |||
407 | static 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 | |||
417 | static 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 | }; |