mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-16 12:31:52 -04:00
drm/amd/display: Avoid to do MCCS transaction if unnecessary
We don't have to do MCCS/DDCCI transactions with sink side every time by calling get_modes(). Limit it to be operated when hotplug occurs. Reviewed-by: Harry Wentland <harry.wentland@amd.com> Signed-off-by: Wayne Lin <Wayne.Lin@amd.com> Signed-off-by: Roman Li <roman.li@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
@@ -3994,7 +3994,7 @@ void amdgpu_dm_update_connector_after_detect(
|
||||
|
||||
if (sink) {
|
||||
if (aconnector->dc_sink) {
|
||||
amdgpu_dm_update_freesync_caps(connector, NULL);
|
||||
amdgpu_dm_update_freesync_caps(connector, NULL, true);
|
||||
/*
|
||||
* retain and release below are used to
|
||||
* bump up refcount for sink because the link doesn't point
|
||||
@@ -4006,9 +4006,9 @@ void amdgpu_dm_update_connector_after_detect(
|
||||
aconnector->dc_sink = sink;
|
||||
dc_sink_retain(aconnector->dc_sink);
|
||||
amdgpu_dm_update_freesync_caps(connector,
|
||||
aconnector->drm_edid);
|
||||
aconnector->drm_edid, true);
|
||||
} else {
|
||||
amdgpu_dm_update_freesync_caps(connector, NULL);
|
||||
amdgpu_dm_update_freesync_caps(connector, NULL, true);
|
||||
if (!aconnector->dc_sink) {
|
||||
aconnector->dc_sink = aconnector->dc_em_sink;
|
||||
dc_sink_retain(aconnector->dc_sink);
|
||||
@@ -4052,7 +4052,7 @@ void amdgpu_dm_update_connector_after_detect(
|
||||
* If yes, put it here.
|
||||
*/
|
||||
if (aconnector->dc_sink) {
|
||||
amdgpu_dm_update_freesync_caps(connector, NULL);
|
||||
amdgpu_dm_update_freesync_caps(connector, NULL, true);
|
||||
dc_sink_release(aconnector->dc_sink);
|
||||
}
|
||||
|
||||
@@ -4085,13 +4085,13 @@ void amdgpu_dm_update_connector_after_detect(
|
||||
"failed to create aconnector->requested_timing\n");
|
||||
}
|
||||
|
||||
amdgpu_dm_update_freesync_caps(connector, aconnector->drm_edid);
|
||||
amdgpu_dm_update_freesync_caps(connector, aconnector->drm_edid, true);
|
||||
update_connector_ext_caps(aconnector);
|
||||
dm_set_panel_type(aconnector);
|
||||
} else {
|
||||
hdmi_cec_unset_edid(aconnector);
|
||||
drm_dp_cec_unset_edid(&aconnector->dm_dp_aux.aux);
|
||||
amdgpu_dm_update_freesync_caps(connector, NULL);
|
||||
amdgpu_dm_update_freesync_caps(connector, NULL, true);
|
||||
aconnector->num_modes = 0;
|
||||
dc_sink_release(aconnector->dc_sink);
|
||||
aconnector->dc_sink = NULL;
|
||||
@@ -8855,7 +8855,7 @@ static void amdgpu_dm_connector_ddc_get_modes(struct drm_connector *connector,
|
||||
* drm_edid_connector_add_modes() and need to be
|
||||
* restored here.
|
||||
*/
|
||||
amdgpu_dm_update_freesync_caps(connector, drm_edid);
|
||||
amdgpu_dm_update_freesync_caps(connector, drm_edid, false);
|
||||
} else {
|
||||
amdgpu_dm_connector->num_modes = 0;
|
||||
}
|
||||
@@ -13270,7 +13270,7 @@ static int parse_hdmi_amd_vsdb(struct amdgpu_dm_connector *aconnector,
|
||||
* FreeSync parameters.
|
||||
*/
|
||||
void amdgpu_dm_update_freesync_caps(struct drm_connector *connector,
|
||||
const struct drm_edid *drm_edid)
|
||||
const struct drm_edid *drm_edid, bool do_mccs)
|
||||
{
|
||||
int i = 0;
|
||||
struct amdgpu_dm_connector *amdgpu_dm_connector =
|
||||
@@ -13377,13 +13377,16 @@ void amdgpu_dm_update_freesync_caps(struct drm_connector *connector,
|
||||
}
|
||||
|
||||
/* Handle MCCS */
|
||||
dm_helpers_read_mccs_caps(adev->dm.dc->ctx, amdgpu_dm_connector->dc_link, sink);
|
||||
if (do_mccs)
|
||||
dm_helpers_read_mccs_caps(adev->dm.dc->ctx, amdgpu_dm_connector->dc_link, sink);
|
||||
|
||||
if ((sink->sink_signal == SIGNAL_TYPE_HDMI_TYPE_A ||
|
||||
as_type == FREESYNC_TYPE_PCON_IN_WHITELIST) &&
|
||||
(!sink->edid_caps.freesync_vcp_code ||
|
||||
(sink->edid_caps.freesync_vcp_code && !sink->mccs_caps.freesync_supported)))
|
||||
freesync_capable = false;
|
||||
if (sink->mccs_caps.freesync_supported && freesync_capable)
|
||||
|
||||
if (do_mccs && sink->mccs_caps.freesync_supported && freesync_capable)
|
||||
dm_helpers_mccs_vcp_set(adev->dm.dc->ctx, amdgpu_dm_connector->dc_link, sink);
|
||||
|
||||
update:
|
||||
|
||||
@@ -1071,7 +1071,7 @@ void dm_restore_drm_connector_state(struct drm_device *dev,
|
||||
struct drm_connector *connector);
|
||||
|
||||
void amdgpu_dm_update_freesync_caps(struct drm_connector *connector,
|
||||
const struct drm_edid *drm_edid);
|
||||
const struct drm_edid *drm_edid, bool do_mccs);
|
||||
|
||||
void amdgpu_dm_trigger_timing_sync(struct drm_device *dev);
|
||||
|
||||
|
||||
@@ -474,7 +474,7 @@ static int dm_dp_mst_get_modes(struct drm_connector *connector)
|
||||
|
||||
if (aconnector->dc_sink) {
|
||||
amdgpu_dm_update_freesync_caps(
|
||||
connector, aconnector->drm_edid);
|
||||
connector, aconnector->drm_edid, true);
|
||||
|
||||
#if defined(CONFIG_DRM_AMD_DC_FP)
|
||||
if (!validate_dsc_caps_on_connector(aconnector))
|
||||
|
||||
Reference in New Issue
Block a user