diff options
Diffstat (limited to 'drivers/gpu/drm/amd/display/amdgpu_dm')
| -rw-r--r-- | drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 27 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c | 8 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c | 20 | 
3 files changed, 48 insertions, 7 deletions
| 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 c911b30de658..1cd6b9f4a568 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c @@ -51,6 +51,7 @@  #include <drm/drm_hdcp.h>  #endif  #include "amdgpu_pm.h" +#include "amdgpu_atombios.h"  #include "amd_shared.h"  #include "amdgpu_dm_irq.h" @@ -2561,6 +2562,22 @@ static int dm_resume(void *handle)  	if (amdgpu_in_reset(adev)) {  		dc_state = dm->cached_dc_state; +		/* +		 * The dc->current_state is backed up into dm->cached_dc_state +		 * before we commit 0 streams. +		 * +		 * DC will clear link encoder assignments on the real state +		 * but the changes won't propagate over to the copy we made +		 * before the 0 streams commit. +		 * +		 * DC expects that link encoder assignments are *not* valid +		 * when committing a state, so as a workaround it needs to be +		 * cleared here. +		 */ +		link_enc_cfg_init(dm->dc, dc_state); + +		amdgpu_dm_outbox_init(adev); +  		r = dm_dmub_hw_init(adev);  		if (r)  			DRM_ERROR("DMUB interface failed to initialize: status=%d\n", r); @@ -2572,8 +2589,8 @@ static int dm_resume(void *handle)  		for (i = 0; i < dc_state->stream_count; i++) {  			dc_state->streams[i]->mode_changed = true; -			for (j = 0; j < dc_state->stream_status->plane_count; j++) { -				dc_state->stream_status->plane_states[j]->update_flags.raw +			for (j = 0; j < dc_state->stream_status[i].plane_count; j++) { +				dc_state->stream_status[i].plane_states[j]->update_flags.raw  					= 0xffffffff;  			}  		} @@ -3909,6 +3926,9 @@ static int amdgpu_dm_backlight_set_level(struct amdgpu_display_manager *dm,  	caps = dm->backlight_caps[bl_idx];  	dm->brightness[bl_idx] = user_brightness; +	/* update scratch register */ +	if (bl_idx == 0) +		amdgpu_atombios_scratch_regs_set_backlight_level(dm->adev, dm->brightness[bl_idx]);  	brightness = convert_brightness_from_user(&caps, dm->brightness[bl_idx]);  	link = (struct dc_link *)dm->backlight_link[bl_idx]; @@ -4242,7 +4262,8 @@ static int amdgpu_dm_initialize_drm_device(struct amdgpu_device *adev)  		} else if (dc_link_detect(link, DETECT_REASON_BOOT)) {  			amdgpu_dm_update_connector_after_detect(aconnector);  			register_backlight_device(dm, link); - +			if (dm->num_of_edps) +				update_connector_ext_caps(aconnector);  			if (psr_feature_enabled)  				amdgpu_dm_set_psr_caps(link);  		} diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c index cce062adc439..8a441a22c46e 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c @@ -314,6 +314,14 @@ int amdgpu_dm_crtc_set_crc_source(struct drm_crtc *crtc, const char *src_name)  			ret = -EINVAL;  			goto cleanup;  		} + +		if ((aconn->base.connector_type != DRM_MODE_CONNECTOR_DisplayPort) && +				(aconn->base.connector_type != DRM_MODE_CONNECTOR_eDP)) { +			DRM_DEBUG_DRIVER("No DP connector available for CRC source\n"); +			ret = -EINVAL; +			goto cleanup; +		} +  	}  #if defined(CONFIG_DRM_AMD_SECURE_DISPLAY) diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c index 32a5ce09a62a..cc34a35d0bcb 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c @@ -36,6 +36,8 @@  #include "dm_helpers.h"  #include "dc_link_ddc.h" +#include "ddc_service_types.h" +#include "dpcd_defs.h"  #include "i2caux_interface.h"  #include "dmub_cmd.h" @@ -157,6 +159,16 @@ static const struct drm_connector_funcs dm_dp_mst_connector_funcs = {  };  #if defined(CONFIG_DRM_AMD_DC_DCN) +static bool needs_dsc_aux_workaround(struct dc_link *link) +{ +	if (link->dpcd_caps.branch_dev_id == DP_BRANCH_DEVICE_ID_90CC24 && +	    (link->dpcd_caps.dpcd_rev.raw == DPCD_REV_14 || link->dpcd_caps.dpcd_rev.raw == DPCD_REV_12) && +	    link->dpcd_caps.sink_count.bits.SINK_COUNT >= 2) +		return true; + +	return false; +} +  static bool validate_dsc_caps_on_connector(struct amdgpu_dm_connector *aconnector)  {  	struct dc_sink *dc_sink = aconnector->dc_sink; @@ -166,7 +178,7 @@ static bool validate_dsc_caps_on_connector(struct amdgpu_dm_connector *aconnecto  	u8 *dsc_branch_dec_caps = NULL;  	aconnector->dsc_aux = drm_dp_mst_dsc_aux_for_port(port); -#if defined(CONFIG_HP_HOOK_WORKAROUND) +  	/*  	 * drm_dp_mst_dsc_aux_for_port() will return NULL for certain configs  	 * because it only check the dsc/fec caps of the "port variable" and not the dock @@ -176,10 +188,10 @@ static bool validate_dsc_caps_on_connector(struct amdgpu_dm_connector *aconnecto  	 * Workaround: explicitly check the use case above and use the mst dock's aux as dsc_aux  	 *  	 */ - -	if (!aconnector->dsc_aux && !port->parent->port_parent) +	if (!aconnector->dsc_aux && !port->parent->port_parent && +	    needs_dsc_aux_workaround(aconnector->dc_link))  		aconnector->dsc_aux = &aconnector->mst_port->dm_dp_aux.aux; -#endif +  	if (!aconnector->dsc_aux)  		return false; |