diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | 19 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | 19 |
2 files changed, 29 insertions, 9 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c index b8e50a34bdb3..41cf9d0224d9 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | |||
@@ -4223,8 +4223,8 @@ static void gfx_v8_0_set_cpg_door_bell(struct amdgpu_device *adev, struct amdgpu | |||
4223 | adev->doorbell_index.gfx_ring0); | 4223 | adev->doorbell_index.gfx_ring0); |
4224 | WREG32(mmCP_RB_DOORBELL_RANGE_LOWER, tmp); | 4224 | WREG32(mmCP_RB_DOORBELL_RANGE_LOWER, tmp); |
4225 | 4225 | ||
4226 | WREG32(mmCP_RB_DOORBELL_RANGE_UPPER, | 4226 | /* There is only one GFX queue */ |
4227 | CP_RB_DOORBELL_RANGE_UPPER__DOORBELL_RANGE_UPPER_MASK); | 4227 | WREG32(mmCP_RB_DOORBELL_RANGE_UPPER, tmp); |
4228 | } | 4228 | } |
4229 | 4229 | ||
4230 | static int gfx_v8_0_cp_gfx_resume(struct amdgpu_device *adev) | 4230 | static int gfx_v8_0_cp_gfx_resume(struct amdgpu_device *adev) |
@@ -4646,8 +4646,19 @@ static int gfx_v8_0_kcq_init_queue(struct amdgpu_ring *ring) | |||
4646 | static void gfx_v8_0_set_mec_doorbell_range(struct amdgpu_device *adev) | 4646 | static void gfx_v8_0_set_mec_doorbell_range(struct amdgpu_device *adev) |
4647 | { | 4647 | { |
4648 | if (adev->asic_type > CHIP_TONGA) { | 4648 | if (adev->asic_type > CHIP_TONGA) { |
4649 | WREG32(mmCP_MEC_DOORBELL_RANGE_LOWER, adev->doorbell_index.kiq << 2); | 4649 | /* The first few doorbells in pci doorbell bar are for GFX RB |
4650 | WREG32(mmCP_MEC_DOORBELL_RANGE_UPPER, adev->doorbell_index.mec_ring7 << 2); | 4650 | * rings and all the leftover for MEC. |
4651 | * So CP_MEC_DOORBELL_RANGE_LOWER should be set one index after | ||
4652 | * CP_RB_DOORBELL_RANGE_UPPER, as we assume there is only one | ||
4653 | * GFX RB rings. | ||
4654 | */ | ||
4655 | u32 tmp = REG_SET_FIELD(0, CP_MEC_DOORBELL_RANGE_LOWER, | ||
4656 | DOORBELL_RANGE_LOWER, | ||
4657 | adev->gfx.gfx_ring[0].doorbell_index + 1); | ||
4658 | |||
4659 | WREG32(mmCP_MEC_DOORBELL_RANGE_LOWER, tmp); | ||
4660 | WREG32(mmCP_MEC_DOORBELL_RANGE_UPPER, | ||
4661 | CP_MEC_DOORBELL_RANGE_UPPER__DOORBELL_RANGE_UPPER_MASK); | ||
4651 | } | 4662 | } |
4652 | /* enable doorbells */ | 4663 | /* enable doorbells */ |
4653 | WREG32_FIELD(CP_PQ_STATUS, DOORBELL_ENABLE, 1); | 4664 | WREG32_FIELD(CP_PQ_STATUS, DOORBELL_ENABLE, 1); |
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c index 5533f6e4f4a4..36f417fd6ba9 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | |||
@@ -2631,8 +2631,8 @@ static int gfx_v9_0_cp_gfx_resume(struct amdgpu_device *adev) | |||
2631 | DOORBELL_RANGE_LOWER, ring->doorbell_index); | 2631 | DOORBELL_RANGE_LOWER, ring->doorbell_index); |
2632 | WREG32_SOC15(GC, 0, mmCP_RB_DOORBELL_RANGE_LOWER, tmp); | 2632 | WREG32_SOC15(GC, 0, mmCP_RB_DOORBELL_RANGE_LOWER, tmp); |
2633 | 2633 | ||
2634 | WREG32_SOC15(GC, 0, mmCP_RB_DOORBELL_RANGE_UPPER, | 2634 | /* There is only one GFX queue */ |
2635 | CP_RB_DOORBELL_RANGE_UPPER__DOORBELL_RANGE_UPPER_MASK); | 2635 | WREG32_SOC15(GC, 0, mmCP_RB_DOORBELL_RANGE_UPPER, tmp); |
2636 | 2636 | ||
2637 | 2637 | ||
2638 | /* start the ring */ | 2638 | /* start the ring */ |
@@ -2995,10 +2995,19 @@ static int gfx_v9_0_kiq_init_register(struct amdgpu_ring *ring) | |||
2995 | 2995 | ||
2996 | /* enable the doorbell if requested */ | 2996 | /* enable the doorbell if requested */ |
2997 | if (ring->use_doorbell) { | 2997 | if (ring->use_doorbell) { |
2998 | WREG32_SOC15(GC, 0, mmCP_MEC_DOORBELL_RANGE_LOWER, | 2998 | /* The first few doorbells in pci doorbell bar are for GFX RB |
2999 | (adev->doorbell_index.kiq * 2) << 2); | 2999 | * rings and all the leftover for MEC. |
3000 | * So CP_MEC_DOORBELL_RANGE_LOWER should be set one index after | ||
3001 | * CP_RB_DOORBELL_RANGE_UPPER, as we assume there is only one | ||
3002 | * GFX RB rings. | ||
3003 | */ | ||
3004 | u32 tmp = REG_SET_FIELD(0, CP_MEC_DOORBELL_RANGE_LOWER, | ||
3005 | DOORBELL_RANGE_LOWER, | ||
3006 | adev->gfx.gfx_ring[0].doorbell_index + 2); | ||
3007 | |||
3008 | WREG32_SOC15(GC, 0, mmCP_MEC_DOORBELL_RANGE_LOWER, tmp); | ||
3000 | WREG32_SOC15(GC, 0, mmCP_MEC_DOORBELL_RANGE_UPPER, | 3009 | WREG32_SOC15(GC, 0, mmCP_MEC_DOORBELL_RANGE_UPPER, |
3001 | (adev->doorbell_index.userqueue_end * 2) << 2); | 3010 | CP_MEC_DOORBELL_RANGE_UPPER__DOORBELL_RANGE_UPPER_MASK); |
3002 | } | 3011 | } |
3003 | 3012 | ||
3004 | WREG32_SOC15(GC, 0, mmCP_HQD_PQ_DOORBELL_CONTROL, | 3013 | WREG32_SOC15(GC, 0, mmCP_HQD_PQ_DOORBELL_CONTROL, |