Re: [Intel-gfx] [PATCH v3 04/17] drm/i915/dp: Add writing of DP SDPs (Secondary Data Packet)
> -Original Message- > From: Mun, Gwan-gyeong > Sent: Sunday, February 9, 2020 9:05 AM > To: Shankar, Uma ; intel-gfx@lists.freedesktop.org > Cc: dri-de...@lists.freedesktop.org; linux-fb...@vger.kernel.org > Subject: Re: [PATCH v3 04/17] drm/i915/dp: Add writing of DP SDPs (Secondary > Data > Packet) > > On Wed, 2020-02-05 at 21:39 +0530, Shankar, Uma wrote: > > > -Original Message- > > > From: dri-devel On Behalf > > > Of Gwan- gyeong Mun > > > Sent: Tuesday, February 4, 2020 4:50 AM > > > To: intel-gfx@lists.freedesktop.org > > > Cc: linux-fb...@vger.kernel.org; dri-de...@lists.freedesktop.org > > > Subject: [PATCH v3 04/17] drm/i915/dp: Add writing of DP SDPs > > > (Secondary Data > > > Packet) > > > > Drop things in (), not needed. > > > > > It adds routines that write DP VSC SDP and DP HDR Metadata Infoframe > > > SDP. > > > In order to pack DP VSC SDP, it adds intel_dp_vsc_sdp_pack() > > > function. > > > It follows DP 1.4a spec. [Table 2-116: VSC SDP Header Bytes] and > > > [Table 2-117: VSC SDP Payload for DB16 through DB18] > > > > > > In order to pack DP HDR Metadata Infoframe SDP, it adds > > > intel_dp_hdr_metadata_infoframe_sdp_pack() function. > > > And it follows DP 1.4a spec. > > > ([Table 2-125: INFOFRAME SDP v1.2 Header Bytes] and [Table 2-126: > > > INFOFRAME > > > SDP v1.2 Payload Data Bytes - DB0 through DB31]) and CTA-861-G spec. > > > [Table-42 Dynamic Range and Mastering InfoFrame]. > > > > > > A machanism and a naming rule of intel_dp_set_infoframes() function > > > references > > > > Typo in mechanism. > > > > > intel_encoder->set_infoframes() of intel_hdmi.c . > > > VSC SDP is used for PSR and Pixel Encoding and Colorimetry Formats > > > cases. > > > Because PSR routine has its own routine of writing a VSC SDP, when > > > the PSR is enabled, intel_dp_set_infoframes() does not write a VSC > > > SDP. > > > > > > v3: > > > - Explicitly disable unused DIPs (AVI, GCP, VS, SPD, DRM. They > > > will be > > > used for HDMI), when intel_dp_set_infoframes() function will be > > > called. > > > - Replace a structure name to drm_dp_vsc_sdp from > > > intel_dp_vsc_sdp. > > > > > > Signed-off-by: Gwan-gyeong Mun > > > --- > > > drivers/gpu/drm/i915/display/intel_dp.c | 194 > > > > > > drivers/gpu/drm/i915/display/intel_dp.h | 3 + > > > 2 files changed, 197 insertions(+) > > > > > > diff --git a/drivers/gpu/drm/i915/display/intel_dp.c > > > b/drivers/gpu/drm/i915/display/intel_dp.c > > > index b265b5c599f2..dd7e5588001e 100644 > > > --- a/drivers/gpu/drm/i915/display/intel_dp.c > > > +++ b/drivers/gpu/drm/i915/display/intel_dp.c > > > @@ -4731,6 +4731,200 @@ intel_dp_needs_vsc_sdp(const struct > > > intel_crtc_state *crtc_state, > > > return false; > > > } > > > > > > +static ssize_t intel_dp_vsc_sdp_pack(const struct drm_dp_vsc_sdp > > > *vsc, > > > + struct dp_sdp *sdp, size_t size) { > > > + size_t length = sizeof(struct dp_sdp); > > > + > > > + if (size < length) > > > + return -ENOSPC; > > > + > > > + memset(sdp, 0, size); > > > + > > > + /* > > > + * Prepare VSC Header for SU as per DP 1.4a spec, Table 2-119 > > > + * VSC SDP Header Bytes > > > + */ > > > + sdp->sdp_header.HB0 = 0; /* Secondary-Data Packet ID = 0 */ > > > + sdp->sdp_header.HB1 = vsc->sdp_type; /* Secondary-data Packet > > > Type */ > > > + sdp->sdp_header.HB2 = vsc->revision; /* Revision Number */ > > > + sdp->sdp_header.HB3 = vsc->length; /* Number of Valid Data > > > Bytes */ > > > + > > > + /* VSC SDP Payload for DB16 through DB18 */ > > > + /* Pixel Encoding and Colorimetry Formats */ > > > + sdp->db[16] = (vsc->colorspace & 0xf) << 4; /* DB16[7:4] */ > > > + sdp->db[16] |= vsc->colorimetry & 0xf; /* DB16[3:0] */ > > > + > > > + switch (vsc->bpc) { > > > + case 8: > > > + sdp->db[17] = 0x1; /* DB17[3:0] */ > > > + break; > > > + case 10: > > > + sdp->db[17] = 0x2; > > > + break; > > > + case 12: > > > + sdp->db[17] = 0x3; > > > + break; > > > + case 16: > > > + sdp->db[17] = 0x4; > > > + break; > > > + default: > > > + MISSING_CASE(vsc->bpc); > > > > 6bpc is not handled here, add that as well. > > > Yes, I missed 6bpc case, I'll update it. > > > + break; > > > + } > > > + /* Dynamic Range and Component Bit Depth */ > > > + if (vsc->dynamic_range == DP_DYNAMIC_RANGE_CTA) > > > + sdp->db[17] |= 0x80; /* DB17[7] */ > > > + > > > + /* Content Type */ > > > + sdp->db[18] = vsc->content_type & 0x7; > > > + > > > + return length; > > > +} > > > + > > > +static ssize_t > > > +intel_dp_hdr_metadata_infoframe_sdp_pack(const struct > > > hdmi_drm_infoframe > > > *drm_infoframe, > > > + struct dp_sdp *sdp, > > > + size_t size) > > > +{ > > > + size_t length = sizeof(struct dp_sdp); > > > + const int infoframe_size = HDMI_INFOFRAME_HEADER_SIZE + > > > HDMI_DRM_INFOFRAME_SIZE
Re: [Intel-gfx] [PATCH v3 04/17] drm/i915/dp: Add writing of DP SDPs (Secondary Data Packet)
On Wed, 2020-02-05 at 21:39 +0530, Shankar, Uma wrote: > > -Original Message- > > From: dri-devel On Behalf > > Of Gwan- > > gyeong Mun > > Sent: Tuesday, February 4, 2020 4:50 AM > > To: intel-gfx@lists.freedesktop.org > > Cc: linux-fb...@vger.kernel.org; dri-de...@lists.freedesktop.org > > Subject: [PATCH v3 04/17] drm/i915/dp: Add writing of DP SDPs > > (Secondary Data > > Packet) > > Drop things in (), not needed. > > > It adds routines that write DP VSC SDP and DP HDR Metadata > > Infoframe SDP. > > In order to pack DP VSC SDP, it adds intel_dp_vsc_sdp_pack() > > function. > > It follows DP 1.4a spec. [Table 2-116: VSC SDP Header Bytes] and > > [Table 2-117: VSC > > SDP Payload for DB16 through DB18] > > > > In order to pack DP HDR Metadata Infoframe SDP, it adds > > intel_dp_hdr_metadata_infoframe_sdp_pack() function. > > And it follows DP 1.4a spec. > > ([Table 2-125: INFOFRAME SDP v1.2 Header Bytes] and [Table 2-126: > > INFOFRAME > > SDP v1.2 Payload Data Bytes - DB0 through DB31]) and CTA-861-G > > spec. [Table-42 > > Dynamic Range and Mastering InfoFrame]. > > > > A machanism and a naming rule of intel_dp_set_infoframes() function > > references > > Typo in mechanism. > > > intel_encoder->set_infoframes() of intel_hdmi.c . > > VSC SDP is used for PSR and Pixel Encoding and Colorimetry Formats > > cases. > > Because PSR routine has its own routine of writing a VSC SDP, when > > the PSR is > > enabled, intel_dp_set_infoframes() does not write a VSC SDP. > > > > v3: > > - Explicitly disable unused DIPs (AVI, GCP, VS, SPD, DRM. They > > will be > > used for HDMI), when intel_dp_set_infoframes() function will be > > called. > > - Replace a structure name to drm_dp_vsc_sdp from > > intel_dp_vsc_sdp. > > > > Signed-off-by: Gwan-gyeong Mun > > --- > > drivers/gpu/drm/i915/display/intel_dp.c | 194 > > > > drivers/gpu/drm/i915/display/intel_dp.h | 3 + > > 2 files changed, 197 insertions(+) > > > > diff --git a/drivers/gpu/drm/i915/display/intel_dp.c > > b/drivers/gpu/drm/i915/display/intel_dp.c > > index b265b5c599f2..dd7e5588001e 100644 > > --- a/drivers/gpu/drm/i915/display/intel_dp.c > > +++ b/drivers/gpu/drm/i915/display/intel_dp.c > > @@ -4731,6 +4731,200 @@ intel_dp_needs_vsc_sdp(const struct > > intel_crtc_state > > *crtc_state, > > return false; > > } > > > > +static ssize_t intel_dp_vsc_sdp_pack(const struct drm_dp_vsc_sdp > > *vsc, > > +struct dp_sdp *sdp, size_t size) { > > + size_t length = sizeof(struct dp_sdp); > > + > > + if (size < length) > > + return -ENOSPC; > > + > > + memset(sdp, 0, size); > > + > > + /* > > +* Prepare VSC Header for SU as per DP 1.4a spec, Table 2-119 > > +* VSC SDP Header Bytes > > +*/ > > + sdp->sdp_header.HB0 = 0; /* Secondary-Data Packet ID = 0 */ > > + sdp->sdp_header.HB1 = vsc->sdp_type; /* Secondary-data Packet > > Type */ > > + sdp->sdp_header.HB2 = vsc->revision; /* Revision Number */ > > + sdp->sdp_header.HB3 = vsc->length; /* Number of Valid Data > > Bytes */ > > + > > + /* VSC SDP Payload for DB16 through DB18 */ > > + /* Pixel Encoding and Colorimetry Formats */ > > + sdp->db[16] = (vsc->colorspace & 0xf) << 4; /* DB16[7:4] */ > > + sdp->db[16] |= vsc->colorimetry & 0xf; /* DB16[3:0] */ > > + > > + switch (vsc->bpc) { > > + case 8: > > + sdp->db[17] = 0x1; /* DB17[3:0] */ > > + break; > > + case 10: > > + sdp->db[17] = 0x2; > > + break; > > + case 12: > > + sdp->db[17] = 0x3; > > + break; > > + case 16: > > + sdp->db[17] = 0x4; > > + break; > > + default: > > + MISSING_CASE(vsc->bpc); > > 6bpc is not handled here, add that as well. > Yes, I missed 6bpc case, I'll update it. > > + break; > > + } > > + /* Dynamic Range and Component Bit Depth */ > > + if (vsc->dynamic_range == DP_DYNAMIC_RANGE_CTA) > > + sdp->db[17] |= 0x80; /* DB17[7] */ > > + > > + /* Content Type */ > > + sdp->db[18] = vsc->content_type & 0x7; > > + > > + return length; > > +} > > + > > +static ssize_t > > +intel_dp_hdr_metadata_infoframe_sdp_pack(const struct > > hdmi_drm_infoframe > > *drm_infoframe, > > +struct dp_sdp *sdp, > > +size_t size) > > +{ > > + size_t length = sizeof(struct dp_sdp); > > + const int infoframe_size = HDMI_INFOFRAME_HEADER_SIZE + > > HDMI_DRM_INFOFRAME_SIZE; > > + unsigned char buf[HDMI_INFOFRAME_HEADER_SIZE + > > HDMI_DRM_INFOFRAME_SIZE]; > > + ssize_t len; > > + > > + if (size < length) > > + return -ENOSPC; > > + > > + memset(sdp, 0, size); > > + > > + len = hdmi_drm_infoframe_pack_only(drm_infoframe, buf, > > sizeof(buf)); > > + if (len < 0) { > > + DRM_DEBUG_KMS("buffer size is smaller than hdr metadata > > infoframe\n"); > > + return -ENOSPC; > > + } > > + > > +
Re: [Intel-gfx] [PATCH v3 04/17] drm/i915/dp: Add writing of DP SDPs (Secondary Data Packet)
> -Original Message- > From: dri-devel On Behalf Of Gwan- > gyeong Mun > Sent: Tuesday, February 4, 2020 4:50 AM > To: intel-gfx@lists.freedesktop.org > Cc: linux-fb...@vger.kernel.org; dri-de...@lists.freedesktop.org > Subject: [PATCH v3 04/17] drm/i915/dp: Add writing of DP SDPs (Secondary Data > Packet) Drop things in (), not needed. > It adds routines that write DP VSC SDP and DP HDR Metadata Infoframe SDP. > In order to pack DP VSC SDP, it adds intel_dp_vsc_sdp_pack() function. > It follows DP 1.4a spec. [Table 2-116: VSC SDP Header Bytes] and [Table > 2-117: VSC > SDP Payload for DB16 through DB18] > > In order to pack DP HDR Metadata Infoframe SDP, it adds > intel_dp_hdr_metadata_infoframe_sdp_pack() function. > And it follows DP 1.4a spec. > ([Table 2-125: INFOFRAME SDP v1.2 Header Bytes] and [Table 2-126: INFOFRAME > SDP v1.2 Payload Data Bytes - DB0 through DB31]) and CTA-861-G spec. [Table-42 > Dynamic Range and Mastering InfoFrame]. > > A machanism and a naming rule of intel_dp_set_infoframes() function references Typo in mechanism. > intel_encoder->set_infoframes() of intel_hdmi.c . > VSC SDP is used for PSR and Pixel Encoding and Colorimetry Formats cases. > Because PSR routine has its own routine of writing a VSC SDP, when the PSR is > enabled, intel_dp_set_infoframes() does not write a VSC SDP. > > v3: > - Explicitly disable unused DIPs (AVI, GCP, VS, SPD, DRM. They will be > used for HDMI), when intel_dp_set_infoframes() function will be called. > - Replace a structure name to drm_dp_vsc_sdp from intel_dp_vsc_sdp. > > Signed-off-by: Gwan-gyeong Mun > --- > drivers/gpu/drm/i915/display/intel_dp.c | 194 > drivers/gpu/drm/i915/display/intel_dp.h | 3 + > 2 files changed, 197 insertions(+) > > diff --git a/drivers/gpu/drm/i915/display/intel_dp.c > b/drivers/gpu/drm/i915/display/intel_dp.c > index b265b5c599f2..dd7e5588001e 100644 > --- a/drivers/gpu/drm/i915/display/intel_dp.c > +++ b/drivers/gpu/drm/i915/display/intel_dp.c > @@ -4731,6 +4731,200 @@ intel_dp_needs_vsc_sdp(const struct intel_crtc_state > *crtc_state, > return false; > } > > +static ssize_t intel_dp_vsc_sdp_pack(const struct drm_dp_vsc_sdp *vsc, > + struct dp_sdp *sdp, size_t size) { > + size_t length = sizeof(struct dp_sdp); > + > + if (size < length) > + return -ENOSPC; > + > + memset(sdp, 0, size); > + > + /* > + * Prepare VSC Header for SU as per DP 1.4a spec, Table 2-119 > + * VSC SDP Header Bytes > + */ > + sdp->sdp_header.HB0 = 0; /* Secondary-Data Packet ID = 0 */ > + sdp->sdp_header.HB1 = vsc->sdp_type; /* Secondary-data Packet Type */ > + sdp->sdp_header.HB2 = vsc->revision; /* Revision Number */ > + sdp->sdp_header.HB3 = vsc->length; /* Number of Valid Data Bytes */ > + > + /* VSC SDP Payload for DB16 through DB18 */ > + /* Pixel Encoding and Colorimetry Formats */ > + sdp->db[16] = (vsc->colorspace & 0xf) << 4; /* DB16[7:4] */ > + sdp->db[16] |= vsc->colorimetry & 0xf; /* DB16[3:0] */ > + > + switch (vsc->bpc) { > + case 8: > + sdp->db[17] = 0x1; /* DB17[3:0] */ > + break; > + case 10: > + sdp->db[17] = 0x2; > + break; > + case 12: > + sdp->db[17] = 0x3; > + break; > + case 16: > + sdp->db[17] = 0x4; > + break; > + default: > + MISSING_CASE(vsc->bpc); 6bpc is not handled here, add that as well. > + break; > + } > + /* Dynamic Range and Component Bit Depth */ > + if (vsc->dynamic_range == DP_DYNAMIC_RANGE_CTA) > + sdp->db[17] |= 0x80; /* DB17[7] */ > + > + /* Content Type */ > + sdp->db[18] = vsc->content_type & 0x7; > + > + return length; > +} > + > +static ssize_t > +intel_dp_hdr_metadata_infoframe_sdp_pack(const struct hdmi_drm_infoframe > *drm_infoframe, > + struct dp_sdp *sdp, > + size_t size) > +{ > + size_t length = sizeof(struct dp_sdp); > + const int infoframe_size = HDMI_INFOFRAME_HEADER_SIZE + > HDMI_DRM_INFOFRAME_SIZE; > + unsigned char buf[HDMI_INFOFRAME_HEADER_SIZE + > HDMI_DRM_INFOFRAME_SIZE]; > + ssize_t len; > + > + if (size < length) > + return -ENOSPC; > + > + memset(sdp, 0, size); > + > + len = hdmi_drm_infoframe_pack_only(drm_infoframe, buf, sizeof(buf)); > + if (len < 0) { > + DRM_DEBUG_KMS("buffer size is smaller than hdr metadata > infoframe\n"); > + return -ENOSPC; > + } > + > + if (len != infoframe_size) { > + DRM_DEBUG_KMS("wrong static hdr metadata size\n"); > + return -ENOSPC; > + } > + > + /* > + * Set up the infoframe sdp packet for HDR static metadata. > + * Prepare VSC Header for SU as per DP 1.4a spec, > + * Table 2-100 and Table 2-101 > +
[Intel-gfx] [PATCH v3 04/17] drm/i915/dp: Add writing of DP SDPs (Secondary Data Packet)
It adds routines that write DP VSC SDP and DP HDR Metadata Infoframe SDP. In order to pack DP VSC SDP, it adds intel_dp_vsc_sdp_pack() function. It follows DP 1.4a spec. [Table 2-116: VSC SDP Header Bytes] and [Table 2-117: VSC SDP Payload for DB16 through DB18] In order to pack DP HDR Metadata Infoframe SDP, it adds intel_dp_hdr_metadata_infoframe_sdp_pack() function. And it follows DP 1.4a spec. ([Table 2-125: INFOFRAME SDP v1.2 Header Bytes] and [Table 2-126: INFOFRAME SDP v1.2 Payload Data Bytes - DB0 through DB31]) and CTA-861-G spec. [Table-42 Dynamic Range and Mastering InfoFrame]. A machanism and a naming rule of intel_dp_set_infoframes() function references intel_encoder->set_infoframes() of intel_hdmi.c . VSC SDP is used for PSR and Pixel Encoding and Colorimetry Formats cases. Because PSR routine has its own routine of writing a VSC SDP, when the PSR is enabled, intel_dp_set_infoframes() does not write a VSC SDP. v3: - Explicitly disable unused DIPs (AVI, GCP, VS, SPD, DRM. They will be used for HDMI), when intel_dp_set_infoframes() function will be called. - Replace a structure name to drm_dp_vsc_sdp from intel_dp_vsc_sdp. Signed-off-by: Gwan-gyeong Mun --- drivers/gpu/drm/i915/display/intel_dp.c | 194 drivers/gpu/drm/i915/display/intel_dp.h | 3 + 2 files changed, 197 insertions(+) diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c index b265b5c599f2..dd7e5588001e 100644 --- a/drivers/gpu/drm/i915/display/intel_dp.c +++ b/drivers/gpu/drm/i915/display/intel_dp.c @@ -4731,6 +4731,200 @@ intel_dp_needs_vsc_sdp(const struct intel_crtc_state *crtc_state, return false; } +static ssize_t intel_dp_vsc_sdp_pack(const struct drm_dp_vsc_sdp *vsc, +struct dp_sdp *sdp, size_t size) +{ + size_t length = sizeof(struct dp_sdp); + + if (size < length) + return -ENOSPC; + + memset(sdp, 0, size); + + /* +* Prepare VSC Header for SU as per DP 1.4a spec, Table 2-119 +* VSC SDP Header Bytes +*/ + sdp->sdp_header.HB0 = 0; /* Secondary-Data Packet ID = 0 */ + sdp->sdp_header.HB1 = vsc->sdp_type; /* Secondary-data Packet Type */ + sdp->sdp_header.HB2 = vsc->revision; /* Revision Number */ + sdp->sdp_header.HB3 = vsc->length; /* Number of Valid Data Bytes */ + + /* VSC SDP Payload for DB16 through DB18 */ + /* Pixel Encoding and Colorimetry Formats */ + sdp->db[16] = (vsc->colorspace & 0xf) << 4; /* DB16[7:4] */ + sdp->db[16] |= vsc->colorimetry & 0xf; /* DB16[3:0] */ + + switch (vsc->bpc) { + case 8: + sdp->db[17] = 0x1; /* DB17[3:0] */ + break; + case 10: + sdp->db[17] = 0x2; + break; + case 12: + sdp->db[17] = 0x3; + break; + case 16: + sdp->db[17] = 0x4; + break; + default: + MISSING_CASE(vsc->bpc); + break; + } + /* Dynamic Range and Component Bit Depth */ + if (vsc->dynamic_range == DP_DYNAMIC_RANGE_CTA) + sdp->db[17] |= 0x80; /* DB17[7] */ + + /* Content Type */ + sdp->db[18] = vsc->content_type & 0x7; + + return length; +} + +static ssize_t +intel_dp_hdr_metadata_infoframe_sdp_pack(const struct hdmi_drm_infoframe *drm_infoframe, +struct dp_sdp *sdp, +size_t size) +{ + size_t length = sizeof(struct dp_sdp); + const int infoframe_size = HDMI_INFOFRAME_HEADER_SIZE + HDMI_DRM_INFOFRAME_SIZE; + unsigned char buf[HDMI_INFOFRAME_HEADER_SIZE + HDMI_DRM_INFOFRAME_SIZE]; + ssize_t len; + + if (size < length) + return -ENOSPC; + + memset(sdp, 0, size); + + len = hdmi_drm_infoframe_pack_only(drm_infoframe, buf, sizeof(buf)); + if (len < 0) { + DRM_DEBUG_KMS("buffer size is smaller than hdr metadata infoframe\n"); + return -ENOSPC; + } + + if (len != infoframe_size) { + DRM_DEBUG_KMS("wrong static hdr metadata size\n"); + return -ENOSPC; + } + + /* +* Set up the infoframe sdp packet for HDR static metadata. +* Prepare VSC Header for SU as per DP 1.4a spec, +* Table 2-100 and Table 2-101 +*/ + + /* Secondary-Data Packet ID, 00h for non-Audio INFOFRAME */ + sdp->sdp_header.HB0 = 0; + /* +* Packet Type 80h + Non-audio INFOFRAME Type value +* HDMI_INFOFRAME_TYPE_DRM: 0x87 +* - 80h + Non-audio INFOFRAME Type value +* - InfoFrame Type: 0x07 +*[CTA-861-G Table-42 Dynamic Range and Mastering InfoFrame] +*/ + sdp->sdp_header.HB1 = drm_infoframe->type; + /* +* Least Significant Eight Bits of (Data Byte Count – 1) +* info