mirror of
https://github.com/torvalds/linux.git
synced 2026-05-23 14:42:08 +02: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:
parent
602b8ef9d2
commit
8dc88c6a59
|
|
@ -3994,7 +3994,7 @@ void amdgpu_dm_update_connector_after_detect(
|
||||||
|
|
||||||
if (sink) {
|
if (sink) {
|
||||||
if (aconnector->dc_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
|
* retain and release below are used to
|
||||||
* bump up refcount for sink because the link doesn't point
|
* 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;
|
aconnector->dc_sink = sink;
|
||||||
dc_sink_retain(aconnector->dc_sink);
|
dc_sink_retain(aconnector->dc_sink);
|
||||||
amdgpu_dm_update_freesync_caps(connector,
|
amdgpu_dm_update_freesync_caps(connector,
|
||||||
aconnector->drm_edid);
|
aconnector->drm_edid, true);
|
||||||
} else {
|
} else {
|
||||||
amdgpu_dm_update_freesync_caps(connector, NULL);
|
amdgpu_dm_update_freesync_caps(connector, NULL, true);
|
||||||
if (!aconnector->dc_sink) {
|
if (!aconnector->dc_sink) {
|
||||||
aconnector->dc_sink = aconnector->dc_em_sink;
|
aconnector->dc_sink = aconnector->dc_em_sink;
|
||||||
dc_sink_retain(aconnector->dc_sink);
|
dc_sink_retain(aconnector->dc_sink);
|
||||||
|
|
@ -4052,7 +4052,7 @@ void amdgpu_dm_update_connector_after_detect(
|
||||||
* If yes, put it here.
|
* If yes, put it here.
|
||||||
*/
|
*/
|
||||||
if (aconnector->dc_sink) {
|
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);
|
dc_sink_release(aconnector->dc_sink);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -4085,13 +4085,13 @@ void amdgpu_dm_update_connector_after_detect(
|
||||||
"failed to create aconnector->requested_timing\n");
|
"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);
|
update_connector_ext_caps(aconnector);
|
||||||
dm_set_panel_type(aconnector);
|
dm_set_panel_type(aconnector);
|
||||||
} else {
|
} else {
|
||||||
hdmi_cec_unset_edid(aconnector);
|
hdmi_cec_unset_edid(aconnector);
|
||||||
drm_dp_cec_unset_edid(&aconnector->dm_dp_aux.aux);
|
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;
|
aconnector->num_modes = 0;
|
||||||
dc_sink_release(aconnector->dc_sink);
|
dc_sink_release(aconnector->dc_sink);
|
||||||
aconnector->dc_sink = NULL;
|
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
|
* drm_edid_connector_add_modes() and need to be
|
||||||
* restored here.
|
* restored here.
|
||||||
*/
|
*/
|
||||||
amdgpu_dm_update_freesync_caps(connector, drm_edid);
|
amdgpu_dm_update_freesync_caps(connector, drm_edid, false);
|
||||||
} else {
|
} else {
|
||||||
amdgpu_dm_connector->num_modes = 0;
|
amdgpu_dm_connector->num_modes = 0;
|
||||||
}
|
}
|
||||||
|
|
@ -13270,7 +13270,7 @@ static int parse_hdmi_amd_vsdb(struct amdgpu_dm_connector *aconnector,
|
||||||
* FreeSync parameters.
|
* FreeSync parameters.
|
||||||
*/
|
*/
|
||||||
void amdgpu_dm_update_freesync_caps(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)
|
||||||
{
|
{
|
||||||
int i = 0;
|
int i = 0;
|
||||||
struct amdgpu_dm_connector *amdgpu_dm_connector =
|
struct amdgpu_dm_connector *amdgpu_dm_connector =
|
||||||
|
|
@ -13377,13 +13377,16 @@ void amdgpu_dm_update_freesync_caps(struct drm_connector *connector,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Handle MCCS */
|
/* 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 ||
|
if ((sink->sink_signal == SIGNAL_TYPE_HDMI_TYPE_A ||
|
||||||
as_type == FREESYNC_TYPE_PCON_IN_WHITELIST) &&
|
as_type == FREESYNC_TYPE_PCON_IN_WHITELIST) &&
|
||||||
(!sink->edid_caps.freesync_vcp_code ||
|
(!sink->edid_caps.freesync_vcp_code ||
|
||||||
(sink->edid_caps.freesync_vcp_code && !sink->mccs_caps.freesync_supported)))
|
(sink->edid_caps.freesync_vcp_code && !sink->mccs_caps.freesync_supported)))
|
||||||
freesync_capable = false;
|
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);
|
dm_helpers_mccs_vcp_set(adev->dm.dc->ctx, amdgpu_dm_connector->dc_link, sink);
|
||||||
|
|
||||||
update:
|
update:
|
||||||
|
|
|
||||||
|
|
@ -1071,7 +1071,7 @@ void dm_restore_drm_connector_state(struct drm_device *dev,
|
||||||
struct drm_connector *connector);
|
struct drm_connector *connector);
|
||||||
|
|
||||||
void amdgpu_dm_update_freesync_caps(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);
|
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) {
|
if (aconnector->dc_sink) {
|
||||||
amdgpu_dm_update_freesync_caps(
|
amdgpu_dm_update_freesync_caps(
|
||||||
connector, aconnector->drm_edid);
|
connector, aconnector->drm_edid, true);
|
||||||
|
|
||||||
#if defined(CONFIG_DRM_AMD_DC_FP)
|
#if defined(CONFIG_DRM_AMD_DC_FP)
|
||||||
if (!validate_dsc_caps_on_connector(aconnector))
|
if (!validate_dsc_caps_on_connector(aconnector))
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user