mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-04-11 00:09:30 -04:00
drm/amd/display: Create fake sink and stream for writeback connector
[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 Tested-by: Daniel Wheeler <daniel.wheeler@amd.com> 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>
This commit is contained in:
committed by
Alex Deucher
parent
ff73d4cdde
commit
1fb9d7b975
@@ -5715,13 +5715,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) {
|
||||
@@ -6092,6 +6092,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);
|
||||
@@ -6105,14 +6106,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);
|
||||
|
||||
Reference in New Issue
Block a user