[PATCH 09/18] drm/amd/display: Create fake sink and stream for writeback connector
Alex Hung
alex.hung at amd.com
Tue Sep 5 18:48:57 UTC 2023
Reviewed-by: Alex Hung <alex.hung at amd.com>
On 2023-08-16 15:26, Alex Hung wrote:
> From: Harry Wentland <harry.wentland at amd.com>
>
> [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
>
> Signed-off-by: Harry Wentland <harry.wentland at amd.com>
> Signed-off-by: Alex Hung <alex.hung at amd.com>
> ---
> .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 33 ++++++++++++-------
> 1 file changed, 22 insertions(+), 11 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 b12e8393fef3..82f00af14ada 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> @@ -5611,13 +5611,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) {
> @@ -5988,6 +5988,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);
> @@ -6001,14 +6002,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);
More information about the amd-gfx
mailing list