Commit 5ed78cd6 authored by Anthony Koo's avatar Anthony Koo Committed by Alex Deucher

drm/amd/display: set MSA MISC1 bit 6 while sending colorimetry in VSC SDP

[Why]
It is confusing to sinks if we send VSC SDP only on some format. Today we
signal colorimetry format using MSA while in formats like sRGB.
But when we switch to BT2020 we set the bit to ignore MSA  colorimetry and
instead use the colorimetry information in the VSC SDP.

But if sink supports signaling of colorimetry via VSC SDP we should always
set the MSA MISC1 bit 6, instead of doing so selectively.

[How]
If sink supports signaling of colorimetry via VSC SDP, and we are sending
the colorimetry info via VSC SDP with packet revision 05h, then always
set MSA MISC1 bit 6.
Signed-off-by: default avatarAnthony Koo <Anthony.Koo@amd.com>
Reviewed-by: default avatarAric Cyr <Aric.Cyr@amd.com>
Acked-by: default avatarBhawanpreet Lakha <Bhawanpreet.Lakha@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent a5132f97
...@@ -4022,7 +4022,9 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector, ...@@ -4022,7 +4022,9 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector,
struct dmcu *dmcu = core_dc->res_pool->dmcu; struct dmcu *dmcu = core_dc->res_pool->dmcu;
stream->psr_version = dmcu->dmcu_version.psr_version; stream->psr_version = dmcu->dmcu_version.psr_version;
mod_build_vsc_infopacket(stream, &stream->vsc_infopacket); mod_build_vsc_infopacket(stream,
&stream->vsc_infopacket,
&stream->use_vsc_sdp_for_colorimetry);
} }
} }
finish: finish:
......
...@@ -2946,6 +2946,7 @@ void core_link_enable_stream( ...@@ -2946,6 +2946,7 @@ void core_link_enable_stream(
pipe_ctx->stream_res.stream_enc, pipe_ctx->stream_res.stream_enc,
&stream->timing, &stream->timing,
stream->output_color_space, stream->output_color_space,
stream->use_vsc_sdp_for_colorimetry,
stream->link->dpcd_caps.dprx_feature.bits.SST_SPLIT_SDP_CAP); stream->link->dpcd_caps.dprx_feature.bits.SST_SPLIT_SDP_CAP);
if (dc_is_hdmi_tmds_signal(pipe_ctx->stream->signal)) if (dc_is_hdmi_tmds_signal(pipe_ctx->stream->signal))
......
...@@ -164,6 +164,7 @@ struct dc_stream_state { ...@@ -164,6 +164,7 @@ struct dc_stream_state {
enum view_3d_format view_format; enum view_3d_format view_format;
bool use_vsc_sdp_for_colorimetry;
bool ignore_msa_timing_param; bool ignore_msa_timing_param;
bool converter_disable_audio; bool converter_disable_audio;
uint8_t qs_bit; uint8_t qs_bit;
......
...@@ -275,6 +275,7 @@ static void dce110_stream_encoder_dp_set_stream_attribute( ...@@ -275,6 +275,7 @@ static void dce110_stream_encoder_dp_set_stream_attribute(
struct stream_encoder *enc, struct stream_encoder *enc,
struct dc_crtc_timing *crtc_timing, struct dc_crtc_timing *crtc_timing,
enum dc_color_space output_color_space, enum dc_color_space output_color_space,
bool use_vsc_sdp_for_colorimetry,
uint32_t enable_sdp_splitting) uint32_t enable_sdp_splitting)
{ {
#if defined(CONFIG_DRM_AMD_DC_DCN1_0) #if defined(CONFIG_DRM_AMD_DC_DCN1_0)
......
...@@ -247,6 +247,7 @@ void enc1_stream_encoder_dp_set_stream_attribute( ...@@ -247,6 +247,7 @@ void enc1_stream_encoder_dp_set_stream_attribute(
struct stream_encoder *enc, struct stream_encoder *enc,
struct dc_crtc_timing *crtc_timing, struct dc_crtc_timing *crtc_timing,
enum dc_color_space output_color_space, enum dc_color_space output_color_space,
bool use_vsc_sdp_for_colorimetry,
uint32_t enable_sdp_splitting) uint32_t enable_sdp_splitting)
{ {
uint32_t h_active_start; uint32_t h_active_start;
...@@ -312,10 +313,7 @@ void enc1_stream_encoder_dp_set_stream_attribute( ...@@ -312,10 +313,7 @@ void enc1_stream_encoder_dp_set_stream_attribute(
* Pixel Encoding/Colorimetry Format and that a Sink device shall ignore MISC1, bit 7, * Pixel Encoding/Colorimetry Format and that a Sink device shall ignore MISC1, bit 7,
* and MISC0, bits 7:1 (MISC1, bit 7, and MISC0, bits 7:1, become "don't care"). * and MISC0, bits 7:1 (MISC1, bit 7, and MISC0, bits 7:1, become "don't care").
*/ */
if ((hw_crtc_timing.pixel_encoding == PIXEL_ENCODING_YCBCR420) || if (use_vsc_sdp_for_colorimetry)
(output_color_space == COLOR_SPACE_2020_YCBCR) ||
(output_color_space == COLOR_SPACE_2020_RGB_FULLRANGE) ||
(output_color_space == COLOR_SPACE_2020_RGB_LIMITEDRANGE))
misc1 = misc1 | 0x40; misc1 = misc1 | 0x40;
else else
misc1 = misc1 & ~0x40; misc1 = misc1 & ~0x40;
......
...@@ -526,6 +526,7 @@ void enc1_stream_encoder_dp_set_stream_attribute( ...@@ -526,6 +526,7 @@ void enc1_stream_encoder_dp_set_stream_attribute(
struct stream_encoder *enc, struct stream_encoder *enc,
struct dc_crtc_timing *crtc_timing, struct dc_crtc_timing *crtc_timing,
enum dc_color_space output_color_space, enum dc_color_space output_color_space,
bool use_vsc_sdp_for_colorimetry,
uint32_t enable_sdp_splitting); uint32_t enable_sdp_splitting);
void enc1_stream_encoder_hdmi_set_stream_attribute( void enc1_stream_encoder_hdmi_set_stream_attribute(
......
...@@ -533,11 +533,16 @@ void enc2_stream_encoder_dp_set_stream_attribute( ...@@ -533,11 +533,16 @@ void enc2_stream_encoder_dp_set_stream_attribute(
struct stream_encoder *enc, struct stream_encoder *enc,
struct dc_crtc_timing *crtc_timing, struct dc_crtc_timing *crtc_timing,
enum dc_color_space output_color_space, enum dc_color_space output_color_space,
bool use_vsc_sdp_for_colorimetry,
uint32_t enable_sdp_splitting) uint32_t enable_sdp_splitting)
{ {
struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc); struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
enc1_stream_encoder_dp_set_stream_attribute(enc, crtc_timing, output_color_space, enable_sdp_splitting); enc1_stream_encoder_dp_set_stream_attribute(enc,
crtc_timing,
output_color_space,
use_vsc_sdp_for_colorimetry,
enable_sdp_splitting);
REG_UPDATE(DP_SEC_FRAMING4, REG_UPDATE(DP_SEC_FRAMING4,
DP_SST_SDP_SPLITTING, enable_sdp_splitting); DP_SST_SDP_SPLITTING, enable_sdp_splitting);
......
...@@ -98,6 +98,7 @@ void enc2_stream_encoder_dp_set_stream_attribute( ...@@ -98,6 +98,7 @@ void enc2_stream_encoder_dp_set_stream_attribute(
struct stream_encoder *enc, struct stream_encoder *enc,
struct dc_crtc_timing *crtc_timing, struct dc_crtc_timing *crtc_timing,
enum dc_color_space output_color_space, enum dc_color_space output_color_space,
bool use_vsc_sdp_for_colorimetry,
uint32_t enable_sdp_splitting); uint32_t enable_sdp_splitting);
void enc2_stream_encoder_dp_unblank( void enc2_stream_encoder_dp_unblank(
......
...@@ -126,6 +126,7 @@ struct stream_encoder_funcs { ...@@ -126,6 +126,7 @@ struct stream_encoder_funcs {
struct stream_encoder *enc, struct stream_encoder *enc,
struct dc_crtc_timing *crtc_timing, struct dc_crtc_timing *crtc_timing,
enum dc_color_space output_color_space, enum dc_color_space output_color_space,
bool use_vsc_sdp_for_colorimetry,
uint32_t enable_sdp_splitting); uint32_t enable_sdp_splitting);
void (*hdmi_set_stream_attribute)( void (*hdmi_set_stream_attribute)(
......
...@@ -32,6 +32,7 @@ static void virtual_stream_encoder_dp_set_stream_attribute( ...@@ -32,6 +32,7 @@ static void virtual_stream_encoder_dp_set_stream_attribute(
struct stream_encoder *enc, struct stream_encoder *enc,
struct dc_crtc_timing *crtc_timing, struct dc_crtc_timing *crtc_timing,
enum dc_color_space output_color_space, enum dc_color_space output_color_space,
bool use_vsc_sdp_for_colorimetry,
uint32_t enable_sdp_splitting) {} uint32_t enable_sdp_splitting) {}
static void virtual_stream_encoder_hdmi_set_stream_attribute( static void virtual_stream_encoder_hdmi_set_stream_attribute(
......
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
#ifndef MOD_INFO_PACKET_H_ #ifndef MOD_INFO_PACKET_H_
#define MOD_INFO_PACKET_H_ #define MOD_INFO_PACKET_H_
#include "dm_services.h"
#include "mod_shared.h" #include "mod_shared.h"
//Forward Declarations //Forward Declarations
struct dc_stream_state; struct dc_stream_state;
...@@ -33,7 +34,8 @@ struct dc_info_packet; ...@@ -33,7 +34,8 @@ struct dc_info_packet;
struct mod_vrr_params; struct mod_vrr_params;
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); struct dc_info_packet *info_packet,
bool *use_vsc_sdp_for_colorimetry);
void mod_build_hf_vsif_infopacket(const struct dc_stream_state *stream, void mod_build_hf_vsif_infopacket(const struct dc_stream_state *stream,
struct dc_info_packet *info_packet, int ALLMEnabled, int ALLMValue); struct dc_info_packet *info_packet, int ALLMEnabled, int ALLMValue);
......
...@@ -30,6 +30,20 @@ ...@@ -30,6 +30,20 @@
#include "mod_freesync.h" #include "mod_freesync.h"
#include "dc.h" #include "dc.h"
enum vsc_packet_revision {
vsc_packet_undefined = 0,
//01h = VSC SDP supports only 3D stereo.
vsc_packet_rev1 = 1,
//02h = 3D stereo + PSR.
vsc_packet_rev2 = 2,
//03h = 3D stereo + PSR2.
vsc_packet_rev3 = 3,
//04h = 3D stereo + PSR/PSR2 + Y-coordinate.
vsc_packet_rev4 = 4,
//05h = 3D stereo + PSR/PSR2 + Y-coordinate + Pixel Encoding/Colorimetry Format
vsc_packet_rev5 = 5,
};
#define HDMI_INFOFRAME_TYPE_VENDOR 0x81 #define HDMI_INFOFRAME_TYPE_VENDOR 0x81
#define HF_VSIF_VERSION 1 #define HF_VSIF_VERSION 1
...@@ -116,35 +130,41 @@ enum ColorimetryYCCDP { ...@@ -116,35 +130,41 @@ enum ColorimetryYCCDP {
}; };
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) struct dc_info_packet *info_packet,
bool *use_vsc_sdp_for_colorimetry)
{ {
unsigned int vscPacketRevision = 0; unsigned int vsc_packet_revision = vsc_packet_undefined;
unsigned int i; unsigned int i;
unsigned int pixelEncoding = 0; unsigned int pixelEncoding = 0;
unsigned int colorimetryFormat = 0; unsigned int colorimetryFormat = 0;
bool stereo3dSupport = false; bool stereo3dSupport = false;
/* Initialize first, later if infopacket is valid determine if VSC SDP
* should be used to signal colorimetry format and pixel encoding.
*/
*use_vsc_sdp_for_colorimetry = false;
if (stream->timing.timing_3d_format != TIMING_3D_FORMAT_NONE && stream->view_format != VIEW_3D_FORMAT_NONE) { if (stream->timing.timing_3d_format != TIMING_3D_FORMAT_NONE && stream->view_format != VIEW_3D_FORMAT_NONE) {
vscPacketRevision = 1; vsc_packet_revision = vsc_packet_rev1;
stereo3dSupport = true; stereo3dSupport = true;
} }
/*VSC packet set to 2 when DP revision >= 1.2*/ /*VSC packet set to 2 when DP revision >= 1.2*/
if (stream->psr_version != 0) if (stream->psr_version != 0)
vscPacketRevision = 2; vsc_packet_revision = vsc_packet_rev2;
/* Update to revision 5 for extended colorimetry support for DPCD 1.4+ */ /* Update to revision 5 for extended colorimetry support for DPCD 1.4+ */
if (stream->link->dpcd_caps.dpcd_rev.raw >= 0x14 && if (stream->link->dpcd_caps.dpcd_rev.raw >= 0x14 &&
stream->link->dpcd_caps.dprx_feature.bits.VSC_SDP_COLORIMETRY_SUPPORTED) stream->link->dpcd_caps.dprx_feature.bits.VSC_SDP_COLORIMETRY_SUPPORTED)
vscPacketRevision = 5; vsc_packet_revision = vsc_packet_rev5;
/* VSC packet not needed based on the features /* VSC packet not needed based on the features
* supported by this DP display * supported by this DP display
*/ */
if (vscPacketRevision == 0) if (vsc_packet_revision == vsc_packet_undefined)
return; return;
if (vscPacketRevision == 0x2) { if (vsc_packet_revision == vsc_packet_rev2) {
/* Secondary-data Packet ID = 0*/ /* Secondary-data Packet ID = 0*/
info_packet->hb0 = 0x00; info_packet->hb0 = 0x00;
/* 07h - Packet Type Value indicating Video /* 07h - Packet Type Value indicating Video
...@@ -166,7 +186,7 @@ void mod_build_vsc_infopacket(const struct dc_stream_state *stream, ...@@ -166,7 +186,7 @@ void mod_build_vsc_infopacket(const struct dc_stream_state *stream,
info_packet->valid = true; info_packet->valid = true;
} }
if (vscPacketRevision == 0x1) { if (vsc_packet_revision == vsc_packet_rev1) {
info_packet->hb0 = 0x00; // Secondary-data Packet ID = 0 info_packet->hb0 = 0x00; // Secondary-data Packet ID = 0
info_packet->hb1 = 0x07; // 07h = Packet Type Value indicating Video Stream Configuration packet info_packet->hb1 = 0x07; // 07h = Packet Type Value indicating Video Stream Configuration packet
...@@ -237,7 +257,7 @@ void mod_build_vsc_infopacket(const struct dc_stream_state *stream, ...@@ -237,7 +257,7 @@ void mod_build_vsc_infopacket(const struct dc_stream_state *stream,
* the Pixel Encoding/Colorimetry Format and that a Sink device must ignore MISC1, bit 7, and * 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) { if (vsc_packet_revision == vsc_packet_rev5) {
/* Secondary-data Packet ID = 0 */ /* Secondary-data Packet ID = 0 */
info_packet->hb0 = 0x00; info_packet->hb0 = 0x00;
/* 07h - Packet Type Value indicating Video Stream Configuration packet */ /* 07h - Packet Type Value indicating Video Stream Configuration packet */
...@@ -249,6 +269,13 @@ void mod_build_vsc_infopacket(const struct dc_stream_state *stream, ...@@ -249,6 +269,13 @@ void mod_build_vsc_infopacket(const struct dc_stream_state *stream,
info_packet->valid = true; info_packet->valid = true;
/* If we are using VSC SDP revision 05h, use this to signal for
* colorimetry format and pixel encoding. HW should later be
* programmed to set MSA MISC1 bit 6 to indicate ignore
* colorimetry format and pixel encoding in the MSA.
*/
*use_vsc_sdp_for_colorimetry = true;
/* Set VSC SDP fields for pixel encoding and colorimetry format from DP 1.3 specs /* Set VSC SDP fields for pixel encoding and colorimetry format from DP 1.3 specs
* Data Bytes DB 18~16 * Data Bytes DB 18~16
* Bits 3:0 (Colorimetry Format) | Bits 7:4 (Pixel Encoding) * Bits 3:0 (Colorimetry Format) | Bits 7:4 (Pixel Encoding)
...@@ -393,7 +420,6 @@ void mod_build_vsc_infopacket(const struct dc_stream_state *stream, ...@@ -393,7 +420,6 @@ void mod_build_vsc_infopacket(const struct dc_stream_state *stream,
*/ */
info_packet->sb[18] = 0; info_packet->sb[18] = 0;
} }
} }
/** /**
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment