aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.19.8/0882-drm-amd-display-Info-frame-cleanup.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/0882-drm-amd-display-Info-frame-cleanup.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.19.8/0882-drm-amd-display-Info-frame-cleanup.patch352
1 files changed, 352 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/0882-drm-amd-display-Info-frame-cleanup.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/0882-drm-amd-display-Info-frame-cleanup.patch
new file mode 100644
index 00000000..37d5b8d3
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/0882-drm-amd-display-Info-frame-cleanup.patch
@@ -0,0 +1,352 @@
+From 7fdba8fa7154c53645cc4341b692bb8057aa8e12 Mon Sep 17 00:00:00 2001
+From: Harmanprit Tatla <Harmanprit.Tatla@amd.com>
+Date: Mon, 5 Nov 2018 17:55:53 -0500
+Subject: [PATCH 0882/2940] drm/amd/display: Info frame cleanup
+
+* Use provided infopacket in stream (if valid) instead of reconstructing
+ in set_vendor_info_packet()
+* Use proper format for enums
+* Use dc info packet struct instead
+
+Signed-off-by: Harmanprit Tatla <Harmanprit.Tatla@amd.com>
+Reviewed-by: Anthony Koo <Anthony.Koo@amd.com>
+Acked-by: Krunoslav Kovac <Krunoslav.Kovac@amd.com>
+Acked-by: Leo Li <sunpeng.li@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 6 +-
+ .../gpu/drm/amd/display/dc/core/dc_resource.c | 110 +-----------------
+ drivers/gpu/drm/amd/display/dc/dc_stream.h | 2 +
+ .../amd/display/modules/freesync/freesync.c | 10 +-
+ .../amd/display/modules/inc/mod_info_packet.h | 14 +--
+ .../drm/amd/display/modules/inc/mod_shared.h | 27 +++--
+ .../display/modules/info_packet/info_packet.c | 15 +--
+ 7 files changed, 42 insertions(+), 142 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 653bd5ad8e32..f699ad17d33e 100644
+--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+@@ -72,6 +72,7 @@
+
+ #include "modules/inc/mod_freesync.h"
+ #include "modules/power/power_helpers.h"
++#include "modules/inc/mod_info_packet.h"
+
+ #define FIRMWARE_RAVEN_DMCU "amdgpu/raven_dmcu.bin"
+ MODULE_FIRMWARE(FIRMWARE_RAVEN_DMCU);
+@@ -2948,6 +2949,7 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector,
+
+ if (dm_state && dm_state->freesync_capable)
+ stream->ignore_msa_timing_param = true;
++
+ finish:
+ if (sink && sink->sink_signal == SIGNAL_TYPE_VIRTUAL && aconnector->base.force != DRM_FORCE_ON)
+ dc_sink_release(sink);
+@@ -4458,8 +4460,8 @@ static void update_freesync_state_on_stream(
+ dm->freesync_module,
+ new_stream,
+ &vrr,
+- packet_type_vrr,
+- transfer_func_unknown,
++ PACKET_TYPE_VRR,
++ TRANSFER_FUNC_UNKNOWN,
+ &vrr_infopacket);
+
+ new_crtc_state->freesync_timing_changed =
+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 c4fde1ad97ba..d57842743f51 100644
+--- a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
++++ b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
+@@ -2233,113 +2233,15 @@ static void set_vendor_info_packet(
+ struct dc_info_packet *info_packet,
+ struct dc_stream_state *stream)
+ {
+- uint32_t length = 0;
+- bool hdmi_vic_mode = false;
+- uint8_t checksum = 0;
+- uint32_t i = 0;
+- enum dc_timing_3d_format format;
+- // Can be different depending on packet content /*todo*/
+- // unsigned int length = pPathMode->dolbyVision ? 24 : 5;
+-
+- info_packet->valid = false;
+-
+- format = stream->timing.timing_3d_format;
+- if (stream->view_format == VIEW_3D_FORMAT_NONE)
+- format = TIMING_3D_FORMAT_NONE;
+-
+- /* Can be different depending on packet content */
+- length = 5;
+-
+- if (stream->timing.hdmi_vic != 0
+- && stream->timing.h_total >= 3840
+- && stream->timing.v_total >= 2160)
+- hdmi_vic_mode = true;
+-
+- /* According to HDMI 1.4a CTS, VSIF should be sent
+- * for both 3D stereo and HDMI VIC modes.
+- * For all other modes, there is no VSIF sent. */
++ /* SPD info packet for FreeSync */
+
+- if (format == TIMING_3D_FORMAT_NONE && !hdmi_vic_mode)
++ /* Check if Freesync is supported. Return if false. If true,
++ * set the corresponding bit in the info packet
++ */
++ if (!stream->vsp_infopacket.valid)
+ return;
+
+- /* 24bit IEEE Registration identifier (0x000c03). LSB first. */
+- info_packet->sb[1] = 0x03;
+- info_packet->sb[2] = 0x0C;
+- info_packet->sb[3] = 0x00;
+-
+- /*PB4: 5 lower bytes = 0 (reserved). 3 higher bits = HDMI_Video_Format.
+- * The value for HDMI_Video_Format are:
+- * 0x0 (0b000) - No additional HDMI video format is presented in this
+- * packet
+- * 0x1 (0b001) - Extended resolution format present. 1 byte of HDMI_VIC
+- * parameter follows
+- * 0x2 (0b010) - 3D format indication present. 3D_Structure and
+- * potentially 3D_Ext_Data follows
+- * 0x3..0x7 (0b011..0b111) - reserved for future use */
+- if (format != TIMING_3D_FORMAT_NONE)
+- info_packet->sb[4] = (2 << 5);
+- else if (hdmi_vic_mode)
+- info_packet->sb[4] = (1 << 5);
+-
+- /* PB5: If PB4 claims 3D timing (HDMI_Video_Format = 0x2):
+- * 4 lower bites = 0 (reserved). 4 higher bits = 3D_Structure.
+- * The value for 3D_Structure are:
+- * 0x0 - Frame Packing
+- * 0x1 - Field Alternative
+- * 0x2 - Line Alternative
+- * 0x3 - Side-by-Side (full)
+- * 0x4 - L + depth
+- * 0x5 - L + depth + graphics + graphics-depth
+- * 0x6 - Top-and-Bottom
+- * 0x7 - Reserved for future use
+- * 0x8 - Side-by-Side (Half)
+- * 0x9..0xE - Reserved for future use
+- * 0xF - Not used */
+- switch (format) {
+- case TIMING_3D_FORMAT_HW_FRAME_PACKING:
+- case TIMING_3D_FORMAT_SW_FRAME_PACKING:
+- info_packet->sb[5] = (0x0 << 4);
+- break;
+-
+- case TIMING_3D_FORMAT_SIDE_BY_SIDE:
+- case TIMING_3D_FORMAT_SBS_SW_PACKED:
+- info_packet->sb[5] = (0x8 << 4);
+- length = 6;
+- break;
+-
+- case TIMING_3D_FORMAT_TOP_AND_BOTTOM:
+- case TIMING_3D_FORMAT_TB_SW_PACKED:
+- info_packet->sb[5] = (0x6 << 4);
+- break;
+-
+- default:
+- break;
+- }
+-
+- /*PB5: If PB4 is set to 0x1 (extended resolution format)
+- * fill PB5 with the correct HDMI VIC code */
+- if (hdmi_vic_mode)
+- info_packet->sb[5] = stream->timing.hdmi_vic;
+-
+- /* Header */
+- info_packet->hb0 = HDMI_INFOFRAME_TYPE_VENDOR; /* VSIF packet type. */
+- info_packet->hb1 = 0x01; /* Version */
+-
+- /* 4 lower bits = Length, 4 higher bits = 0 (reserved) */
+- info_packet->hb2 = (uint8_t) (length);
+-
+- /* Calculate checksum */
+- checksum = 0;
+- checksum += info_packet->hb0;
+- checksum += info_packet->hb1;
+- checksum += info_packet->hb2;
+-
+- for (i = 1; i <= length; i++)
+- checksum += info_packet->sb[i];
+-
+- info_packet->sb[0] = (uint8_t) (0x100 - checksum);
+-
+- info_packet->valid = true;
++ *info_packet = stream->vsp_infopacket;
+ }
+
+ static void set_spd_info_packet(
+diff --git a/drivers/gpu/drm/amd/display/dc/dc_stream.h b/drivers/gpu/drm/amd/display/dc/dc_stream.h
+index 771d9f17e26e..0c42418b0b3d 100644
+--- a/drivers/gpu/drm/amd/display/dc/dc_stream.h
++++ b/drivers/gpu/drm/amd/display/dc/dc_stream.h
+@@ -56,6 +56,7 @@ struct dc_stream_state {
+ struct dc_crtc_timing_adjust adjust;
+ struct dc_info_packet vrr_infopacket;
+ struct dc_info_packet vsc_infopacket;
++ struct dc_info_packet vsp_infopacket;
+
+ struct rect src; /* composition area */
+ struct rect dst; /* stream addressable area */
+@@ -129,6 +130,7 @@ struct dc_stream_update {
+ struct dc_crtc_timing_adjust *adjust;
+ struct dc_info_packet *vrr_infopacket;
+ struct dc_info_packet *vsc_infopacket;
++ struct dc_info_packet *vsp_infopacket;
+
+ bool *dpms_off;
+
+diff --git a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c
+index 620a171620ee..1544ed3f1747 100644
+--- a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c
++++ b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c
+@@ -608,12 +608,12 @@ static void build_vrr_infopacket_data(const struct mod_vrr_params *vrr,
+ static void build_vrr_infopacket_fs2_data(enum color_transfer_func app_tf,
+ struct dc_info_packet *infopacket)
+ {
+- if (app_tf != transfer_func_unknown) {
++ if (app_tf != TRANSFER_FUNC_UNKNOWN) {
+ infopacket->valid = true;
+
+ infopacket->sb[6] |= 0x08; // PB6 = [Bit 3 = Native Color Active]
+
+- if (app_tf == transfer_func_gamma_22) {
++ if (app_tf == TRANSFER_FUNC_GAMMA_22) {
+ infopacket->sb[9] |= 0x04; // PB6 = [Bit 2 = Gamma 2.2 EOTF Active]
+ }
+ }
+@@ -688,11 +688,11 @@ void mod_freesync_build_vrr_infopacket(struct mod_freesync *mod_freesync,
+ return;
+
+ switch (packet_type) {
+- case packet_type_fs2:
++ case PACKET_TYPE_FS2:
+ build_vrr_infopacket_v2(stream->signal, vrr, app_tf, infopacket);
+ break;
+- case packet_type_vrr:
+- case packet_type_fs1:
++ case PACKET_TYPE_VRR:
++ case PACKET_TYPE_FS1:
+ default:
+ build_vrr_infopacket_v1(stream->signal, vrr, infopacket);
+ }
+diff --git a/drivers/gpu/drm/amd/display/modules/inc/mod_info_packet.h b/drivers/gpu/drm/amd/display/modules/inc/mod_info_packet.h
+index 786b34380f85..5b1c9a4c7643 100644
+--- a/drivers/gpu/drm/amd/display/modules/inc/mod_info_packet.h
++++ b/drivers/gpu/drm/amd/display/modules/inc/mod_info_packet.h
+@@ -26,15 +26,13 @@
+ #ifndef MOD_INFO_PACKET_H_
+ #define MOD_INFO_PACKET_H_
+
+-struct info_packet_inputs {
+- const struct dc_stream_state *pStream;
+-};
++#include "mod_shared.h"
+
+-struct info_packets {
+- struct dc_info_packet *pVscInfoPacket;
+-};
++//Forward Declarations
++struct dc_stream_state;
++struct dc_info_packet;
+
+-void mod_build_infopackets(struct info_packet_inputs *inputs,
+- struct info_packets *info_packets);
++void mod_build_vsc_infopacket(const struct dc_stream_state *stream,
++ struct dc_info_packet *info_packet);
+
+ #endif
+diff --git a/drivers/gpu/drm/amd/display/modules/inc/mod_shared.h b/drivers/gpu/drm/amd/display/modules/inc/mod_shared.h
+index 238c431ae483..1bd02c0ac30c 100644
+--- a/drivers/gpu/drm/amd/display/modules/inc/mod_shared.h
++++ b/drivers/gpu/drm/amd/display/modules/inc/mod_shared.h
+@@ -23,27 +23,26 @@
+ *
+ */
+
+-
+ #ifndef MOD_SHARED_H_
+ #define MOD_SHARED_H_
+
+ enum color_transfer_func {
+- transfer_func_unknown,
+- transfer_func_srgb,
+- transfer_func_bt709,
+- transfer_func_pq2084,
+- transfer_func_pq2084_interim,
+- transfer_func_linear_0_1,
+- transfer_func_linear_0_125,
+- transfer_func_dolbyvision,
+- transfer_func_gamma_22,
+- transfer_func_gamma_26
++ TRANSFER_FUNC_UNKNOWN,
++ TRANSFER_FUNC_SRGB,
++ TRANSFER_FUNC_BT709,
++ TRANSFER_FUNC_PQ2084,
++ TRANSFER_FUNC_PQ2084_INTERIM,
++ TRANSFER_FUNC_LINEAR_0_1,
++ TRANSFER_FUNC_LINEAR_0_125,
++ TRANSFER_FUNC_GAMMA_22,
++ TRANSFER_FUNC_GAMMA_26
+ };
+
+ enum vrr_packet_type {
+- packet_type_vrr,
+- packet_type_fs1,
+- packet_type_fs2
++ PACKET_TYPE_VRR,
++ PACKET_TYPE_FS1,
++ PACKET_TYPE_FS2
+ };
+
++
+ #endif /* MOD_SHARED_H_ */
+diff --git a/drivers/gpu/drm/amd/display/modules/info_packet/info_packet.c b/drivers/gpu/drm/amd/display/modules/info_packet/info_packet.c
+index ff8bfb9b43b0..db06fab2ad5c 100644
+--- a/drivers/gpu/drm/amd/display/modules/info_packet/info_packet.c
++++ b/drivers/gpu/drm/amd/display/modules/info_packet/info_packet.c
+@@ -25,6 +25,10 @@
+
+ #include "mod_info_packet.h"
+ #include "core_types.h"
++#include "dc_types.h"
++#include "mod_shared.h"
++
++#define HDMI_INFOFRAME_TYPE_VENDOR 0x81
+
+ enum ColorimetryRGBDP {
+ ColorimetryRGB_DP_sRGB = 0,
+@@ -41,7 +45,7 @@ enum ColorimetryYCCDP {
+ ColorimetryYCC_DP_ITU2020YCbCr = 7,
+ };
+
+-static void mod_build_vsc_infopacket(const struct dc_stream_state *stream,
++void mod_build_vsc_infopacket(const struct dc_stream_state *stream,
+ struct dc_info_packet *info_packet)
+ {
+ unsigned int vscPacketRevision = 0;
+@@ -159,7 +163,7 @@ static void mod_build_vsc_infopacket(const struct dc_stream_state *stream,
+ * DPCD register is exposed in the new Extended Receiver Capability field for DPCD Rev. 1.4
+ * (and higher). When MISC1. bit 6. is Set to 1, a Source device uses a VSC SDP to indicate
+ * the Pixel Encoding/Colorimetry Format and that a Sink device must ignore MISC1, bit 7, and
+- * MISC0, bits 7:1 (MISC1, bit 7. and MISC0, bits 7:1 become “don’t care”).)
++ * MISC0, bits 7:1 (MISC1, bit 7. and MISC0, bits 7:1 become "don't care").)
+ */
+ if (vscPacketRevision == 0x5) {
+ /* Secondary-data Packet ID = 0 */
+@@ -320,10 +324,3 @@ static void mod_build_vsc_infopacket(const struct dc_stream_state *stream,
+
+ }
+
+-void mod_build_infopackets(struct info_packet_inputs *inputs,
+- struct info_packets *info_packets)
+-{
+- if (info_packets->pVscInfoPacket != NULL)
+- mod_build_vsc_infopacket(inputs->pStream, info_packets->pVscInfoPacket);
+-}
+-
+--
+2.17.1
+