diff options
author | Dave Airlie <airlied@redhat.com> | 2016-03-02 20:37:07 -0500 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2016-03-02 20:37:07 -0500 |
commit | f0511e66114a6414cfca92d7b94118913a0c11ff (patch) | |
tree | 540c2120b02dd1717e8ae5e6eddc8520c49e8cf8 /drivers | |
parent | 2d02b8bdba322b527c5f5168ce1ca10c2d982a78 (diff) | |
parent | 0b39c531cfa12dad54eac238c2e303b994df1ef7 (diff) |
Merge branch 'drm-fixes-4.5' of git://people.freedesktop.org/~agd5f/linux into drm-fixes
Fixes for radeon and amdgpu:
- Fix GPUVM flushing on CI and VI
- Misc DPM and Powerplay fixes
- VCE DPM fixes for CZ/ST
- DP hotplug fix
* 'drm-fixes-4.5' of git://people.freedesktop.org/~agd5f/linux:
drm/amdgpu: return from atombios_dp_get_dpcd only when error
drm/amdgpu/cz: remove commented out call to enable vce pg
drm/amdgpu/powerplay/cz: enable/disable vce dpm independent of vce pg
drm/amdgpu/cz: enable/disable vce dpm even if vce pg is disabled
drm/amdgpu/gfx8: specify which engine to wait before vm flush
drm/amdgpu: apply gfx_v8 fixes to gfx_v7 as well
drm/amd/powerplay: send event to notify powerplay all modules are initialized.
drm/amd/powerplay: export AMD_PP_EVENT_COMPLETE_INIT task to amdgpu.
drm/radeon/pm: update current crtc info after setting the powerstate
drm/amdgpu/pm: update current crtc info after setting the powerstate
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/cz_dpm.c | 7 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c | 13 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/powerplay/amd_powerplay.c | 5 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/powerplay/eventmgr/eventactionchains.c | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/powerplay/hwmgr/cz_clockpowergating.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_pm.c | 8 |
10 files changed, 34 insertions, 17 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c index 89c3dd62ba21..119cdc2c43e7 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c | |||
@@ -77,7 +77,7 @@ void amdgpu_connector_hotplug(struct drm_connector *connector) | |||
77 | } else if (amdgpu_atombios_dp_needs_link_train(amdgpu_connector)) { | 77 | } else if (amdgpu_atombios_dp_needs_link_train(amdgpu_connector)) { |
78 | /* Don't try to start link training before we | 78 | /* Don't try to start link training before we |
79 | * have the dpcd */ | 79 | * have the dpcd */ |
80 | if (!amdgpu_atombios_dp_get_dpcd(amdgpu_connector)) | 80 | if (amdgpu_atombios_dp_get_dpcd(amdgpu_connector)) |
81 | return; | 81 | return; |
82 | 82 | ||
83 | /* set it to OFF so that drm_helper_connector_dpms() | 83 | /* set it to OFF so that drm_helper_connector_dpms() |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c index 66855b62a603..95a4a25d8df9 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c | |||
@@ -649,9 +649,6 @@ force: | |||
649 | /* update display watermarks based on new power state */ | 649 | /* update display watermarks based on new power state */ |
650 | amdgpu_display_bandwidth_update(adev); | 650 | amdgpu_display_bandwidth_update(adev); |
651 | 651 | ||
652 | adev->pm.dpm.current_active_crtcs = adev->pm.dpm.new_active_crtcs; | ||
653 | adev->pm.dpm.current_active_crtc_count = adev->pm.dpm.new_active_crtc_count; | ||
654 | |||
655 | /* wait for the rings to drain */ | 652 | /* wait for the rings to drain */ |
656 | for (i = 0; i < AMDGPU_MAX_RINGS; i++) { | 653 | for (i = 0; i < AMDGPU_MAX_RINGS; i++) { |
657 | struct amdgpu_ring *ring = adev->rings[i]; | 654 | struct amdgpu_ring *ring = adev->rings[i]; |
@@ -670,6 +667,9 @@ force: | |||
670 | /* update displays */ | 667 | /* update displays */ |
671 | amdgpu_dpm_display_configuration_changed(adev); | 668 | amdgpu_dpm_display_configuration_changed(adev); |
672 | 669 | ||
670 | adev->pm.dpm.current_active_crtcs = adev->pm.dpm.new_active_crtcs; | ||
671 | adev->pm.dpm.current_active_crtc_count = adev->pm.dpm.new_active_crtc_count; | ||
672 | |||
673 | if (adev->pm.funcs->force_performance_level) { | 673 | if (adev->pm.funcs->force_performance_level) { |
674 | if (adev->pm.dpm.thermal_active) { | 674 | if (adev->pm.dpm.thermal_active) { |
675 | enum amdgpu_dpm_forced_level level = adev->pm.dpm.forced_level; | 675 | enum amdgpu_dpm_forced_level level = adev->pm.dpm.forced_level; |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c index b9d0d55f6b47..3cb6d6c413c7 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c | |||
@@ -143,8 +143,10 @@ static int amdgpu_pp_late_init(void *handle) | |||
143 | adev->powerplay.pp_handle); | 143 | adev->powerplay.pp_handle); |
144 | 144 | ||
145 | #ifdef CONFIG_DRM_AMD_POWERPLAY | 145 | #ifdef CONFIG_DRM_AMD_POWERPLAY |
146 | if (adev->pp_enabled) | 146 | if (adev->pp_enabled) { |
147 | amdgpu_pm_sysfs_init(adev); | 147 | amdgpu_pm_sysfs_init(adev); |
148 | amdgpu_dpm_dispatch_task(adev, AMD_PP_EVENT_COMPLETE_INIT, NULL, NULL); | ||
149 | } | ||
148 | #endif | 150 | #endif |
149 | return ret; | 151 | return ret; |
150 | } | 152 | } |
diff --git a/drivers/gpu/drm/amd/amdgpu/cz_dpm.c b/drivers/gpu/drm/amd/amdgpu/cz_dpm.c index 9056355309d1..e7ef2261ff4a 100644 --- a/drivers/gpu/drm/amd/amdgpu/cz_dpm.c +++ b/drivers/gpu/drm/amd/amdgpu/cz_dpm.c | |||
@@ -2202,8 +2202,7 @@ static void cz_dpm_powergate_vce(struct amdgpu_device *adev, bool gate) | |||
2202 | AMD_PG_STATE_GATE); | 2202 | AMD_PG_STATE_GATE); |
2203 | 2203 | ||
2204 | cz_enable_vce_dpm(adev, false); | 2204 | cz_enable_vce_dpm(adev, false); |
2205 | /* TODO: to figure out why vce can't be poweroff. */ | 2205 | cz_send_msg_to_smc(adev, PPSMC_MSG_VCEPowerOFF); |
2206 | /* cz_send_msg_to_smc(adev, PPSMC_MSG_VCEPowerOFF); */ | ||
2207 | pi->vce_power_gated = true; | 2206 | pi->vce_power_gated = true; |
2208 | } else { | 2207 | } else { |
2209 | cz_send_msg_to_smc(adev, PPSMC_MSG_VCEPowerON); | 2208 | cz_send_msg_to_smc(adev, PPSMC_MSG_VCEPowerON); |
@@ -2226,10 +2225,8 @@ static void cz_dpm_powergate_vce(struct amdgpu_device *adev, bool gate) | |||
2226 | } | 2225 | } |
2227 | } else { /*pi->caps_vce_pg*/ | 2226 | } else { /*pi->caps_vce_pg*/ |
2228 | cz_update_vce_dpm(adev); | 2227 | cz_update_vce_dpm(adev); |
2229 | cz_enable_vce_dpm(adev, true); | 2228 | cz_enable_vce_dpm(adev, !gate); |
2230 | } | 2229 | } |
2231 | |||
2232 | return; | ||
2233 | } | 2230 | } |
2234 | 2231 | ||
2235 | const struct amd_ip_funcs cz_dpm_ip_funcs = { | 2232 | const struct amd_ip_funcs cz_dpm_ip_funcs = { |
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c index 7732059ae30f..06602df707f8 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c | |||
@@ -3628,6 +3628,19 @@ static void gfx_v7_0_ring_emit_vm_flush(struct amdgpu_ring *ring, | |||
3628 | unsigned vm_id, uint64_t pd_addr) | 3628 | unsigned vm_id, uint64_t pd_addr) |
3629 | { | 3629 | { |
3630 | int usepfp = (ring->type == AMDGPU_RING_TYPE_GFX); | 3630 | int usepfp = (ring->type == AMDGPU_RING_TYPE_GFX); |
3631 | uint32_t seq = ring->fence_drv.sync_seq; | ||
3632 | uint64_t addr = ring->fence_drv.gpu_addr; | ||
3633 | |||
3634 | amdgpu_ring_write(ring, PACKET3(PACKET3_WAIT_REG_MEM, 5)); | ||
3635 | amdgpu_ring_write(ring, (WAIT_REG_MEM_MEM_SPACE(1) | /* memory */ | ||
3636 | WAIT_REG_MEM_FUNCTION(3) | /* equal */ | ||
3637 | WAIT_REG_MEM_ENGINE(usepfp))); /* pfp or me */ | ||
3638 | amdgpu_ring_write(ring, addr & 0xfffffffc); | ||
3639 | amdgpu_ring_write(ring, upper_32_bits(addr) & 0xffffffff); | ||
3640 | amdgpu_ring_write(ring, seq); | ||
3641 | amdgpu_ring_write(ring, 0xffffffff); | ||
3642 | amdgpu_ring_write(ring, 4); /* poll interval */ | ||
3643 | |||
3631 | if (usepfp) { | 3644 | if (usepfp) { |
3632 | /* synce CE with ME to prevent CE fetch CEIB before context switch done */ | 3645 | /* synce CE with ME to prevent CE fetch CEIB before context switch done */ |
3633 | amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0)); | 3646 | amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0)); |
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c index 1c40bd90afbb..7086ac17abee 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | |||
@@ -4809,7 +4809,8 @@ static void gfx_v8_0_ring_emit_vm_flush(struct amdgpu_ring *ring, | |||
4809 | 4809 | ||
4810 | amdgpu_ring_write(ring, PACKET3(PACKET3_WAIT_REG_MEM, 5)); | 4810 | amdgpu_ring_write(ring, PACKET3(PACKET3_WAIT_REG_MEM, 5)); |
4811 | amdgpu_ring_write(ring, (WAIT_REG_MEM_MEM_SPACE(1) | /* memory */ | 4811 | amdgpu_ring_write(ring, (WAIT_REG_MEM_MEM_SPACE(1) | /* memory */ |
4812 | WAIT_REG_MEM_FUNCTION(3))); /* equal */ | 4812 | WAIT_REG_MEM_FUNCTION(3) | /* equal */ |
4813 | WAIT_REG_MEM_ENGINE(usepfp))); /* pfp or me */ | ||
4813 | amdgpu_ring_write(ring, addr & 0xfffffffc); | 4814 | amdgpu_ring_write(ring, addr & 0xfffffffc); |
4814 | amdgpu_ring_write(ring, upper_32_bits(addr) & 0xffffffff); | 4815 | amdgpu_ring_write(ring, upper_32_bits(addr) & 0xffffffff); |
4815 | amdgpu_ring_write(ring, seq); | 4816 | amdgpu_ring_write(ring, seq); |
diff --git a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c index aa67244a77ae..589599f66fcc 100644 --- a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c +++ b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c | |||
@@ -402,8 +402,11 @@ int pp_dpm_dispatch_tasks(void *handle, enum amd_pp_event event_id, void *input, | |||
402 | 402 | ||
403 | data.requested_ui_label = power_state_convert(ps); | 403 | data.requested_ui_label = power_state_convert(ps); |
404 | ret = pem_handle_event(pp_handle->eventmgr, event_id, &data); | 404 | ret = pem_handle_event(pp_handle->eventmgr, event_id, &data); |
405 | break; | ||
405 | } | 406 | } |
406 | break; | 407 | case AMD_PP_EVENT_COMPLETE_INIT: |
408 | ret = pem_handle_event(pp_handle->eventmgr, event_id, &data); | ||
409 | break; | ||
407 | default: | 410 | default: |
408 | break; | 411 | break; |
409 | } | 412 | } |
diff --git a/drivers/gpu/drm/amd/powerplay/eventmgr/eventactionchains.c b/drivers/gpu/drm/amd/powerplay/eventmgr/eventactionchains.c index 83be3cf210e0..6b52c78cb404 100644 --- a/drivers/gpu/drm/amd/powerplay/eventmgr/eventactionchains.c +++ b/drivers/gpu/drm/amd/powerplay/eventmgr/eventactionchains.c | |||
@@ -165,6 +165,7 @@ const struct action_chain resume_action_chain = { | |||
165 | }; | 165 | }; |
166 | 166 | ||
167 | static const pem_event_action *complete_init_event[] = { | 167 | static const pem_event_action *complete_init_event[] = { |
168 | unblock_adjust_power_state_tasks, | ||
168 | adjust_power_state_tasks, | 169 | adjust_power_state_tasks, |
169 | enable_gfx_clock_gating_tasks, | 170 | enable_gfx_clock_gating_tasks, |
170 | enable_gfx_voltage_island_power_gating_tasks, | 171 | enable_gfx_voltage_island_power_gating_tasks, |
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/cz_clockpowergating.c b/drivers/gpu/drm/amd/powerplay/hwmgr/cz_clockpowergating.c index ad7700822a1c..ff08ce41bde9 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/cz_clockpowergating.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/cz_clockpowergating.c | |||
@@ -226,7 +226,7 @@ int cz_dpm_powergate_vce(struct pp_hwmgr *hwmgr, bool bgate) | |||
226 | } | 226 | } |
227 | } else { | 227 | } else { |
228 | cz_dpm_update_vce_dpm(hwmgr); | 228 | cz_dpm_update_vce_dpm(hwmgr); |
229 | cz_enable_disable_vce_dpm(hwmgr, true); | 229 | cz_enable_disable_vce_dpm(hwmgr, !bgate); |
230 | return 0; | 230 | return 0; |
231 | } | 231 | } |
232 | 232 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c index ca3be90a3bb4..0f14d897baf9 100644 --- a/drivers/gpu/drm/radeon/radeon_pm.c +++ b/drivers/gpu/drm/radeon/radeon_pm.c | |||
@@ -1080,10 +1080,6 @@ force: | |||
1080 | /* update display watermarks based on new power state */ | 1080 | /* update display watermarks based on new power state */ |
1081 | radeon_bandwidth_update(rdev); | 1081 | radeon_bandwidth_update(rdev); |
1082 | 1082 | ||
1083 | rdev->pm.dpm.current_active_crtcs = rdev->pm.dpm.new_active_crtcs; | ||
1084 | rdev->pm.dpm.current_active_crtc_count = rdev->pm.dpm.new_active_crtc_count; | ||
1085 | rdev->pm.dpm.single_display = single_display; | ||
1086 | |||
1087 | /* wait for the rings to drain */ | 1083 | /* wait for the rings to drain */ |
1088 | for (i = 0; i < RADEON_NUM_RINGS; i++) { | 1084 | for (i = 0; i < RADEON_NUM_RINGS; i++) { |
1089 | struct radeon_ring *ring = &rdev->ring[i]; | 1085 | struct radeon_ring *ring = &rdev->ring[i]; |
@@ -1102,6 +1098,10 @@ force: | |||
1102 | /* update displays */ | 1098 | /* update displays */ |
1103 | radeon_dpm_display_configuration_changed(rdev); | 1099 | radeon_dpm_display_configuration_changed(rdev); |
1104 | 1100 | ||
1101 | rdev->pm.dpm.current_active_crtcs = rdev->pm.dpm.new_active_crtcs; | ||
1102 | rdev->pm.dpm.current_active_crtc_count = rdev->pm.dpm.new_active_crtc_count; | ||
1103 | rdev->pm.dpm.single_display = single_display; | ||
1104 | |||
1105 | if (rdev->asic->dpm.force_performance_level) { | 1105 | if (rdev->asic->dpm.force_performance_level) { |
1106 | if (rdev->pm.dpm.thermal_active) { | 1106 | if (rdev->pm.dpm.thermal_active) { |
1107 | enum radeon_dpm_forced_level level = rdev->pm.dpm.forced_level; | 1107 | enum radeon_dpm_forced_level level = rdev->pm.dpm.forced_level; |