]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
drm/amd/display: Create fake sink and stream for writeback connector
authorHarry Wentland <harry.wentland@amd.com>
Wed, 2 Nov 2022 20:06:30 +0000 (16:06 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 3 Oct 2023 19:41:58 +0000 (15:41 -0400)
[WHAT]
Writeback connectors don't have a physical sink but DC still
needs a sink to function. Create a fake sink and stream for
writeback connectors

Reviewed-by: Alex Hung <alex.hung@amd.com>
Signed-off-by: Harry Wentland <harry.wentland@amd.com>
Signed-off-by: Alex Hung <alex.hung@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c

index ed7aecfeaba1725419a2d77d8983b9ac6c81e9f0..2b277f3a7291458de7ba5a537e677d4b666aa65d 100644 (file)
@@ -5755,13 +5755,13 @@ decide_crtc_timing_for_drm_display_mode(struct drm_display_mode *drm_mode,
 }
 
 static struct dc_sink *
-create_fake_sink(struct amdgpu_dm_connector *aconnector)
+create_fake_sink(struct dc_link *link)
 {
        struct dc_sink_init_data sink_init_data = { 0 };
        struct dc_sink *sink = NULL;
 
-       sink_init_data.link = aconnector->dc_link;
-       sink_init_data.sink_signal = aconnector->dc_link->connector_signal;
+       sink_init_data.link = link;
+       sink_init_data.sink_signal = link->connector_signal;
 
        sink = dc_sink_create(&sink_init_data);
        if (!sink) {
@@ -6132,6 +6132,7 @@ create_stream_for_sink(struct drm_connector *connector,
        enum color_transfer_func tf = TRANSFER_FUNC_UNKNOWN;
        struct dsc_dec_dpcd_caps dsc_caps;
 
+       struct dc_link *link = NULL;
        struct dc_sink *sink = NULL;
 
        drm_mode_init(&mode, drm_mode);
@@ -6145,14 +6146,24 @@ create_stream_for_sink(struct drm_connector *connector,
        if (connector->connector_type != DRM_MODE_CONNECTOR_WRITEBACK) {
                aconnector = NULL;
                aconnector = to_amdgpu_dm_connector(connector);
-               if (!aconnector->dc_sink) {
-                       sink = create_fake_sink(aconnector);
-                       if (!sink)
-                               return stream;
-               } else {
-                       sink = aconnector->dc_sink;
-                       dc_sink_retain(sink);
-               }
+               link = aconnector->dc_link;
+       } else {
+               struct drm_writeback_connector *wbcon = NULL;
+               struct amdgpu_dm_wb_connector *dm_wbcon = NULL;
+
+               wbcon = drm_connector_to_writeback(connector);
+               dm_wbcon = to_amdgpu_dm_wb_connector(wbcon);
+               link = dm_wbcon->link;
+       }
+
+       if (!aconnector || !aconnector->dc_sink) {
+               sink = create_fake_sink(link);
+               if (!sink)
+                       return stream;
+
+       } else {
+               sink = aconnector->dc_sink;
+               dc_sink_retain(sink);
        }
 
        stream = dc_create_stream_for_sink(sink);