drm/amd/display: implement force function in amdgpu_dm_connector_funcs
authorAlex Hung <alex.hung@amd.com>
Wed, 5 Apr 2023 19:47:41 +0000 (13:47 -0600)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 24 Apr 2023 22:36:45 +0000 (18:36 -0400)
[Why]
When userspace (IGT) inserts EDID with audio data (ELD), EDID
is not updated.

[How]
Implements force function (amdgpu_dm_connector_funcs_force) in
amdgpu_dm_connector_funcs to create emulated sink and to handle
EDID.

Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Reviewed-by: Hersen Wu <hersenxs.wu@amd.com>
Acked-by: Rodrigo Siqueira <Rodrigo.Siqueira@amd.com>
Signed-off-by: Alex Hung <alex.hung@amd.com>
Signed-off-by: Wenchieh Chien <wenchieh.chien@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c

index deb7404..b265434 100644 (file)
@@ -6346,6 +6346,31 @@ amdgpu_dm_connector_late_register(struct drm_connector *connector)
        return 0;
 }
 
+void amdgpu_dm_connector_funcs_force(struct drm_connector *connector)
+{
+       struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
+       struct dc_link *dc_link = aconnector->dc_link;
+       struct dc_sink *dc_em_sink = aconnector->dc_em_sink;
+       struct edid *edid;
+
+       if (!connector->edid_override)
+               return;
+
+       drm_edid_override_connector_update(&aconnector->base);
+       edid = aconnector->base.edid_blob_ptr->data;
+       aconnector->edid = edid;
+
+       /* Update emulated (virtual) sink's EDID */
+       if (dc_em_sink && dc_link) {
+               memset(&dc_em_sink->edid_caps, 0, sizeof(struct dc_edid_caps));
+               memmove(dc_em_sink->dc_edid.raw_edid, edid, (edid->extensions + 1) * EDID_LENGTH);
+               dm_helpers_parse_edid_caps(
+                       dc_link,
+                       &dc_em_sink->dc_edid,
+                       &dc_em_sink->edid_caps);
+       }
+}
+
 static const struct drm_connector_funcs amdgpu_dm_connector_funcs = {
        .reset = amdgpu_dm_connector_funcs_reset,
        .detect = amdgpu_dm_connector_detect,
@@ -6356,7 +6381,8 @@ static const struct drm_connector_funcs amdgpu_dm_connector_funcs = {
        .atomic_set_property = amdgpu_dm_connector_atomic_set_property,
        .atomic_get_property = amdgpu_dm_connector_atomic_get_property,
        .late_register = amdgpu_dm_connector_late_register,
-       .early_unregister = amdgpu_dm_connector_unregister
+       .early_unregister = amdgpu_dm_connector_unregister,
+       .force = amdgpu_dm_connector_funcs_force
 };
 
 static int get_modes(struct drm_connector *connector)