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
This commit is contained in:
commit
4cdc8f1285
@ -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 */
|
|
||||||
if (amdgpu_atombios_dp_get_dpcd(amdgpu_connector))
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* set it to OFF so that drm_helper_connector_dpms()
|
/* Turn the connector off and back on immediately, which
|
||||||
* won't return immediately since the current state
|
* will trigger link training
|
||||||
* is ON at this point.
|
*/
|
||||||
*/
|
drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF);
|
||||||
connector->dpms = DRM_MODE_DPMS_OFF;
|
drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON);
|
||||||
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)
|
|||||||
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 {
|
|||||||
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)
|
|||||||
|
|
||||||
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 @@
|
|||||||
#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)
|
|||||||
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 @@
|
|||||||
#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)
|
|||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user