提交 4cdc8f12 编写于 作者: D Dave Airlie

Merge branch 'drm-fixes-4.16' of git://people.freedesktop.org/~agd5f/linux into drm-fixes

A few fixes for 4.16:
- Fix a backlight S/R regression on amdgpu
- Fix prime teardown on radeon and amdgpu
- DP fix for amdgpu

* 'drm-fixes-4.16' of git://people.freedesktop.org/~agd5f/linux:
  drm/amdgpu/dce: Don't turn off DP sink when disconnected
  drm/amdgpu: save/restore backlight level in legacy dce code
  drm/radeon: fix prime teardown order
  drm/amdgpu: fix prime teardown order
...@@ -69,25 +69,18 @@ void amdgpu_connector_hotplug(struct drm_connector *connector) ...@@ -69,25 +69,18 @@ void amdgpu_connector_hotplug(struct drm_connector *connector)
/* don't do anything if sink is not display port, i.e., /* don't do anything if sink is not display port, i.e.,
* passive dp->(dvi|hdmi) adaptor * passive dp->(dvi|hdmi) adaptor
*/ */
if (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) { if (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT &&
int saved_dpms = connector->dpms; amdgpu_display_hpd_sense(adev, amdgpu_connector->hpd.hpd) &&
/* Only turn off the display if it's physically disconnected */ amdgpu_atombios_dp_needs_link_train(amdgpu_connector)) {
if (!amdgpu_display_hpd_sense(adev, amdgpu_connector->hpd.hpd)) { /* Don't start link training before we have the DPCD */
drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF); if (amdgpu_atombios_dp_get_dpcd(amdgpu_connector))
} else if (amdgpu_atombios_dp_needs_link_train(amdgpu_connector)) { return;
/* Don't try to start link training before we
* have the dpcd */ /* Turn the connector off and back on immediately, which
if (amdgpu_atombios_dp_get_dpcd(amdgpu_connector)) * will trigger link training
return; */
drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF);
/* set it to OFF so that drm_helper_connector_dpms() drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON);
* won't return immediately since the current state
* is ON at this point.
*/
connector->dpms = DRM_MODE_DPMS_OFF;
drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON);
}
connector->dpms = saved_dpms;
} }
} }
} }
......
...@@ -36,8 +36,6 @@ void amdgpu_gem_object_free(struct drm_gem_object *gobj) ...@@ -36,8 +36,6 @@ void amdgpu_gem_object_free(struct drm_gem_object *gobj)
struct amdgpu_bo *robj = gem_to_amdgpu_bo(gobj); struct amdgpu_bo *robj = gem_to_amdgpu_bo(gobj);
if (robj) { if (robj) {
if (robj->gem_base.import_attach)
drm_prime_gem_destroy(&robj->gem_base, robj->tbo.sg);
amdgpu_mn_unregister(robj); amdgpu_mn_unregister(robj);
amdgpu_bo_unref(&robj); amdgpu_bo_unref(&robj);
} }
......
...@@ -352,6 +352,7 @@ struct amdgpu_mode_info { ...@@ -352,6 +352,7 @@ struct amdgpu_mode_info {
u16 firmware_flags; u16 firmware_flags;
/* pointer to backlight encoder */ /* pointer to backlight encoder */
struct amdgpu_encoder *bl_encoder; struct amdgpu_encoder *bl_encoder;
u8 bl_level; /* saved backlight level */
struct amdgpu_audio audio; /* audio stuff */ struct amdgpu_audio audio; /* audio stuff */
int num_crtc; /* number of crtcs */ int num_crtc; /* number of crtcs */
int num_hpd; /* number of hpd pins */ int num_hpd; /* number of hpd pins */
......
...@@ -56,6 +56,8 @@ static void amdgpu_ttm_bo_destroy(struct ttm_buffer_object *tbo) ...@@ -56,6 +56,8 @@ static void amdgpu_ttm_bo_destroy(struct ttm_buffer_object *tbo)
amdgpu_bo_kunmap(bo); amdgpu_bo_kunmap(bo);
if (bo->gem_base.import_attach)
drm_prime_gem_destroy(&bo->gem_base, bo->tbo.sg);
drm_gem_object_release(&bo->gem_base); drm_gem_object_release(&bo->gem_base);
amdgpu_bo_unref(&bo->parent); amdgpu_bo_unref(&bo->parent);
if (!list_empty(&bo->shadow_list)) { if (!list_empty(&bo->shadow_list)) {
......
...@@ -34,7 +34,7 @@ ...@@ -34,7 +34,7 @@
#include <linux/backlight.h> #include <linux/backlight.h>
#include "bif/bif_4_1_d.h" #include "bif/bif_4_1_d.h"
static u8 u8
amdgpu_atombios_encoder_get_backlight_level_from_reg(struct amdgpu_device *adev) amdgpu_atombios_encoder_get_backlight_level_from_reg(struct amdgpu_device *adev)
{ {
u8 backlight_level; u8 backlight_level;
...@@ -48,7 +48,7 @@ amdgpu_atombios_encoder_get_backlight_level_from_reg(struct amdgpu_device *adev) ...@@ -48,7 +48,7 @@ amdgpu_atombios_encoder_get_backlight_level_from_reg(struct amdgpu_device *adev)
return backlight_level; return backlight_level;
} }
static void void
amdgpu_atombios_encoder_set_backlight_level_to_reg(struct amdgpu_device *adev, amdgpu_atombios_encoder_set_backlight_level_to_reg(struct amdgpu_device *adev,
u8 backlight_level) u8 backlight_level)
{ {
......
...@@ -24,6 +24,11 @@ ...@@ -24,6 +24,11 @@
#ifndef __ATOMBIOS_ENCODER_H__ #ifndef __ATOMBIOS_ENCODER_H__
#define __ATOMBIOS_ENCODER_H__ #define __ATOMBIOS_ENCODER_H__
u8
amdgpu_atombios_encoder_get_backlight_level_from_reg(struct amdgpu_device *adev);
void
amdgpu_atombios_encoder_set_backlight_level_to_reg(struct amdgpu_device *adev,
u8 backlight_level);
u8 u8
amdgpu_atombios_encoder_get_backlight_level(struct amdgpu_encoder *amdgpu_encoder); amdgpu_atombios_encoder_get_backlight_level(struct amdgpu_encoder *amdgpu_encoder);
void void
......
...@@ -2921,6 +2921,11 @@ static int dce_v10_0_hw_fini(void *handle) ...@@ -2921,6 +2921,11 @@ static int dce_v10_0_hw_fini(void *handle)
static int dce_v10_0_suspend(void *handle) static int dce_v10_0_suspend(void *handle)
{ {
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
adev->mode_info.bl_level =
amdgpu_atombios_encoder_get_backlight_level_from_reg(adev);
return dce_v10_0_hw_fini(handle); return dce_v10_0_hw_fini(handle);
} }
...@@ -2929,6 +2934,9 @@ static int dce_v10_0_resume(void *handle) ...@@ -2929,6 +2934,9 @@ static int dce_v10_0_resume(void *handle)
struct amdgpu_device *adev = (struct amdgpu_device *)handle; struct amdgpu_device *adev = (struct amdgpu_device *)handle;
int ret; int ret;
amdgpu_atombios_encoder_set_backlight_level_to_reg(adev,
adev->mode_info.bl_level);
ret = dce_v10_0_hw_init(handle); ret = dce_v10_0_hw_init(handle);
/* turn on the BL */ /* turn on the BL */
......
...@@ -3047,6 +3047,11 @@ static int dce_v11_0_hw_fini(void *handle) ...@@ -3047,6 +3047,11 @@ static int dce_v11_0_hw_fini(void *handle)
static int dce_v11_0_suspend(void *handle) static int dce_v11_0_suspend(void *handle)
{ {
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
adev->mode_info.bl_level =
amdgpu_atombios_encoder_get_backlight_level_from_reg(adev);
return dce_v11_0_hw_fini(handle); return dce_v11_0_hw_fini(handle);
} }
...@@ -3055,6 +3060,9 @@ static int dce_v11_0_resume(void *handle) ...@@ -3055,6 +3060,9 @@ static int dce_v11_0_resume(void *handle)
struct amdgpu_device *adev = (struct amdgpu_device *)handle; struct amdgpu_device *adev = (struct amdgpu_device *)handle;
int ret; int ret;
amdgpu_atombios_encoder_set_backlight_level_to_reg(adev,
adev->mode_info.bl_level);
ret = dce_v11_0_hw_init(handle); ret = dce_v11_0_hw_init(handle);
/* turn on the BL */ /* turn on the BL */
......
...@@ -2787,6 +2787,11 @@ static int dce_v6_0_hw_fini(void *handle) ...@@ -2787,6 +2787,11 @@ static int dce_v6_0_hw_fini(void *handle)
static int dce_v6_0_suspend(void *handle) static int dce_v6_0_suspend(void *handle)
{ {
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
adev->mode_info.bl_level =
amdgpu_atombios_encoder_get_backlight_level_from_reg(adev);
return dce_v6_0_hw_fini(handle); return dce_v6_0_hw_fini(handle);
} }
...@@ -2795,6 +2800,9 @@ static int dce_v6_0_resume(void *handle) ...@@ -2795,6 +2800,9 @@ static int dce_v6_0_resume(void *handle)
struct amdgpu_device *adev = (struct amdgpu_device *)handle; struct amdgpu_device *adev = (struct amdgpu_device *)handle;
int ret; int ret;
amdgpu_atombios_encoder_set_backlight_level_to_reg(adev,
adev->mode_info.bl_level);
ret = dce_v6_0_hw_init(handle); ret = dce_v6_0_hw_init(handle);
/* turn on the BL */ /* turn on the BL */
......
...@@ -2819,6 +2819,11 @@ static int dce_v8_0_hw_fini(void *handle) ...@@ -2819,6 +2819,11 @@ static int dce_v8_0_hw_fini(void *handle)
static int dce_v8_0_suspend(void *handle) static int dce_v8_0_suspend(void *handle)
{ {
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
adev->mode_info.bl_level =
amdgpu_atombios_encoder_get_backlight_level_from_reg(adev);
return dce_v8_0_hw_fini(handle); return dce_v8_0_hw_fini(handle);
} }
...@@ -2827,6 +2832,9 @@ static int dce_v8_0_resume(void *handle) ...@@ -2827,6 +2832,9 @@ static int dce_v8_0_resume(void *handle)
struct amdgpu_device *adev = (struct amdgpu_device *)handle; struct amdgpu_device *adev = (struct amdgpu_device *)handle;
int ret; int ret;
amdgpu_atombios_encoder_set_backlight_level_to_reg(adev,
adev->mode_info.bl_level);
ret = dce_v8_0_hw_init(handle); ret = dce_v8_0_hw_init(handle);
/* turn on the BL */ /* turn on the BL */
......
...@@ -34,8 +34,6 @@ void radeon_gem_object_free(struct drm_gem_object *gobj) ...@@ -34,8 +34,6 @@ void radeon_gem_object_free(struct drm_gem_object *gobj)
struct radeon_bo *robj = gem_to_radeon_bo(gobj); struct radeon_bo *robj = gem_to_radeon_bo(gobj);
if (robj) { if (robj) {
if (robj->gem_base.import_attach)
drm_prime_gem_destroy(&robj->gem_base, robj->tbo.sg);
radeon_mn_unregister(robj); radeon_mn_unregister(robj);
radeon_bo_unref(&robj); radeon_bo_unref(&robj);
} }
......
...@@ -82,6 +82,8 @@ static void radeon_ttm_bo_destroy(struct ttm_buffer_object *tbo) ...@@ -82,6 +82,8 @@ static void radeon_ttm_bo_destroy(struct ttm_buffer_object *tbo)
mutex_unlock(&bo->rdev->gem.mutex); mutex_unlock(&bo->rdev->gem.mutex);
radeon_bo_clear_surface_reg(bo); radeon_bo_clear_surface_reg(bo);
WARN_ON_ONCE(!list_empty(&bo->va)); WARN_ON_ONCE(!list_empty(&bo->va));
if (bo->gem_base.import_attach)
drm_prime_gem_destroy(&bo->gem_base, bo->tbo.sg);
drm_gem_object_release(&bo->gem_base); drm_gem_object_release(&bo->gem_base);
kfree(bo); kfree(bo);
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册