diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0662-Revert-drm-amd-display-Roll-core_sink-into-dc_sink.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0662-Revert-drm-amd-display-Roll-core_sink-into-dc_sink.patch | 483 |
1 files changed, 483 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0662-Revert-drm-amd-display-Roll-core_sink-into-dc_sink.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0662-Revert-drm-amd-display-Roll-core_sink-into-dc_sink.patch new file mode 100644 index 00000000..6448786d --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0662-Revert-drm-amd-display-Roll-core_sink-into-dc_sink.patch @@ -0,0 +1,483 @@ +From 7697dd45d753138d5fb1fedfa26575e2674fbccf Mon Sep 17 00:00:00 2001 +From: Harry Wentland <harry.wentland@amd.com> +Date: Tue, 25 Jul 2017 16:59:15 -0400 +Subject: [PATCH 0662/4131] Revert "drm/amd/display: Roll core_sink into + dc_sink" + +This reverts commit 1a636edfb1db887198014339a58aade7c688aa10. + +Signed-off-by: Alex Deucher <alexander.deucher@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h | 4 +- + drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 2 +- + .../drm/amd/display/amdgpu_dm/amdgpu_dm_types.c | 4 +- + drivers/gpu/drm/amd/display/dc/core/dc.c | 4 +- + drivers/gpu/drm/amd/display/dc/core/dc_link.c | 60 +++++++++++----------- + drivers/gpu/drm/amd/display/dc/core/dc_resource.c | 2 +- + drivers/gpu/drm/amd/display/dc/core/dc_sink.c | 30 ++++++----- + drivers/gpu/drm/amd/display/dc/core/dc_stream.c | 15 +++--- + drivers/gpu/drm/amd/display/dc/dc.h | 19 +++---- + .../amd/display/dc/dce110/dce110_hw_sequencer.c | 2 +- + drivers/gpu/drm/amd/display/dc/inc/core_types.h | 21 +++++++- + 11 files changed, 91 insertions(+), 72 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h +index 5c527f4..cc4f3d1 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h +@@ -566,9 +566,9 @@ struct amdgpu_connector { + int num_modes; + /* The 'old' sink - before an HPD. + * The 'current' sink is in dc_link->sink. */ +- struct dc_sink *dc_sink; ++ const struct dc_sink *dc_sink; + struct dc_link *dc_link; +- struct dc_sink *dc_em_sink; ++ const struct dc_sink *dc_em_sink; + const struct dc_stream *stream; + void *con_priv; + bool dac_load_detect; +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 71178c8..8f18058 100644 +--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c ++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +@@ -697,7 +697,7 @@ void amdgpu_dm_update_connector_after_detect( + { + struct drm_connector *connector = &aconnector->base; + struct drm_device *dev = connector->dev; +- struct dc_sink *sink; ++ const struct dc_sink *sink; + + /* MST handled by drm_mst framework */ + if (aconnector->mst_mgr.mst_state == true) +diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_types.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_types.c +index 30b5f9f..e827e22 100644 +--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_types.c ++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_types.c +@@ -1409,7 +1409,7 @@ int amdgpu_dm_connector_mode_valid( + struct drm_display_mode *mode) + { + int result = MODE_ERROR; +- struct dc_sink *dc_sink; ++ const struct dc_sink *dc_sink; + struct amdgpu_device *adev = connector->dev->dev_private; + struct dc_validation_set val_set = { 0 }; + /* TODO: Unhardcode stream count */ +@@ -1679,7 +1679,7 @@ int dm_create_validation_set_for_connector(struct drm_connector *connector, + struct drm_display_mode *mode, struct dc_validation_set *val_set) + { + int result = MODE_ERROR; +- struct dc_sink *dc_sink = ++ const struct dc_sink *dc_sink = + to_amdgpu_connector(connector)->dc_sink; + /* TODO: Unhardcode stream count */ + struct dc_stream *stream; +diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c +index 30374ff..73740e2 100644 +--- a/drivers/gpu/drm/amd/display/dc/core/dc.c ++++ b/drivers/gpu/drm/amd/display/dc/core/dc.c +@@ -939,7 +939,7 @@ static bool dc_commit_context_no_check(struct dc *dc, struct validate_context *c + program_timing_sync(core_dc, context); + + for (i = 0; i < context->stream_count; i++) { +- const struct dc_sink *sink = context->streams[i]->sink; ++ const struct core_sink *sink = context->streams[i]->sink; + + for (j = 0; j < context->stream_status[i].surface_count; j++) { + const struct dc_surface *surface = +@@ -1984,7 +1984,7 @@ void dc_link_set_sink(struct dc_link *link, struct dc_sink *sink) + } + } + +-void dc_link_remove_remote_sink(struct dc_link *link, struct dc_sink *sink) ++void dc_link_remove_remote_sink(struct dc_link *link, const struct dc_sink *sink) + { + int i; + +diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link.c b/drivers/gpu/drm/amd/display/dc/core/dc_link.c +index e706206..428dbff 100644 +--- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c ++++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c +@@ -541,7 +541,8 @@ bool dc_link_detect(struct dc_link *link, bool boot) + struct audio_support *aud_support = &link->dc->res_pool->audio_support; + enum dc_edid_status edid_status; + struct dc_context *dc_ctx = link->ctx; +- struct dc_sink *sink; ++ struct dc_sink *dc_sink; ++ struct core_sink *sink = NULL; + enum dc_connection_type new_connection_type = dc_connection_none; + + if (link->connector_signal == SIGNAL_TYPE_VIRTUAL) +@@ -636,21 +637,22 @@ bool dc_link_detect(struct dc_link *link, bool boot) + sink_init_data.link = link; + sink_init_data.sink_signal = sink_caps.signal; + +- sink = dc_sink_create(&sink_init_data); +- if (!sink) { ++ dc_sink = dc_sink_create(&sink_init_data); ++ if (!dc_sink) { + DC_ERROR("Failed to create sink!\n"); + return false; + } + +- sink->dongle_max_pix_clk = sink_caps.max_hdmi_pixel_clock; +- sink->converter_disable_audio = converter_disable_audio; ++ dc_sink->dongle_max_pix_clk = sink_caps.max_hdmi_pixel_clock; ++ dc_sink->converter_disable_audio = converter_disable_audio; + +- link->local_sink = sink; ++ sink = DC_SINK_TO_CORE(dc_sink); ++ link->local_sink = &sink->public; + + edid_status = dm_helpers_read_local_edid( + link->ctx, + link, +- sink); ++ &sink->public); + + switch (edid_status) { + case EDID_BAD_CHECKSUM: +@@ -667,16 +669,16 @@ bool dc_link_detect(struct dc_link *link, bool boot) + } + + /* HDMI-DVI Dongle */ +- if (sink->sink_signal == SIGNAL_TYPE_HDMI_TYPE_A && +- !sink->edid_caps.edid_hdmi) +- sink->sink_signal = SIGNAL_TYPE_DVI_SINGLE_LINK; ++ if (dc_sink->sink_signal == SIGNAL_TYPE_HDMI_TYPE_A && ++ !dc_sink->edid_caps.edid_hdmi) ++ dc_sink->sink_signal = SIGNAL_TYPE_DVI_SINGLE_LINK; + + /* Connectivity log: detection */ +- for (i = 0; i < sink->dc_edid.length / EDID_BLOCK_SIZE; i++) { ++ for (i = 0; i < sink->public.dc_edid.length / EDID_BLOCK_SIZE; i++) { + CONN_DATA_DETECT(link, +- &sink->dc_edid.raw_edid[i * EDID_BLOCK_SIZE], ++ &sink->public.dc_edid.raw_edid[i * EDID_BLOCK_SIZE], + EDID_BLOCK_SIZE, +- "%s: [Block %d] ", sink->edid_caps.display_name, i); ++ "%s: [Block %d] ", sink->public.edid_caps.display_name, i); + } + + dm_logger_write(link->ctx->logger, LOG_DETECTION_EDID_PARSER, +@@ -690,16 +692,16 @@ bool dc_link_detect(struct dc_link *link, bool boot) + "speaker_flag = %d, " + "audio_mode_count = %d\n", + __func__, +- sink->edid_caps.manufacturer_id, +- sink->edid_caps.product_id, +- sink->edid_caps.serial_number, +- sink->edid_caps.manufacture_week, +- sink->edid_caps.manufacture_year, +- sink->edid_caps.display_name, +- sink->edid_caps.speaker_flags, +- sink->edid_caps.audio_mode_count); +- +- for (i = 0; i < sink->edid_caps.audio_mode_count; i++) { ++ sink->public.edid_caps.manufacturer_id, ++ sink->public.edid_caps.product_id, ++ sink->public.edid_caps.serial_number, ++ sink->public.edid_caps.manufacture_week, ++ sink->public.edid_caps.manufacture_year, ++ sink->public.edid_caps.display_name, ++ sink->public.edid_caps.speaker_flags, ++ sink->public.edid_caps.audio_mode_count); ++ ++ for (i = 0; i < sink->public.edid_caps.audio_mode_count; i++) { + dm_logger_write(link->ctx->logger, LOG_DETECTION_EDID_PARSER, + "%s: mode number = %d, " + "format_code = %d, " +@@ -708,10 +710,10 @@ bool dc_link_detect(struct dc_link *link, bool boot) + "sample_size = %d\n", + __func__, + i, +- sink->edid_caps.audio_modes[i].format_code, +- sink->edid_caps.audio_modes[i].channel_count, +- sink->edid_caps.audio_modes[i].sample_rate, +- sink->edid_caps.audio_modes[i].sample_size); ++ sink->public.edid_caps.audio_modes[i].format_code, ++ sink->public.edid_caps.audio_modes[i].channel_count, ++ sink->public.edid_caps.audio_modes[i].sample_rate, ++ sink->public.edid_caps.audio_modes[i].sample_size); + } + + } else { +@@ -730,7 +732,7 @@ bool dc_link_detect(struct dc_link *link, bool boot) + } + + LINK_INFO("link=%d, dc_sink_in=%p is now %s\n", +- link->link_index, sink, ++ link->link_index, &sink->public, + (sink_caps.signal == SIGNAL_TYPE_NONE ? + "Disconnected":"Connected")); + +@@ -1345,7 +1347,7 @@ enum dc_status dc_link_validate_mode_timing( + struct dc_link *link, + const struct dc_crtc_timing *timing) + { +- uint32_t max_pix_clk = stream->sink->dongle_max_pix_clk; ++ uint32_t max_pix_clk = stream->sink->public.dongle_max_pix_clk; + + /* A hack to avoid failing any modes for EDID override feature on + * topology change such as lower quality cable for DP or different dongle +diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c +index 71723fb..ec4714e 100644 +--- a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c ++++ b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c +@@ -1528,7 +1528,7 @@ enum dc_status resource_map_pool_resources( + pipe_ctx->stream_enc); + + /* TODO: Add check if ASIC support and EDID audio */ +- if (!stream->sink->converter_disable_audio && ++ if (!stream->sink->public.converter_disable_audio && + dc_is_audio_capable_signal(pipe_ctx->stream->signal) && + stream->public.audio_info.mode_count) { + pipe_ctx->audio = find_first_free_audio( +diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_sink.c b/drivers/gpu/drm/amd/display/dc/core/dc_sink.c +index a83f124..1f7985a 100644 +--- a/drivers/gpu/drm/amd/display/dc/core/dc_sink.c ++++ b/drivers/gpu/drm/amd/display/dc/core/dc_sink.c +@@ -31,15 +31,15 @@ + * Private functions + ******************************************************************************/ + +-static void destruct(struct dc_sink *sink) ++static void destruct(struct core_sink *sink) + { +- if (sink->dc_container_id) { +- dm_free(sink->dc_container_id); +- sink->dc_container_id = NULL; ++ if (sink->public.dc_container_id) { ++ dm_free(sink->public.dc_container_id); ++ sink->public.dc_container_id = NULL; + } + } + +-static bool construct(struct dc_sink *sink, const struct dc_sink_init_data *init_params) ++static bool construct(struct core_sink *sink, const struct dc_sink_init_data *init_params) + { + + struct dc_link *link = init_params->link; +@@ -47,12 +47,12 @@ static bool construct(struct dc_sink *sink, const struct dc_sink_init_data *init + if (!link) + return false; + +- sink->sink_signal = init_params->sink_signal; ++ sink->public.sink_signal = init_params->sink_signal; + sink->link = link; + sink->ctx = link->ctx; +- sink->dongle_max_pix_clk = init_params->dongle_max_pix_clk; +- sink->converter_disable_audio = init_params->converter_disable_audio; +- sink->dc_container_id = NULL; ++ sink->public.dongle_max_pix_clk = init_params->dongle_max_pix_clk; ++ sink->public.converter_disable_audio = init_params->converter_disable_audio; ++ sink->public.dc_container_id = NULL; + + return true; + } +@@ -61,14 +61,18 @@ static bool construct(struct dc_sink *sink, const struct dc_sink_init_data *init + * Public functions + ******************************************************************************/ + +-void dc_sink_retain(struct dc_sink *sink) ++void dc_sink_retain(const struct dc_sink *dc_sink) + { ++ struct core_sink *sink = DC_SINK_TO_CORE(dc_sink); ++ + ASSERT(sink->ref_count > 0); + ++sink->ref_count; + } + +-void dc_sink_release(struct dc_sink *sink) ++void dc_sink_release(const struct dc_sink *dc_sink) + { ++ struct core_sink *sink = DC_SINK_TO_CORE(dc_sink); ++ + ASSERT(sink->ref_count > 0); + --sink->ref_count; + +@@ -80,7 +84,7 @@ void dc_sink_release(struct dc_sink *sink) + + struct dc_sink *dc_sink_create(const struct dc_sink_init_data *init_params) + { +- struct dc_sink *sink = dm_alloc(sizeof(*sink)); ++ struct core_sink *sink = dm_alloc(sizeof(*sink)); + + if (NULL == sink) + goto alloc_fail; +@@ -90,7 +94,7 @@ struct dc_sink *dc_sink_create(const struct dc_sink_init_data *init_params) + + ++sink->ref_count; + +- return sink; ++ return &sink->public; + + construct_fail: + dm_free(sink); +diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_stream.c b/drivers/gpu/drm/amd/display/dc/core/dc_stream.c +index 5b356dd..a329709 100644 +--- a/drivers/gpu/drm/amd/display/dc/core/dc_stream.c ++++ b/drivers/gpu/drm/amd/display/dc/core/dc_stream.c +@@ -46,11 +46,11 @@ struct stream { + ******************************************************************************/ + + static bool construct(struct core_stream *stream, +- struct dc_sink *dc_sink_data) ++ const struct dc_sink *dc_sink_data) + { + uint32_t i = 0; + +- stream->sink = dc_sink_data; ++ stream->sink = DC_SINK_TO_CORE(dc_sink_data); + stream->ctx = stream->sink->ctx; + stream->public.sink = dc_sink_data; + +@@ -97,7 +97,7 @@ static bool construct(struct core_stream *stream, + + static void destruct(struct core_stream *stream) + { +- dc_sink_release(stream->sink); ++ dc_sink_release(&stream->sink->public); + if (stream->public.out_transfer_func != NULL) { + dc_transfer_func_release( + stream->public.out_transfer_func); +@@ -130,8 +130,9 @@ void dc_stream_release(const struct dc_stream *public) + } + + struct dc_stream *dc_create_stream_for_sink( +- struct dc_sink *sink) ++ const struct dc_sink *dc_sink) + { ++ struct core_sink *sink = DC_SINK_TO_CORE(dc_sink); + struct stream *stream; + + if (sink == NULL) +@@ -142,7 +143,7 @@ struct dc_stream *dc_create_stream_for_sink( + if (NULL == stream) + goto alloc_fail; + +- if (false == construct(&stream->protected, sink)) ++ if (false == construct(&stream->protected, dc_sink)) + goto construct_fail; + + stream->ref_count++; +@@ -349,8 +350,8 @@ void dc_stream_log( + dm_logger_write(dm_logger, + log_type, + "\tsink name: %s, serial: %d\n", +- core_stream->sink->edid_caps.display_name, +- core_stream->sink->edid_caps.serial_number); ++ core_stream->sink->public.edid_caps.display_name, ++ core_stream->sink->public.edid_caps.serial_number); + dm_logger_write(dm_logger, + log_type, + "\tlink: %d\n", +diff --git a/drivers/gpu/drm/amd/display/dc/dc.h b/drivers/gpu/drm/amd/display/dc/dc.h +index 77bd546..e15e8fb 100644 +--- a/drivers/gpu/drm/amd/display/dc/dc.h ++++ b/drivers/gpu/drm/amd/display/dc/dc.h +@@ -629,7 +629,7 @@ bool dc_enable_stereo( + /** + * Create a new default stream for the requested sink + */ +-struct dc_stream *dc_create_stream_for_sink(struct dc_sink *dc_sink); ++struct dc_stream *dc_create_stream_for_sink(const struct dc_sink *dc_sink); + + void dc_stream_retain(const struct dc_stream *dc_stream); + void dc_stream_release(const struct dc_stream *dc_stream); +@@ -712,9 +712,9 @@ struct link_mst_stream_allocation_table { + * The currently active signal type (HDMI, DP-SST, DP-MST) is also reported. + */ + struct dc_link { +- struct dc_sink *remote_sinks[MAX_SINKS_PER_LINK]; ++ const struct dc_sink *remote_sinks[MAX_SINKS_PER_LINK]; + unsigned int sink_count; +- struct dc_sink *local_sink; ++ const struct dc_sink *local_sink; + unsigned int link_index; + enum dc_connection_type type; + enum signal_type connector_signal; +@@ -825,7 +825,7 @@ struct dc_sink *dc_link_add_remote_sink( + + void dc_link_remove_remote_sink( + struct dc_link *link, +- struct dc_sink *sink); ++ const struct dc_sink *sink); + + /* Used by diagnostics for virtual link at the moment */ + void dc_link_set_sink(struct dc_link *link, struct dc_sink *sink); +@@ -879,17 +879,10 @@ struct dc_sink { + void *priv; + struct stereo_3d_features features_3d[TIMING_3D_FORMAT_MAX]; + bool converter_disable_audio; +- +- /* private to DC core */ +- struct dc_link *link; +- struct dc_context *ctx; +- +- /* private to dc_sink.c */ +- int ref_count; + }; + +-void dc_sink_retain(struct dc_sink *sink); +-void dc_sink_release(struct dc_sink *sink); ++void dc_sink_retain(const struct dc_sink *sink); ++void dc_sink_release(const struct dc_sink *sink); + + const struct audio **dc_get_audios(struct dc *dc); + +diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c +index 58701fd..fe8084e 100644 +--- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c ++++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c +@@ -657,7 +657,7 @@ static enum dc_status bios_parser_crtc_source_select( + * encoder block + * note: video bios clears all FMT setting here. */ + struct bp_crtc_source_select crtc_source_select = {0}; +- const struct dc_sink *sink = pipe_ctx->stream->sink; ++ const struct core_sink *sink = pipe_ctx->stream->sink; + + crtc_source_select.engine_id = pipe_ctx->stream_enc->id; + crtc_source_select.controller_id = pipe_ctx->pipe_idx + 1; +diff --git a/drivers/gpu/drm/amd/display/dc/inc/core_types.h b/drivers/gpu/drm/amd/display/dc/inc/core_types.h +index 1d733c8..eed31a8 100644 +--- a/drivers/gpu/drm/amd/display/dc/inc/core_types.h ++++ b/drivers/gpu/drm/amd/display/dc/inc/core_types.h +@@ -68,7 +68,7 @@ struct core_stream { + + /* field internal to DC */ + struct dc_context *ctx; +- struct dc_sink *sink; ++ const struct core_sink *sink; + + /* used by DCP and FMT */ + struct bit_depth_reduction_params bit_depth_params; +@@ -80,6 +80,25 @@ struct core_stream { + struct dc_stream_status status; + }; + ++/************ core_sink *****************/ ++ ++#define DC_SINK_TO_CORE(dc_sink) \ ++ container_of(dc_sink, struct core_sink, public) ++ ++struct core_sink { ++ /** The public, read-only (for DM) area of sink. **/ ++ struct dc_sink public; ++ /** End-of-public area. **/ ++ ++ /** The 'protected' area - read/write access, for use only inside DC **/ ++ /* not used for now */ ++ struct dc_link *link; ++ struct dc_context *ctx; ++ ++ /* private to dc_sink.c */ ++ int ref_count; ++}; ++ + /************ link *****************/ + struct link_init_data { + const struct core_dc *dc; +-- +2.7.4 + |