diff options
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c | 28 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c | 30 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | 28 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | 30 |
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 @@ | |||
41 | struct amdgpu_rlc_funcs { | 41 | struct 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 | ||
46 | struct amdgpu_rlc { | 52 | struct 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 | ||
3061 | static 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 | |||
3061 | static int gfx_v6_0_early_init(void *handle) | 3070 | static 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 | ||
4274 | static const struct amdgpu_rlc_funcs gfx_v7_0_rlc_funcs = { | 4274 | static 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 | ||
4279 | static int gfx_v7_0_early_init(void *handle) | 4285 | static 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 | ||
4161 | static int gfx_v8_0_rlc_resume(struct amdgpu_device *adev) | 4161 | static 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 | ||
5633 | static const struct amdgpu_rlc_funcs iceland_rlc_funcs = { | 5633 | static 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 | ||
5638 | static void gfx_v8_0_update_medium_grain_clock_gating(struct amdgpu_device *adev, | 5644 | static 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) | |||
3655 | static void gfx_v9_0_update_gfx_cg_power_gating(struct amdgpu_device *adev, | 3655 | static 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 | ||
3672 | static void gfx_v9_0_update_gfx_mg_power_gating(struct amdgpu_device *adev, | 3672 | static 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 | ||
3883 | static const struct amdgpu_rlc_funcs gfx_v9_0_rlc_funcs = { | 3883 | static 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 | ||
3888 | static int gfx_v9_0_set_powergating_state(void *handle, | 3894 | static int gfx_v9_0_set_powergating_state(void *handle, |