aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0300-drm-amd-display-Add-audio-video-ContainerId-implemen.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0300-drm-amd-display-Add-audio-video-ContainerId-implemen.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0300-drm-amd-display-Add-audio-video-ContainerId-implemen.patch149
1 files changed, 149 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0300-drm-amd-display-Add-audio-video-ContainerId-implemen.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0300-drm-amd-display-Add-audio-video-ContainerId-implemen.patch
new file mode 100644
index 00000000..af8393f1
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0300-drm-amd-display-Add-audio-video-ContainerId-implemen.patch
@@ -0,0 +1,149 @@
+From 964869faf3494c212dd7516eb3e43fa9e9657a24 Mon Sep 17 00:00:00 2001
+From: xhdu <Duke.Du@amd.com>
+Date: Tue, 21 Mar 2017 11:05:32 -0400
+Subject: [PATCH 0300/4131] drm/amd/display: Add audio/video ContainerId
+ implementation
+
+Leave hardcoded if no ContainerId provided by DM.
+
+Signed-off-by: Duke Du <Duke.Du@amd.com>
+Acked-by: Harry Wentland <Harry.Wentland@amd.com>
+Reviewed-by: Charlene Liu <Charlene.Liu@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ drivers/gpu/drm/amd/display/dc/core/dc_sink.c | 39 ++++++++++++++++++++++++-
+ drivers/gpu/drm/amd/display/dc/core/dc_stream.c | 14 +++++++--
+ drivers/gpu/drm/amd/display/dc/dc.h | 14 +++++++++
+ 3 files changed, 63 insertions(+), 4 deletions(-)
+
+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 8a20473..da99556 100644
+--- a/drivers/gpu/drm/amd/display/dc/core/dc_sink.c
++++ b/drivers/gpu/drm/amd/display/dc/core/dc_sink.c
+@@ -45,7 +45,10 @@ struct sink {
+
+ static void destruct(struct sink *sink)
+ {
+-
++ if (sink->protected.public.dc_container_id) {
++ dm_free(sink->protected.public.dc_container_id);
++ sink->protected.public.dc_container_id = NULL;
++ }
+ }
+
+ static bool construct(struct sink *sink, const struct dc_sink_init_data *init_params)
+@@ -63,6 +66,7 @@ static bool construct(struct sink *sink, const struct dc_sink_init_data *init_pa
+ sink->protected.public.dongle_max_pix_clk = init_params->dongle_max_pix_clk;
+ sink->protected.public.converter_disable_audio =
+ init_params->converter_disable_audio;
++ sink->protected.public.dc_container_id = NULL;
+
+ return true;
+ }
+@@ -113,6 +117,39 @@ struct dc_sink *dc_sink_create(const struct dc_sink_init_data *init_params)
+ return NULL;
+ }
+
++bool dc_sink_get_container_id(struct dc_sink *dc_sink, struct dc_container_id *container_id)
++{
++ if (dc_sink && container_id && dc_sink->dc_container_id) {
++ memmove(&container_id->guid, &dc_sink->dc_container_id->guid,
++ sizeof(container_id->guid));
++ memmove(&container_id->portId, &dc_sink->dc_container_id->portId,
++ sizeof(container_id->portId));
++ container_id->manufacturerName = dc_sink->dc_container_id->manufacturerName;
++ container_id->productCode = dc_sink->dc_container_id->productCode;
++ return true;
++ }
++ return false;
++}
++
++bool dc_sink_set_container_id(struct dc_sink *dc_sink, const struct dc_container_id *container_id)
++{
++ if (dc_sink && container_id) {
++ if (!dc_sink->dc_container_id)
++ dc_sink->dc_container_id = dm_alloc(sizeof(*dc_sink->dc_container_id));
++
++ if (dc_sink->dc_container_id) {
++ memmove(&dc_sink->dc_container_id->guid, &container_id->guid,
++ sizeof(container_id->guid));
++ memmove(&dc_sink->dc_container_id->portId, &container_id->portId,
++ sizeof(container_id->portId));
++ dc_sink->dc_container_id->manufacturerName = container_id->manufacturerName;
++ dc_sink->dc_container_id->productCode = container_id->productCode;
++ return true;
++ }
++ }
++ return false;
++}
++
+ /*******************************************************************************
+ * Protected functions - visible only inside of DC (not visible in DM)
+ ******************************************************************************/
+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 bafba1f..512a53b 100644
+--- a/drivers/gpu/drm/amd/display/dc/core/dc_stream.c
++++ b/drivers/gpu/drm/amd/display/dc/core/dc_stream.c
+@@ -76,9 +76,17 @@ static bool construct(struct core_stream *stream,
+ stream->public.audio_info.product_id = dc_sink_data->edid_caps.product_id;
+ stream->public.audio_info.flags.all = dc_sink_data->edid_caps.speaker_flags;
+
+- /* TODO - Unhardcode port_id */
+- stream->public.audio_info.port_id[0] = 0x5558859e;
+- stream->public.audio_info.port_id[1] = 0xd989449;
++ if (dc_sink_data->dc_container_id != NULL) {
++ struct dc_container_id *dc_container_id = dc_sink_data->dc_container_id;
++
++ stream->public.audio_info.port_id[0] = dc_container_id->portId[0];
++ stream->public.audio_info.port_id[1] = dc_container_id->portId[1];
++ } else {
++ /* TODO - WindowDM has implemented,
++ other DMs need Unhardcode port_id */
++ stream->public.audio_info.port_id[0] = 0x5558859e;
++ stream->public.audio_info.port_id[1] = 0xd989449;
++ }
+
+ /* EDID CAP translation for HDMI 2.0 */
+ stream->public.timing.flags.LTE_340MCSC_SCRAMBLE = dc_sink_data->edid_caps.lte_340mcsc_scramble;
+diff --git a/drivers/gpu/drm/amd/display/dc/dc.h b/drivers/gpu/drm/amd/display/dc/dc.h
+index 8b033ba..b3d5b92 100644
+--- a/drivers/gpu/drm/amd/display/dc/dc.h
++++ b/drivers/gpu/drm/amd/display/dc/dc.h
+@@ -695,6 +695,17 @@ bool dc_link_dp_set_test_pattern(
+ * Sink Interfaces - A sink corresponds to a display output device
+ ******************************************************************************/
+
++struct dc_container_id {
++ // 128bit GUID in binary form
++ unsigned char guid[16];
++ // 8 byte port ID -> ELD.PortID
++ unsigned int portId[2];
++ // 128bit GUID in binary formufacturer name -> ELD.ManufacturerName
++ unsigned short manufacturerName;
++ // 2 byte product code -> ELD.ProductCode
++ unsigned short productCode;
++};
++
+ /*
+ * The sink structure contains EDID and other display device properties
+ */
+@@ -702,6 +713,7 @@ struct dc_sink {
+ enum signal_type sink_signal;
+ struct dc_edid dc_edid; /* raw edid */
+ struct dc_edid_caps edid_caps; /* parse display caps */
++ struct dc_container_id *dc_container_id;
+ uint32_t dongle_max_pix_clk;
+ bool converter_disable_audio;
+ };
+@@ -719,6 +731,8 @@ struct dc_sink_init_data {
+ };
+
+ struct dc_sink *dc_sink_create(const struct dc_sink_init_data *init_params);
++bool dc_sink_get_container_id(struct dc_sink *dc_sink, struct dc_container_id *container_id);
++bool dc_sink_set_container_id(struct dc_sink *dc_sink, const struct dc_container_id *container_id);
+
+ /*******************************************************************************
+ * Cursor interfaces - To manages the cursor within a stream
+--
+2.7.4
+