aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h6
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c28
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c30
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c28
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c30
5 files changed, 78 insertions, 44 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h
index b61b5c11aead..0a7c285c0454 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h
@@ -41,6 +41,12 @@
41struct amdgpu_rlc_funcs { 41struct amdgpu_rlc_funcs {
42 void (*enter_safe_mode)(struct amdgpu_device *adev); 42 void (*enter_safe_mode)(struct amdgpu_device *adev);
43 void (*exit_safe_mode)(struct amdgpu_device *adev); 43 void (*exit_safe_mode)(struct amdgpu_device *adev);
44 int (*init)(struct amdgpu_device *adev);
45 void (*fini)(struct amdgpu_device *adev);
46 int (*resume)(struct amdgpu_device *adev);
47 void (*stop)(struct amdgpu_device *adev);
48 void (*reset)(struct amdgpu_device *adev);
49 void (*start)(struct amdgpu_device *adev);
44}; 50};
45 51
46struct amdgpu_rlc { 52struct amdgpu_rlc {
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
index 5b25c26fa30e..2082347a374f 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
@@ -2386,7 +2386,7 @@ static int gfx_v6_0_rlc_init(struct amdgpu_device *adev)
2386 if (r) { 2386 if (r) {
2387 dev_warn(adev->dev, "(%d) create RLC sr bo failed\n", 2387 dev_warn(adev->dev, "(%d) create RLC sr bo failed\n",
2388 r); 2388 r);
2389 gfx_v6_0_rlc_fini(adev); 2389 adev->gfx.rlc.funcs->fini(adev);
2390 return r; 2390 return r;
2391 } 2391 }
2392 2392
@@ -2411,7 +2411,7 @@ static int gfx_v6_0_rlc_init(struct amdgpu_device *adev)
2411 (void **)&adev->gfx.rlc.cs_ptr); 2411 (void **)&adev->gfx.rlc.cs_ptr);
2412 if (r) { 2412 if (r) {
2413 dev_warn(adev->dev, "(%d) create RLC c bo failed\n", r); 2413 dev_warn(adev->dev, "(%d) create RLC c bo failed\n", r);
2414 gfx_v6_0_rlc_fini(adev); 2414 adev->gfx.rlc.funcs->fini(adev);
2415 return r; 2415 return r;
2416 } 2416 }
2417 2417
@@ -2532,8 +2532,8 @@ static int gfx_v6_0_rlc_resume(struct amdgpu_device *adev)
2532 if (!adev->gfx.rlc_fw) 2532 if (!adev->gfx.rlc_fw)
2533 return -EINVAL; 2533 return -EINVAL;
2534 2534
2535 gfx_v6_0_rlc_stop(adev); 2535 adev->gfx.rlc.funcs->stop(adev);
2536 gfx_v6_0_rlc_reset(adev); 2536 adev->gfx.rlc.funcs->reset(adev);
2537 gfx_v6_0_init_pg(adev); 2537 gfx_v6_0_init_pg(adev);
2538 gfx_v6_0_init_cg(adev); 2538 gfx_v6_0_init_cg(adev);
2539 2539
@@ -2561,7 +2561,7 @@ static int gfx_v6_0_rlc_resume(struct amdgpu_device *adev)
2561 WREG32(mmRLC_UCODE_ADDR, 0); 2561 WREG32(mmRLC_UCODE_ADDR, 0);
2562 2562
2563 gfx_v6_0_enable_lbpw(adev, gfx_v6_0_lbpw_supported(adev)); 2563 gfx_v6_0_enable_lbpw(adev, gfx_v6_0_lbpw_supported(adev));
2564 gfx_v6_0_rlc_start(adev); 2564 adev->gfx.rlc.funcs->start(adev);
2565 2565
2566 return 0; 2566 return 0;
2567} 2567}
@@ -3058,6 +3058,15 @@ static const struct amdgpu_gfx_funcs gfx_v6_0_gfx_funcs = {
3058 .select_me_pipe_q = &gfx_v6_0_select_me_pipe_q 3058 .select_me_pipe_q = &gfx_v6_0_select_me_pipe_q
3059}; 3059};
3060 3060
3061static const struct amdgpu_rlc_funcs gfx_v6_0_rlc_funcs = {
3062 .init = gfx_v6_0_rlc_init,
3063 .fini = gfx_v6_0_rlc_fini,
3064 .resume = gfx_v6_0_rlc_resume,
3065 .stop = gfx_v6_0_rlc_stop,
3066 .reset = gfx_v6_0_rlc_reset,
3067 .start = gfx_v6_0_rlc_start
3068};
3069
3061static int gfx_v6_0_early_init(void *handle) 3070static int gfx_v6_0_early_init(void *handle)
3062{ 3071{
3063 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 3072 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
@@ -3065,6 +3074,7 @@ static int gfx_v6_0_early_init(void *handle)
3065 adev->gfx.num_gfx_rings = GFX6_NUM_GFX_RINGS; 3074 adev->gfx.num_gfx_rings = GFX6_NUM_GFX_RINGS;
3066 adev->gfx.num_compute_rings = GFX6_NUM_COMPUTE_RINGS; 3075 adev->gfx.num_compute_rings = GFX6_NUM_COMPUTE_RINGS;
3067 adev->gfx.funcs = &gfx_v6_0_gfx_funcs; 3076 adev->gfx.funcs = &gfx_v6_0_gfx_funcs;
3077 adev->gfx.rlc.funcs = &gfx_v6_0_rlc_funcs;
3068 gfx_v6_0_set_ring_funcs(adev); 3078 gfx_v6_0_set_ring_funcs(adev);
3069 gfx_v6_0_set_irq_funcs(adev); 3079 gfx_v6_0_set_irq_funcs(adev);
3070 3080
@@ -3097,7 +3107,7 @@ static int gfx_v6_0_sw_init(void *handle)
3097 return r; 3107 return r;
3098 } 3108 }
3099 3109
3100 r = gfx_v6_0_rlc_init(adev); 3110 r = adev->gfx.rlc.funcs->init(adev);
3101 if (r) { 3111 if (r) {
3102 DRM_ERROR("Failed to init rlc BOs!\n"); 3112 DRM_ERROR("Failed to init rlc BOs!\n");
3103 return r; 3113 return r;
@@ -3148,7 +3158,7 @@ static int gfx_v6_0_sw_fini(void *handle)
3148 for (i = 0; i < adev->gfx.num_compute_rings; i++) 3158 for (i = 0; i < adev->gfx.num_compute_rings; i++)
3149 amdgpu_ring_fini(&adev->gfx.compute_ring[i]); 3159 amdgpu_ring_fini(&adev->gfx.compute_ring[i]);
3150 3160
3151 gfx_v6_0_rlc_fini(adev); 3161 adev->gfx.rlc.funcs->fini(adev);
3152 3162
3153 return 0; 3163 return 0;
3154} 3164}
@@ -3160,7 +3170,7 @@ static int gfx_v6_0_hw_init(void *handle)
3160 3170
3161 gfx_v6_0_constants_init(adev); 3171 gfx_v6_0_constants_init(adev);
3162 3172
3163 r = gfx_v6_0_rlc_resume(adev); 3173 r = adev->gfx.rlc.funcs->resume(adev);
3164 if (r) 3174 if (r)
3165 return r; 3175 return r;
3166 3176
@@ -3178,7 +3188,7 @@ static int gfx_v6_0_hw_fini(void *handle)
3178 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 3188 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
3179 3189
3180 gfx_v6_0_cp_enable(adev, false); 3190 gfx_v6_0_cp_enable(adev, false);
3181 gfx_v6_0_rlc_stop(adev); 3191 adev->gfx.rlc.funcs->stop(adev);
3182 gfx_v6_0_fini_pg(adev); 3192 gfx_v6_0_fini_pg(adev);
3183 3193
3184 return 0; 3194 return 0;
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
index 243b8c502ca6..d8e2ad875cfe 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
@@ -3298,7 +3298,7 @@ static int gfx_v7_0_rlc_init(struct amdgpu_device *adev)
3298 (void **)&adev->gfx.rlc.sr_ptr); 3298 (void **)&adev->gfx.rlc.sr_ptr);
3299 if (r) { 3299 if (r) {
3300 dev_warn(adev->dev, "(%d) create, pin or map of RLC sr bo failed\n", r); 3300 dev_warn(adev->dev, "(%d) create, pin or map of RLC sr bo failed\n", r);
3301 gfx_v7_0_rlc_fini(adev); 3301 adev->gfx.rlc.funcs->fini(adev);
3302 return r; 3302 return r;
3303 } 3303 }
3304 3304
@@ -3321,7 +3321,7 @@ static int gfx_v7_0_rlc_init(struct amdgpu_device *adev)
3321 (void **)&adev->gfx.rlc.cs_ptr); 3321 (void **)&adev->gfx.rlc.cs_ptr);
3322 if (r) { 3322 if (r) {
3323 dev_warn(adev->dev, "(%d) create RLC c bo failed\n", r); 3323 dev_warn(adev->dev, "(%d) create RLC c bo failed\n", r);
3324 gfx_v7_0_rlc_fini(adev); 3324 adev->gfx.rlc.funcs->fini(adev);
3325 return r; 3325 return r;
3326 } 3326 }
3327 3327
@@ -3341,7 +3341,7 @@ static int gfx_v7_0_rlc_init(struct amdgpu_device *adev)
3341 (void **)&adev->gfx.rlc.cp_table_ptr); 3341 (void **)&adev->gfx.rlc.cp_table_ptr);
3342 if (r) { 3342 if (r) {
3343 dev_warn(adev->dev, "(%d) create RLC cp table bo failed\n", r); 3343 dev_warn(adev->dev, "(%d) create RLC cp table bo failed\n", r);
3344 gfx_v7_0_rlc_fini(adev); 3344 adev->gfx.rlc.funcs->fini(adev);
3345 return r; 3345 return r;
3346 } 3346 }
3347 3347
@@ -3529,13 +3529,13 @@ static int gfx_v7_0_rlc_resume(struct amdgpu_device *adev)
3529 adev->gfx.rlc_feature_version = le32_to_cpu( 3529 adev->gfx.rlc_feature_version = le32_to_cpu(
3530 hdr->ucode_feature_version); 3530 hdr->ucode_feature_version);
3531 3531
3532 gfx_v7_0_rlc_stop(adev); 3532 adev->gfx.rlc.funcs->stop(adev);
3533 3533
3534 /* disable CG */ 3534 /* disable CG */
3535 tmp = RREG32(mmRLC_CGCG_CGLS_CTRL) & 0xfffffffc; 3535 tmp = RREG32(mmRLC_CGCG_CGLS_CTRL) & 0xfffffffc;
3536 WREG32(mmRLC_CGCG_CGLS_CTRL, tmp); 3536 WREG32(mmRLC_CGCG_CGLS_CTRL, tmp);
3537 3537
3538 gfx_v7_0_rlc_reset(adev); 3538 adev->gfx.rlc.funcs->reset(adev);
3539 3539
3540 gfx_v7_0_init_pg(adev); 3540 gfx_v7_0_init_pg(adev);
3541 3541
@@ -3566,7 +3566,7 @@ static int gfx_v7_0_rlc_resume(struct amdgpu_device *adev)
3566 if (adev->asic_type == CHIP_BONAIRE) 3566 if (adev->asic_type == CHIP_BONAIRE)
3567 WREG32(mmRLC_DRIVER_CPDMA_STATUS, 0); 3567 WREG32(mmRLC_DRIVER_CPDMA_STATUS, 0);
3568 3568
3569 gfx_v7_0_rlc_start(adev); 3569 adev->gfx.rlc.funcs->start(adev);
3570 3570
3571 return 0; 3571 return 0;
3572} 3572}
@@ -4273,7 +4273,13 @@ static const struct amdgpu_gfx_funcs gfx_v7_0_gfx_funcs = {
4273 4273
4274static const struct amdgpu_rlc_funcs gfx_v7_0_rlc_funcs = { 4274static const struct amdgpu_rlc_funcs gfx_v7_0_rlc_funcs = {
4275 .enter_safe_mode = gfx_v7_0_enter_rlc_safe_mode, 4275 .enter_safe_mode = gfx_v7_0_enter_rlc_safe_mode,
4276 .exit_safe_mode = gfx_v7_0_exit_rlc_safe_mode 4276 .exit_safe_mode = gfx_v7_0_exit_rlc_safe_mode,
4277 .init = gfx_v7_0_rlc_init,
4278 .fini = gfx_v7_0_rlc_fini,
4279 .resume = gfx_v7_0_rlc_resume,
4280 .stop = gfx_v7_0_rlc_stop,
4281 .reset = gfx_v7_0_rlc_reset,
4282 .start = gfx_v7_0_rlc_start
4277}; 4283};
4278 4284
4279static int gfx_v7_0_early_init(void *handle) 4285static int gfx_v7_0_early_init(void *handle)
@@ -4524,7 +4530,7 @@ static int gfx_v7_0_sw_init(void *handle)
4524 return r; 4530 return r;
4525 } 4531 }
4526 4532
4527 r = gfx_v7_0_rlc_init(adev); 4533 r = adev->gfx.rlc.funcs->init(adev);
4528 if (r) { 4534 if (r) {
4529 DRM_ERROR("Failed to init rlc BOs!\n"); 4535 DRM_ERROR("Failed to init rlc BOs!\n");
4530 return r; 4536 return r;
@@ -4588,7 +4594,7 @@ static int gfx_v7_0_sw_fini(void *handle)
4588 amdgpu_ring_fini(&adev->gfx.compute_ring[i]); 4594 amdgpu_ring_fini(&adev->gfx.compute_ring[i]);
4589 4595
4590 gfx_v7_0_cp_compute_fini(adev); 4596 gfx_v7_0_cp_compute_fini(adev);
4591 gfx_v7_0_rlc_fini(adev); 4597 adev->gfx.rlc.funcs->fini(adev);
4592 gfx_v7_0_mec_fini(adev); 4598 gfx_v7_0_mec_fini(adev);
4593 amdgpu_bo_free_kernel(&adev->gfx.rlc.clear_state_obj, 4599 amdgpu_bo_free_kernel(&adev->gfx.rlc.clear_state_obj,
4594 &adev->gfx.rlc.clear_state_gpu_addr, 4600 &adev->gfx.rlc.clear_state_gpu_addr,
@@ -4611,7 +4617,7 @@ static int gfx_v7_0_hw_init(void *handle)
4611 gfx_v7_0_constants_init(adev); 4617 gfx_v7_0_constants_init(adev);
4612 4618
4613 /* init rlc */ 4619 /* init rlc */
4614 r = gfx_v7_0_rlc_resume(adev); 4620 r = adev->gfx.rlc.funcs->resume(adev);
4615 if (r) 4621 if (r)
4616 return r; 4622 return r;
4617 4623
@@ -4629,7 +4635,7 @@ static int gfx_v7_0_hw_fini(void *handle)
4629 amdgpu_irq_put(adev, &adev->gfx.priv_reg_irq, 0); 4635 amdgpu_irq_put(adev, &adev->gfx.priv_reg_irq, 0);
4630 amdgpu_irq_put(adev, &adev->gfx.priv_inst_irq, 0); 4636 amdgpu_irq_put(adev, &adev->gfx.priv_inst_irq, 0);
4631 gfx_v7_0_cp_enable(adev, false); 4637 gfx_v7_0_cp_enable(adev, false);
4632 gfx_v7_0_rlc_stop(adev); 4638 adev->gfx.rlc.funcs->stop(adev);
4633 gfx_v7_0_fini_pg(adev); 4639 gfx_v7_0_fini_pg(adev);
4634 4640
4635 return 0; 4641 return 0;
@@ -4714,7 +4720,7 @@ static int gfx_v7_0_soft_reset(void *handle)
4714 gfx_v7_0_update_cg(adev, false); 4720 gfx_v7_0_update_cg(adev, false);
4715 4721
4716 /* stop the rlc */ 4722 /* stop the rlc */
4717 gfx_v7_0_rlc_stop(adev); 4723 adev->gfx.rlc.funcs->stop(adev);
4718 4724
4719 /* Disable GFX parsing/prefetching */ 4725 /* Disable GFX parsing/prefetching */
4720 WREG32(mmCP_ME_CNTL, CP_ME_CNTL__ME_HALT_MASK | CP_ME_CNTL__PFP_HALT_MASK | CP_ME_CNTL__CE_HALT_MASK); 4726 WREG32(mmCP_ME_CNTL, CP_ME_CNTL__ME_HALT_MASK | CP_ME_CNTL__PFP_HALT_MASK | CP_ME_CNTL__CE_HALT_MASK);
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
index bdae5636a910..7dbcb2ea20fd 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
@@ -1376,7 +1376,7 @@ static int gfx_v8_0_rlc_init(struct amdgpu_device *adev)
1376 (void **)&adev->gfx.rlc.cs_ptr); 1376 (void **)&adev->gfx.rlc.cs_ptr);
1377 if (r) { 1377 if (r) {
1378 dev_warn(adev->dev, "(%d) create RLC c bo failed\n", r); 1378 dev_warn(adev->dev, "(%d) create RLC c bo failed\n", r);
1379 gfx_v8_0_rlc_fini(adev); 1379 adev->gfx.rlc.funcs->fini(adev);
1380 return r; 1380 return r;
1381 } 1381 }
1382 1382
@@ -2073,7 +2073,7 @@ static int gfx_v8_0_sw_init(void *handle)
2073 return r; 2073 return r;
2074 } 2074 }
2075 2075
2076 r = gfx_v8_0_rlc_init(adev); 2076 r = adev->gfx.rlc.funcs->init(adev);
2077 if (r) { 2077 if (r) {
2078 DRM_ERROR("Failed to init rlc BOs!\n"); 2078 DRM_ERROR("Failed to init rlc BOs!\n");
2079 return r; 2079 return r;
@@ -2166,7 +2166,7 @@ static int gfx_v8_0_sw_fini(void *handle)
2166 amdgpu_gfx_kiq_fini(adev); 2166 amdgpu_gfx_kiq_fini(adev);
2167 2167
2168 gfx_v8_0_mec_fini(adev); 2168 gfx_v8_0_mec_fini(adev);
2169 gfx_v8_0_rlc_fini(adev); 2169 adev->gfx.rlc.funcs->fini(adev);
2170 amdgpu_bo_free_kernel(&adev->gfx.rlc.clear_state_obj, 2170 amdgpu_bo_free_kernel(&adev->gfx.rlc.clear_state_obj,
2171 &adev->gfx.rlc.clear_state_gpu_addr, 2171 &adev->gfx.rlc.clear_state_gpu_addr,
2172 (void **)&adev->gfx.rlc.cs_ptr); 2172 (void **)&adev->gfx.rlc.cs_ptr);
@@ -4160,10 +4160,10 @@ static void gfx_v8_0_rlc_start(struct amdgpu_device *adev)
4160 4160
4161static int gfx_v8_0_rlc_resume(struct amdgpu_device *adev) 4161static int gfx_v8_0_rlc_resume(struct amdgpu_device *adev)
4162{ 4162{
4163 gfx_v8_0_rlc_stop(adev); 4163 adev->gfx.rlc.funcs->stop(adev);
4164 gfx_v8_0_rlc_reset(adev); 4164 adev->gfx.rlc.funcs->reset(adev);
4165 gfx_v8_0_init_pg(adev); 4165 gfx_v8_0_init_pg(adev);
4166 gfx_v8_0_rlc_start(adev); 4166 adev->gfx.rlc.funcs->start(adev);
4167 4167
4168 return 0; 4168 return 0;
4169} 4169}
@@ -4845,7 +4845,7 @@ static int gfx_v8_0_hw_init(void *handle)
4845 gfx_v8_0_init_golden_registers(adev); 4845 gfx_v8_0_init_golden_registers(adev);
4846 gfx_v8_0_constants_init(adev); 4846 gfx_v8_0_constants_init(adev);
4847 4847
4848 r = gfx_v8_0_rlc_resume(adev); 4848 r = adev->gfx.rlc.funcs->resume(adev);
4849 if (r) 4849 if (r)
4850 return r; 4850 return r;
4851 4851
@@ -4957,7 +4957,7 @@ static int gfx_v8_0_hw_fini(void *handle)
4957 else 4957 else
4958 pr_err("cp is busy, skip halt cp\n"); 4958 pr_err("cp is busy, skip halt cp\n");
4959 if (!gfx_v8_0_wait_for_rlc_idle(adev)) 4959 if (!gfx_v8_0_wait_for_rlc_idle(adev))
4960 gfx_v8_0_rlc_stop(adev); 4960 adev->gfx.rlc.funcs->stop(adev);
4961 else 4961 else
4962 pr_err("rlc is busy, skip halt rlc\n"); 4962 pr_err("rlc is busy, skip halt rlc\n");
4963 adev->gfx.rlc.funcs->exit_safe_mode(adev); 4963 adev->gfx.rlc.funcs->exit_safe_mode(adev);
@@ -5049,7 +5049,7 @@ static int gfx_v8_0_pre_soft_reset(void *handle)
5049 srbm_soft_reset = adev->gfx.srbm_soft_reset; 5049 srbm_soft_reset = adev->gfx.srbm_soft_reset;
5050 5050
5051 /* stop the rlc */ 5051 /* stop the rlc */
5052 gfx_v8_0_rlc_stop(adev); 5052 adev->gfx.rlc.funcs->stop(adev);
5053 5053
5054 if (REG_GET_FIELD(grbm_soft_reset, GRBM_SOFT_RESET, SOFT_RESET_CP) || 5054 if (REG_GET_FIELD(grbm_soft_reset, GRBM_SOFT_RESET, SOFT_RESET_CP) ||
5055 REG_GET_FIELD(grbm_soft_reset, GRBM_SOFT_RESET, SOFT_RESET_GFX)) 5055 REG_GET_FIELD(grbm_soft_reset, GRBM_SOFT_RESET, SOFT_RESET_GFX))
@@ -5175,7 +5175,7 @@ static int gfx_v8_0_post_soft_reset(void *handle)
5175 REG_GET_FIELD(grbm_soft_reset, GRBM_SOFT_RESET, SOFT_RESET_GFX)) 5175 REG_GET_FIELD(grbm_soft_reset, GRBM_SOFT_RESET, SOFT_RESET_GFX))
5176 gfx_v8_0_cp_gfx_resume(adev); 5176 gfx_v8_0_cp_gfx_resume(adev);
5177 5177
5178 gfx_v8_0_rlc_start(adev); 5178 adev->gfx.rlc.funcs->start(adev);
5179 5179
5180 return 0; 5180 return 0;
5181} 5181}
@@ -5632,7 +5632,13 @@ static void iceland_exit_rlc_safe_mode(struct amdgpu_device *adev)
5632 5632
5633static const struct amdgpu_rlc_funcs iceland_rlc_funcs = { 5633static const struct amdgpu_rlc_funcs iceland_rlc_funcs = {
5634 .enter_safe_mode = iceland_enter_rlc_safe_mode, 5634 .enter_safe_mode = iceland_enter_rlc_safe_mode,
5635 .exit_safe_mode = iceland_exit_rlc_safe_mode 5635 .exit_safe_mode = iceland_exit_rlc_safe_mode,
5636 .init = gfx_v8_0_rlc_init,
5637 .fini = gfx_v8_0_rlc_fini,
5638 .resume = gfx_v8_0_rlc_resume,
5639 .stop = gfx_v8_0_rlc_stop,
5640 .reset = gfx_v8_0_rlc_reset,
5641 .start = gfx_v8_0_rlc_start
5636}; 5642};
5637 5643
5638static void gfx_v8_0_update_medium_grain_clock_gating(struct amdgpu_device *adev, 5644static void gfx_v8_0_update_medium_grain_clock_gating(struct amdgpu_device *adev,
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
index 7abefb80f93d..ae720851974f 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
@@ -1147,7 +1147,7 @@ static int gfx_v9_0_rlc_init(struct amdgpu_device *adev)
1147 if (r) { 1147 if (r) {
1148 dev_err(adev->dev, "(%d) failed to create rlc csb bo\n", 1148 dev_err(adev->dev, "(%d) failed to create rlc csb bo\n",
1149 r); 1149 r);
1150 gfx_v9_0_rlc_fini(adev); 1150 adev->gfx.rlc.funcs->fini(adev);
1151 return r; 1151 return r;
1152 } 1152 }
1153 /* set up the cs buffer */ 1153 /* set up the cs buffer */
@@ -1169,7 +1169,7 @@ static int gfx_v9_0_rlc_init(struct amdgpu_device *adev)
1169 if (r) { 1169 if (r) {
1170 dev_err(adev->dev, 1170 dev_err(adev->dev,
1171 "(%d) failed to create cp table bo\n", r); 1171 "(%d) failed to create cp table bo\n", r);
1172 gfx_v9_0_rlc_fini(adev); 1172 adev->gfx.rlc.funcs->fini(adev);
1173 return r; 1173 return r;
1174 } 1174 }
1175 1175
@@ -1733,7 +1733,7 @@ static int gfx_v9_0_sw_init(void *handle)
1733 return r; 1733 return r;
1734 } 1734 }
1735 1735
1736 r = gfx_v9_0_rlc_init(adev); 1736 r = adev->gfx.rlc.funcs->init(adev);
1737 if (r) { 1737 if (r) {
1738 DRM_ERROR("Failed to init rlc BOs!\n"); 1738 DRM_ERROR("Failed to init rlc BOs!\n");
1739 return r; 1739 return r;
@@ -2483,12 +2483,12 @@ static int gfx_v9_0_rlc_resume(struct amdgpu_device *adev)
2483 return 0; 2483 return 0;
2484 } 2484 }
2485 2485
2486 gfx_v9_0_rlc_stop(adev); 2486 adev->gfx.rlc.funcs->stop(adev);
2487 2487
2488 /* disable CG */ 2488 /* disable CG */
2489 WREG32_SOC15(GC, 0, mmRLC_CGCG_CGLS_CTRL, 0); 2489 WREG32_SOC15(GC, 0, mmRLC_CGCG_CGLS_CTRL, 0);
2490 2490
2491 gfx_v9_0_rlc_reset(adev); 2491 adev->gfx.rlc.funcs->reset(adev);
2492 2492
2493 gfx_v9_0_init_pg(adev); 2493 gfx_v9_0_init_pg(adev);
2494 2494
@@ -2521,7 +2521,7 @@ static int gfx_v9_0_rlc_resume(struct amdgpu_device *adev)
2521 gfx_v9_0_enable_lbpw(adev, false); 2521 gfx_v9_0_enable_lbpw(adev, false);
2522 } 2522 }
2523 2523
2524 gfx_v9_0_rlc_start(adev); 2524 adev->gfx.rlc.funcs->start(adev);
2525 2525
2526 return 0; 2526 return 0;
2527} 2527}
@@ -3344,7 +3344,7 @@ static int gfx_v9_0_hw_init(void *handle)
3344 if (r) 3344 if (r)
3345 return r; 3345 return r;
3346 3346
3347 r = gfx_v9_0_rlc_resume(adev); 3347 r = adev->gfx.rlc.funcs->resume(adev);
3348 if (r) 3348 if (r)
3349 return r; 3349 return r;
3350 3350
@@ -3424,7 +3424,7 @@ static int gfx_v9_0_hw_fini(void *handle)
3424 } 3424 }
3425 3425
3426 gfx_v9_0_cp_enable(adev, false); 3426 gfx_v9_0_cp_enable(adev, false);
3427 gfx_v9_0_rlc_stop(adev); 3427 adev->gfx.rlc.funcs->stop(adev);
3428 3428
3429 gfx_v9_0_csb_vram_unpin(adev); 3429 gfx_v9_0_csb_vram_unpin(adev);
3430 3430
@@ -3499,7 +3499,7 @@ static int gfx_v9_0_soft_reset(void *handle)
3499 3499
3500 if (grbm_soft_reset) { 3500 if (grbm_soft_reset) {
3501 /* stop the rlc */ 3501 /* stop the rlc */
3502 gfx_v9_0_rlc_stop(adev); 3502 adev->gfx.rlc.funcs->stop(adev);
3503 3503
3504 /* Disable GFX parsing/prefetching */ 3504 /* Disable GFX parsing/prefetching */
3505 gfx_v9_0_cp_gfx_enable(adev, false); 3505 gfx_v9_0_cp_gfx_enable(adev, false);
@@ -3655,7 +3655,7 @@ static void gfx_v9_0_exit_rlc_safe_mode(struct amdgpu_device *adev)
3655static void gfx_v9_0_update_gfx_cg_power_gating(struct amdgpu_device *adev, 3655static void gfx_v9_0_update_gfx_cg_power_gating(struct amdgpu_device *adev,
3656 bool enable) 3656 bool enable)
3657{ 3657{
3658 gfx_v9_0_enter_rlc_safe_mode(adev); 3658 adev->gfx.rlc.funcs->enter_safe_mode(adev);
3659 3659
3660 if ((adev->pg_flags & AMD_PG_SUPPORT_GFX_PG) && enable) { 3660 if ((adev->pg_flags & AMD_PG_SUPPORT_GFX_PG) && enable) {
3661 gfx_v9_0_enable_gfx_cg_power_gating(adev, true); 3661 gfx_v9_0_enable_gfx_cg_power_gating(adev, true);
@@ -3666,7 +3666,7 @@ static void gfx_v9_0_update_gfx_cg_power_gating(struct amdgpu_device *adev,
3666 gfx_v9_0_enable_gfx_pipeline_powergating(adev, false); 3666 gfx_v9_0_enable_gfx_pipeline_powergating(adev, false);
3667 } 3667 }
3668 3668
3669 gfx_v9_0_exit_rlc_safe_mode(adev); 3669 adev->gfx.rlc.funcs->exit_safe_mode(adev);
3670} 3670}
3671 3671
3672static void gfx_v9_0_update_gfx_mg_power_gating(struct amdgpu_device *adev, 3672static void gfx_v9_0_update_gfx_mg_power_gating(struct amdgpu_device *adev,
@@ -3882,7 +3882,13 @@ static int gfx_v9_0_update_gfx_clock_gating(struct amdgpu_device *adev,
3882 3882
3883static const struct amdgpu_rlc_funcs gfx_v9_0_rlc_funcs = { 3883static const struct amdgpu_rlc_funcs gfx_v9_0_rlc_funcs = {
3884 .enter_safe_mode = gfx_v9_0_enter_rlc_safe_mode, 3884 .enter_safe_mode = gfx_v9_0_enter_rlc_safe_mode,
3885 .exit_safe_mode = gfx_v9_0_exit_rlc_safe_mode 3885 .exit_safe_mode = gfx_v9_0_exit_rlc_safe_mode,
3886 .init = gfx_v9_0_rlc_init,
3887 .fini = gfx_v9_0_rlc_fini,
3888 .resume = gfx_v9_0_rlc_resume,
3889 .stop = gfx_v9_0_rlc_stop,
3890 .reset = gfx_v9_0_rlc_reset,
3891 .start = gfx_v9_0_rlc_start
3886}; 3892};
3887 3893
3888static int gfx_v9_0_set_powergating_state(void *handle, 3894static int gfx_v9_0_set_powergating_state(void *handle,