diff options
| author | Dave Airlie <airlied@redhat.com> | 2018-03-21 18:52:21 -0400 |
|---|---|---|
| committer | Dave Airlie <airlied@redhat.com> | 2018-03-21 18:52:21 -0400 |
| commit | 82269df3bb8bd22aa0cf883724cf9ad456071fe8 (patch) | |
| tree | db04692c09fcb03ae8d6ce9b639f680b898b6761 | |
| parent | fca3c46abc436a0e2b4642c8ba4727eda741fd7a (diff) | |
| parent | 731a373698c9675d5aed8a30d8c9861bea9c41a2 (diff) | |
Merge branch 'drm-fixes-4.16' of git://people.freedesktop.org/~agd5f/linux into drm-fixes
A few more fixes for 4.16. Mostly for displays:
- A fix for DP handling on radeon
- Fix banding on eDP panels
- Fix HBR audio
- Fix for disabling VGA mode on Raven that leads to a corrupt or
blank display on some platforms
* 'drm-fixes-4.16' of git://people.freedesktop.org/~agd5f/linux:
drm/amd/display: Add one to EDID's audio channel count when passing to DC
drm/amd/display: We shouldn't set format_default on plane as atomic driver
drm/amd/display: Fix FMT truncation programming
drm/amd/display: Allow truncation to 10 bits
drm/amd/display: fix dereferencing possible ERR_PTR()
drm/amd/display: Refine disable VGA
drm/amdgpu: Use atomic function to disable crtcs with dc enabled
drm/radeon: Don't turn off DP sink when disconnected
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 9 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 5 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/display/dc/dce/dce_hwseq.h | 8 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/display/dc/dce/dce_opp.c | 9 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c | 20 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_connectors.c | 31 |
7 files changed, 48 insertions, 36 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index af1b879a9ee9..66cb10cdc7c3 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | |||
| @@ -2063,9 +2063,12 @@ void amdgpu_device_fini(struct amdgpu_device *adev) | |||
| 2063 | 2063 | ||
| 2064 | DRM_INFO("amdgpu: finishing device.\n"); | 2064 | DRM_INFO("amdgpu: finishing device.\n"); |
| 2065 | adev->shutdown = true; | 2065 | adev->shutdown = true; |
| 2066 | if (adev->mode_info.mode_config_initialized) | 2066 | if (adev->mode_info.mode_config_initialized){ |
| 2067 | drm_crtc_force_disable_all(adev->ddev); | 2067 | if (!amdgpu_device_has_dc_support(adev)) |
| 2068 | 2068 | drm_crtc_force_disable_all(adev->ddev); | |
| 2069 | else | ||
| 2070 | drm_atomic_helper_shutdown(adev->ddev); | ||
| 2071 | } | ||
| 2069 | amdgpu_ib_pool_fini(adev); | 2072 | amdgpu_ib_pool_fini(adev); |
| 2070 | amdgpu_fence_driver_fini(adev); | 2073 | amdgpu_fence_driver_fini(adev); |
| 2071 | amdgpu_fbdev_fini(adev); | 2074 | amdgpu_fbdev_fini(adev); |
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c index c345e645f1d7..63c67346d316 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | |||
| @@ -3134,8 +3134,6 @@ static int amdgpu_dm_plane_init(struct amdgpu_display_manager *dm, | |||
| 3134 | 3134 | ||
| 3135 | switch (aplane->base.type) { | 3135 | switch (aplane->base.type) { |
| 3136 | case DRM_PLANE_TYPE_PRIMARY: | 3136 | case DRM_PLANE_TYPE_PRIMARY: |
| 3137 | aplane->base.format_default = true; | ||
| 3138 | |||
| 3139 | res = drm_universal_plane_init( | 3137 | res = drm_universal_plane_init( |
| 3140 | dm->adev->ddev, | 3138 | dm->adev->ddev, |
| 3141 | &aplane->base, | 3139 | &aplane->base, |
| @@ -4794,6 +4792,9 @@ static int dm_atomic_check_plane_state_fb(struct drm_atomic_state *state, | |||
| 4794 | return -EDEADLK; | 4792 | return -EDEADLK; |
| 4795 | 4793 | ||
| 4796 | crtc_state = drm_atomic_get_crtc_state(plane_state->state, crtc); | 4794 | crtc_state = drm_atomic_get_crtc_state(plane_state->state, crtc); |
| 4795 | if (IS_ERR(crtc_state)) | ||
| 4796 | return PTR_ERR(crtc_state); | ||
| 4797 | |||
| 4797 | if (crtc->primary == plane && crtc_state->active) { | 4798 | if (crtc->primary == plane && crtc_state->active) { |
| 4798 | if (!plane_state->fb) | 4799 | if (!plane_state->fb) |
| 4799 | return -EINVAL; | 4800 | return -EINVAL; |
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c index 9bd142f65f9b..e1acc10e35a2 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c | |||
| @@ -109,7 +109,7 @@ enum dc_edid_status dm_helpers_parse_edid_caps( | |||
| 109 | struct cea_sad *sad = &sads[i]; | 109 | struct cea_sad *sad = &sads[i]; |
| 110 | 110 | ||
| 111 | edid_caps->audio_modes[i].format_code = sad->format; | 111 | edid_caps->audio_modes[i].format_code = sad->format; |
| 112 | edid_caps->audio_modes[i].channel_count = sad->channels; | 112 | edid_caps->audio_modes[i].channel_count = sad->channels + 1; |
| 113 | edid_caps->audio_modes[i].sample_rate = sad->freq; | 113 | edid_caps->audio_modes[i].sample_rate = sad->freq; |
| 114 | edid_caps->audio_modes[i].sample_size = sad->byte2; | 114 | edid_caps->audio_modes[i].sample_size = sad->byte2; |
| 115 | } | 115 | } |
diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_hwseq.h b/drivers/gpu/drm/amd/display/dc/dce/dce_hwseq.h index a993279a8f2d..f11f17fe08f9 100644 --- a/drivers/gpu/drm/amd/display/dc/dce/dce_hwseq.h +++ b/drivers/gpu/drm/amd/display/dc/dce/dce_hwseq.h | |||
| @@ -496,6 +496,9 @@ struct dce_hwseq_registers { | |||
| 496 | HWS_SF(, DOMAIN7_PG_STATUS, DOMAIN7_PGFSM_PWR_STATUS, mask_sh), \ | 496 | HWS_SF(, DOMAIN7_PG_STATUS, DOMAIN7_PGFSM_PWR_STATUS, mask_sh), \ |
| 497 | HWS_SF(, DC_IP_REQUEST_CNTL, IP_REQUEST_EN, mask_sh), \ | 497 | HWS_SF(, DC_IP_REQUEST_CNTL, IP_REQUEST_EN, mask_sh), \ |
| 498 | HWS_SF(, D1VGA_CONTROL, D1VGA_MODE_ENABLE, mask_sh),\ | 498 | HWS_SF(, D1VGA_CONTROL, D1VGA_MODE_ENABLE, mask_sh),\ |
| 499 | HWS_SF(, D2VGA_CONTROL, D2VGA_MODE_ENABLE, mask_sh),\ | ||
| 500 | HWS_SF(, D3VGA_CONTROL, D3VGA_MODE_ENABLE, mask_sh),\ | ||
| 501 | HWS_SF(, D4VGA_CONTROL, D4VGA_MODE_ENABLE, mask_sh),\ | ||
| 499 | HWS_SF(, VGA_TEST_CONTROL, VGA_TEST_ENABLE, mask_sh),\ | 502 | HWS_SF(, VGA_TEST_CONTROL, VGA_TEST_ENABLE, mask_sh),\ |
| 500 | HWS_SF(, VGA_TEST_CONTROL, VGA_TEST_RENDER_START, mask_sh),\ | 503 | HWS_SF(, VGA_TEST_CONTROL, VGA_TEST_RENDER_START, mask_sh),\ |
| 501 | HWS_SF(, LVTMA_PWRSEQ_CNTL, LVTMA_BLON, mask_sh), \ | 504 | HWS_SF(, LVTMA_PWRSEQ_CNTL, LVTMA_BLON, mask_sh), \ |
| @@ -591,7 +594,10 @@ struct dce_hwseq_registers { | |||
| 591 | type DENTIST_DISPCLK_WDIVIDER; \ | 594 | type DENTIST_DISPCLK_WDIVIDER; \ |
| 592 | type VGA_TEST_ENABLE; \ | 595 | type VGA_TEST_ENABLE; \ |
| 593 | type VGA_TEST_RENDER_START; \ | 596 | type VGA_TEST_RENDER_START; \ |
| 594 | type D1VGA_MODE_ENABLE; | 597 | type D1VGA_MODE_ENABLE; \ |
| 598 | type D2VGA_MODE_ENABLE; \ | ||
| 599 | type D3VGA_MODE_ENABLE; \ | ||
| 600 | type D4VGA_MODE_ENABLE; | ||
| 595 | 601 | ||
| 596 | struct dce_hwseq_shift { | 602 | struct dce_hwseq_shift { |
| 597 | HWSEQ_REG_FIELD_LIST(uint8_t) | 603 | HWSEQ_REG_FIELD_LIST(uint8_t) |
diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_opp.c b/drivers/gpu/drm/amd/display/dc/dce/dce_opp.c index 3931412ab6d3..87093894ea9e 100644 --- a/drivers/gpu/drm/amd/display/dc/dce/dce_opp.c +++ b/drivers/gpu/drm/amd/display/dc/dce/dce_opp.c | |||
| @@ -128,23 +128,22 @@ static void set_truncation( | |||
| 128 | return; | 128 | return; |
| 129 | } | 129 | } |
| 130 | /* on other format-to do */ | 130 | /* on other format-to do */ |
| 131 | if (params->flags.TRUNCATE_ENABLED == 0 || | 131 | if (params->flags.TRUNCATE_ENABLED == 0) |
| 132 | params->flags.TRUNCATE_DEPTH == 2) | ||
| 133 | return; | 132 | return; |
| 134 | /*Set truncation depth and Enable truncation*/ | 133 | /*Set truncation depth and Enable truncation*/ |
| 135 | REG_UPDATE_3(FMT_BIT_DEPTH_CONTROL, | 134 | REG_UPDATE_3(FMT_BIT_DEPTH_CONTROL, |
| 136 | FMT_TRUNCATE_EN, 1, | 135 | FMT_TRUNCATE_EN, 1, |
| 137 | FMT_TRUNCATE_DEPTH, | 136 | FMT_TRUNCATE_DEPTH, |
| 138 | params->flags.TRUNCATE_MODE, | 137 | params->flags.TRUNCATE_DEPTH, |
| 139 | FMT_TRUNCATE_MODE, | 138 | FMT_TRUNCATE_MODE, |
| 140 | params->flags.TRUNCATE_DEPTH); | 139 | params->flags.TRUNCATE_MODE); |
| 141 | } | 140 | } |
| 142 | 141 | ||
| 143 | 142 | ||
| 144 | /** | 143 | /** |
| 145 | * set_spatial_dither | 144 | * set_spatial_dither |
| 146 | * 1) set spatial dithering mode: pattern of seed | 145 | * 1) set spatial dithering mode: pattern of seed |
| 147 | * 2) set spatical dithering depth: 0 for 18bpp or 1 for 24bpp | 146 | * 2) set spatial dithering depth: 0 for 18bpp or 1 for 24bpp |
| 148 | * 3) set random seed | 147 | * 3) set random seed |
| 149 | * 4) set random mode | 148 | * 4) set random mode |
| 150 | * lfsr is reset every frame or not reset | 149 | * lfsr is reset every frame or not reset |
diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c index 072e4485e85e..dc1e010725c1 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c +++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c | |||
| @@ -238,14 +238,24 @@ static void enable_power_gating_plane( | |||
| 238 | static void disable_vga( | 238 | static void disable_vga( |
| 239 | struct dce_hwseq *hws) | 239 | struct dce_hwseq *hws) |
| 240 | { | 240 | { |
| 241 | unsigned int in_vga_mode = 0; | 241 | unsigned int in_vga1_mode = 0; |
| 242 | 242 | unsigned int in_vga2_mode = 0; | |
| 243 | REG_GET(D1VGA_CONTROL, D1VGA_MODE_ENABLE, &in_vga_mode); | 243 | unsigned int in_vga3_mode = 0; |
| 244 | 244 | unsigned int in_vga4_mode = 0; | |
| 245 | if (in_vga_mode == 0) | 245 | |
| 246 | REG_GET(D1VGA_CONTROL, D1VGA_MODE_ENABLE, &in_vga1_mode); | ||
| 247 | REG_GET(D2VGA_CONTROL, D2VGA_MODE_ENABLE, &in_vga2_mode); | ||
| 248 | REG_GET(D3VGA_CONTROL, D3VGA_MODE_ENABLE, &in_vga3_mode); | ||
| 249 | REG_GET(D4VGA_CONTROL, D4VGA_MODE_ENABLE, &in_vga4_mode); | ||
| 250 | |||
| 251 | if (in_vga1_mode == 0 && in_vga2_mode == 0 && | ||
| 252 | in_vga3_mode == 0 && in_vga4_mode == 0) | ||
| 246 | return; | 253 | return; |
| 247 | 254 | ||
| 248 | REG_WRITE(D1VGA_CONTROL, 0); | 255 | REG_WRITE(D1VGA_CONTROL, 0); |
| 256 | REG_WRITE(D2VGA_CONTROL, 0); | ||
| 257 | REG_WRITE(D3VGA_CONTROL, 0); | ||
| 258 | REG_WRITE(D4VGA_CONTROL, 0); | ||
| 249 | 259 | ||
| 250 | /* HW Engineer's Notes: | 260 | /* HW Engineer's Notes: |
| 251 | * During switch from vga->extended, if we set the VGA_TEST_ENABLE and | 261 | * During switch from vga->extended, if we set the VGA_TEST_ENABLE and |
diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c index 2e2ca3c6b47d..df9469a8fdb1 100644 --- a/drivers/gpu/drm/radeon/radeon_connectors.c +++ b/drivers/gpu/drm/radeon/radeon_connectors.c | |||
| @@ -90,25 +90,18 @@ void radeon_connector_hotplug(struct drm_connector *connector) | |||
| 90 | /* don't do anything if sink is not display port, i.e., | 90 | /* don't do anything if sink is not display port, i.e., |
| 91 | * passive dp->(dvi|hdmi) adaptor | 91 | * passive dp->(dvi|hdmi) adaptor |
| 92 | */ | 92 | */ |
| 93 | if (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) { | 93 | if (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT && |
| 94 | int saved_dpms = connector->dpms; | 94 | radeon_hpd_sense(rdev, radeon_connector->hpd.hpd) && |
| 95 | /* Only turn off the display if it's physically disconnected */ | 95 | radeon_dp_needs_link_train(radeon_connector)) { |
| 96 | if (!radeon_hpd_sense(rdev, radeon_connector->hpd.hpd)) { | 96 | /* Don't start link training before we have the DPCD */ |
| 97 | drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF); | 97 | if (!radeon_dp_getdpcd(radeon_connector)) |
| 98 | } else if (radeon_dp_needs_link_train(radeon_connector)) { | 98 | return; |
| 99 | /* Don't try to start link training before we | 99 | |
| 100 | * have the dpcd */ | 100 | /* Turn the connector off and back on immediately, which |
| 101 | if (!radeon_dp_getdpcd(radeon_connector)) | 101 | * will trigger link training |
| 102 | return; | 102 | */ |
| 103 | 103 | drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF); | |
| 104 | /* set it to OFF so that drm_helper_connector_dpms() | 104 | drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON); |
| 105 | * won't return immediately since the current state | ||
| 106 | * is ON at this point. | ||
| 107 | */ | ||
| 108 | connector->dpms = DRM_MODE_DPMS_OFF; | ||
| 109 | drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON); | ||
| 110 | } | ||
| 111 | connector->dpms = saved_dpms; | ||
| 112 | } | 105 | } |
| 113 | } | 106 | } |
| 114 | } | 107 | } |
