[PATCH v5 11/18] drm/i915: Program DP SDPs with computed configs

2020-02-08 Thread Gwan-gyeong Mun
In order to use computed config for DP SDPs (DP VSC SDP and DP HDR Metadata
Infoframe SDP), it replaces intel_dp_vsc_enable() function and
intel_dp_hdr_metadata_enable() function to intel_dp_set_infoframes()
function.
And it removes unused functions.

Before:
 intel_dp_vsc_enable() and intel_dp_hdr_metadata_enable() compute sdp
 configs and program sdp registers on enable callback of encoder.

After:
 It separates computing of sdp configs and programming of sdp register.
 The compute config callback of encoder calls computing sdp configs.
 The enable callback of encoder calls programming sdp register.

v3: Rebased
v5: Polish commit message [Uma]

Signed-off-by: Gwan-gyeong Mun 
Reviewed-by: Uma Shankar 
---
 drivers/gpu/drm/i915/display/intel_ddi.c |   3 +-
 drivers/gpu/drm/i915/display/intel_dp.c  | 226 ---
 drivers/gpu/drm/i915/display/intel_dp.h  |   6 -
 3 files changed, 1 insertion(+), 234 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c 
b/drivers/gpu/drm/i915/display/intel_ddi.c
index 1ab638e17046..857014fe5880 100644
--- a/drivers/gpu/drm/i915/display/intel_ddi.c
+++ b/drivers/gpu/drm/i915/display/intel_ddi.c
@@ -3902,8 +3902,7 @@ static void intel_enable_ddi_dp(struct intel_encoder 
*encoder,
 
intel_edp_backlight_on(crtc_state, conn_state);
intel_psr_enable(intel_dp, crtc_state);
-   intel_dp_vsc_enable(intel_dp, crtc_state, conn_state);
-   intel_dp_hdr_metadata_enable(intel_dp, crtc_state, conn_state);
+   intel_dp_set_infoframes(encoder, true, crtc_state, conn_state);
intel_edp_drrs_enable(intel_dp, crtc_state);
 
if (crtc_state->has_audio)
diff --git a/drivers/gpu/drm/i915/display/intel_dp.c 
b/drivers/gpu/drm/i915/display/intel_dp.c
index 5a3ea3527fc3..2d6001dd7975 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -5125,232 +5125,6 @@ void intel_read_dp_sdp(struct intel_encoder *encoder,
}
 }
 
-static void
-intel_dp_setup_vsc_sdp(struct intel_dp *intel_dp,
-  const struct intel_crtc_state *crtc_state,
-  const struct drm_connector_state *conn_state)
-{
-   struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
-   struct dp_sdp vsc_sdp = {};
-
-   /* Prepare VSC Header for SU as per DP 1.4a spec, Table 2-119 */
-   vsc_sdp.sdp_header.HB0 = 0;
-   vsc_sdp.sdp_header.HB1 = 0x7;
-
-   /*
-* VSC SDP supporting 3D stereo, PSR2, and Pixel Encoding/
-* Colorimetry Format indication.
-*/
-   vsc_sdp.sdp_header.HB2 = 0x5;
-
-   /*
-* VSC SDP supporting 3D stereo, + PSR2, + Pixel Encoding/
-* Colorimetry Format indication (HB2 = 05h).
-*/
-   vsc_sdp.sdp_header.HB3 = 0x13;
-
-   /* DP 1.4a spec, Table 2-120 */
-   switch (crtc_state->output_format) {
-   case INTEL_OUTPUT_FORMAT_YCBCR444:
-   vsc_sdp.db[16] = 0x1 << 4; /* YCbCr 444 : DB16[7:4] = 1h */
-   break;
-   case INTEL_OUTPUT_FORMAT_YCBCR420:
-   vsc_sdp.db[16] = 0x3 << 4; /* YCbCr 420 : DB16[7:4] = 3h */
-   break;
-   case INTEL_OUTPUT_FORMAT_RGB:
-   default:
-   /* RGB: DB16[7:4] = 0h */
-   break;
-   }
-
-   switch (conn_state->colorspace) {
-   case DRM_MODE_COLORIMETRY_BT709_YCC:
-   vsc_sdp.db[16] |= 0x1;
-   break;
-   case DRM_MODE_COLORIMETRY_XVYCC_601:
-   vsc_sdp.db[16] |= 0x2;
-   break;
-   case DRM_MODE_COLORIMETRY_XVYCC_709:
-   vsc_sdp.db[16] |= 0x3;
-   break;
-   case DRM_MODE_COLORIMETRY_SYCC_601:
-   vsc_sdp.db[16] |= 0x4;
-   break;
-   case DRM_MODE_COLORIMETRY_OPYCC_601:
-   vsc_sdp.db[16] |= 0x5;
-   break;
-   case DRM_MODE_COLORIMETRY_BT2020_CYCC:
-   case DRM_MODE_COLORIMETRY_BT2020_RGB:
-   vsc_sdp.db[16] |= 0x6;
-   break;
-   case DRM_MODE_COLORIMETRY_BT2020_YCC:
-   vsc_sdp.db[16] |= 0x7;
-   break;
-   case DRM_MODE_COLORIMETRY_DCI_P3_RGB_D65:
-   case DRM_MODE_COLORIMETRY_DCI_P3_RGB_THEATER:
-   vsc_sdp.db[16] |= 0x4; /* DCI-P3 (SMPTE RP 431-2) */
-   break;
-   default:
-   /* sRGB (IEC 61966-2-1) / ITU-R BT.601: DB16[0:3] = 0h */
-
-   /* RGB->YCBCR color conversion uses the BT.709 color space. */
-   if (crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR420)
-   vsc_sdp.db[16] |= 0x1; /* 0x1, ITU-R BT.709 */
-   break;
-   }
-
-   /*
-* For pixel encoding formats YCbCr444, YCbCr422, YCbCr420, and Y Only,
-* the following Component Bit Depth values are defined:
-* 001b = 8bpc.
-* 010b = 10bpc.
-* 011b = 12bpc.
-* 100b = 16bpc.
-*/
-   switch 

[PATCH v5 09/18] drm/i915: Include DP HDR Metadata Infoframe SDP in the crtc state dump

2020-02-08 Thread Gwan-gyeong Mun
Dump out the DP HDR Metadata Infoframe SDP in the normal crtc state dump.

HDMI Dynamic Range and Mastering (DRM) infoframe and DP HDR Metadata
Infoframe SDP use the same member variable in infoframes of crtc state.

Signed-off-by: Gwan-gyeong Mun 
Reviewed-by: Uma Shankar 
---
 drivers/gpu/drm/i915/display/intel_display.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_display.c 
b/drivers/gpu/drm/i915/display/intel_display.c
index 66dbaab5867e..440e2c1c855c 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -13161,6 +13161,9 @@ static void intel_dump_pipe_config(const struct 
intel_crtc_state *pipe_config,
if (pipe_config->infoframes.enable &
intel_hdmi_infoframe_enable(HDMI_INFOFRAME_TYPE_DRM))
intel_dump_infoframe(dev_priv, _config->infoframes.drm);
+   if (pipe_config->infoframes.enable &
+   intel_hdmi_infoframe_enable(HDMI_PACKET_TYPE_GAMUT_METADATA))
+   intel_dump_infoframe(dev_priv, _config->infoframes.drm);
 
drm_dbg_kms(_priv->drm, "requested mode:\n");
drm_mode_debug_printmodeline(_config->hw.mode);
-- 
2.24.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v5 00/18] In order to readout DP SDPs, refactors the handling of DP SDPs

2020-02-08 Thread Gwan-gyeong Mun
In order to readout DP SDPs (Secondary Data Packet: DP HDR Metadata
Infoframe SDP, DP VSC SDP), it refactors handling DP SDPs codes.
It adds new compute routines for DP HDR Metadata Infoframe SDP
and DP VSC SDP. 
And new writing routines of DP SDPs (Secondary Data Packet) that uses
computed configs.
New reading routines of DP SDPs are added for readout.
It adds a logging function for DP VSC SDP.
When receiving video it is very useful to be able to log DP VSC SDP.
This greatly simplifies debugging.
In order to use a common VSC SDP Colorimetry calculating code on PSR,
it uses a new psr vsc sdp compute routine.

v2: Minor style fix
v3: 
  - Add a new drm data structure for DP VSC SDP
  - Replace a structure name to drm_dp_vsc_sdp from intel_dp_vsc_sdp
  - Move logging functions to drm core [Jani N]
And use drm core's DP VSC SDP logging function
  - Explicitly disable unused DIPs (AVI, GCP, VS, SPD, DRM. They will be
used for HDMI), when intel_dp_set_infoframes() function will be called.
v4:
  - Use struct drm_device logging macros
  - Rebased
v5:
  - Add disabling DIPs(Data Island Packets) when LSPCON is used
When LSPCON is used, DIPs(Data Island Packets of DP or HDMI) will not
be used. Therefore it explicitly disables DIPs on encoder->pre_enable
callback.
  - Use intel_de_*() functions for register access
  - Add warning where a bpc is 6 and a pixel format is RGB.
  - Addressed review comments from Uma
Add kernel docs for added data structures
Rename enum dp_colorspace to dp_pixelformat
Polish commit message and comments
Combine the if checks of sdp.HB2 and sdp.HB3
Add 6bpc to packining and unpacking of VSC SDP

Gwan-gyeong Mun (18):
  drm: Add DP1.4 VSC SDP Payload related Data Structures
  drm/i915/dp: Add compute routine for DP VSC SDP
  drm/i915/dp: Add compute routine for DP HDR Metadata Infoframe SDP
  drm/i915/dp: Add writing of DP SDPs
  video/hdmi: Add Unpack only function for DRM infoframe
  drm/i915/dp: Read out DP SDPs
  drm: Add logging function for DP VSC SDP
  drm/i915: Include HDMI DRM infoframe in the crtc state dump
  drm/i915: Include DP HDR Metadata Infoframe SDP in the crtc state dump
  drm/i915: Include DP VSC SDP in the crtc state dump
  drm/i915: Program DP SDPs with computed configs
  drm/i915: Add state readout for DP HDR Metadata Infoframe SDP
  drm/i915: Add state readout for DP VSC SDP
  drm/i915: Disable DIPs when LSPCON is used
  drm/i915: Program DP SDPs on pipe updates
  drm/i915: Stop sending DP SDPs on ddi disable
  drm/i915/dp: Add compute routine for DP PSR VSC SDP
  drm/i915/psr: Use new DP VSC SDP compute routine on PSR

 drivers/gpu/drm/drm_dp_helper.c   | 174 +
 drivers/gpu/drm/i915/display/intel_ddi.c  |  42 +-
 drivers/gpu/drm/i915/display/intel_display.c  |  62 ++
 .../drm/i915/display/intel_display_types.h|   1 +
 drivers/gpu/drm/i915/display/intel_dp.c   | 636 +-
 drivers/gpu/drm/i915/display/intel_dp.h   |  18 +-
 drivers/gpu/drm/i915/display/intel_psr.c  |  54 +-
 drivers/gpu/drm/i915/display/intel_psr.h  |   6 +-
 drivers/gpu/drm/i915/i915_drv.h   |   1 +
 drivers/video/hdmi.c  |  58 +-
 include/drm/drm_dp_helper.h   | 133 
 include/linux/hdmi.h  |   2 +
 12 files changed, 970 insertions(+), 217 deletions(-)

-- 
2.24.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v5 15/18] drm/i915: Program DP SDPs on pipe updates

2020-02-08 Thread Gwan-gyeong Mun
Call intel_dp_set_infoframes() function on pipe updates to make sure
that we send VSC SDP and HDR Metadata Infoframe SDP (when applicable)
on fastsets.

Signed-off-by: Gwan-gyeong Mun 
Reviewed-by: Uma Shankar 
---
 drivers/gpu/drm/i915/display/intel_ddi.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c 
b/drivers/gpu/drm/i915/display/intel_ddi.c
index 195e66744c1e..fce6e36feae1 100644
--- a/drivers/gpu/drm/i915/display/intel_ddi.c
+++ b/drivers/gpu/drm/i915/display/intel_ddi.c
@@ -4093,6 +4093,7 @@ static void intel_ddi_update_pipe_dp(struct intel_encoder 
*encoder,
intel_ddi_set_dp_msa(crtc_state, conn_state);
 
intel_psr_update(intel_dp, crtc_state);
+   intel_dp_set_infoframes(encoder, true, crtc_state, conn_state);
intel_edp_drrs_enable(intel_dp, crtc_state);
 
intel_panel_update_backlight(encoder, crtc_state, conn_state);
-- 
2.24.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v5 17/18] drm/i915/dp: Add compute routine for DP PSR VSC SDP

2020-02-08 Thread Gwan-gyeong Mun
In order to use a common VSC SDP Colorimetry calculating code on PSR,
it adds a compute routine for PSR VSC SDP.
As PSR routine can not use infoframes.vsc of crtc state, it also adds new
writing of DP SDPs (Secondary Data Packet) for PSR.
PSR routine has its own scenario and timings of writing a VSC SDP.

v3: Replace a structure name to drm_dp_vsc_sdp from intel_dp_vsc_sdp
v4: Use struct drm_device logging macros

Signed-off-by: Gwan-gyeong Mun 
Reviewed-by: Uma Shankar 
---
 drivers/gpu/drm/i915/display/intel_dp.c | 54 +
 drivers/gpu/drm/i915/display/intel_dp.h |  8 
 2 files changed, 62 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c 
b/drivers/gpu/drm/i915/display/intel_dp.c
index 2d6001dd7975..bfc39fbc6534 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -2469,6 +2469,42 @@ static void intel_dp_compute_vsc_sdp(struct intel_dp 
*intel_dp,
 _state->infoframes.vsc);
 }
 
+void intel_dp_compute_psr_vsc_sdp(struct intel_dp *intel_dp,
+ const struct intel_crtc_state *crtc_state,
+ const struct drm_connector_state *conn_state,
+ struct drm_dp_vsc_sdp *vsc)
+{
+   struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
+
+   vsc->sdp_type = DP_SDP_VSC;
+
+   if (dev_priv->psr.psr2_enabled) {
+   if (dev_priv->psr.colorimetry_support &&
+   intel_dp_needs_vsc_sdp(crtc_state, conn_state)) {
+   /* [PSR2, +Colorimetry] */
+   intel_dp_compute_vsc_colorimetry(crtc_state, conn_state,
+vsc);
+   } else {
+   /*
+* [PSR2, -Colorimetry]
+* Prepare VSC Header for SU as per eDP 1.4 spec, Table 
6-11
+* 3D stereo + PSR/PSR2 + Y-coordinate.
+*/
+   vsc->revision = 0x4;
+   vsc->length = 0xe;
+   }
+   } else {
+   /*
+* [PSR1]
+* Prepare VSC Header for SU as per DP 1.4 spec, Table 2-118
+* VSC SDP supporting 3D stereo + PSR (applies to eDP v1.3 or
+* higher).
+*/
+   vsc->revision = 0x2;
+   vsc->length = 0x8;
+   }
+}
+
 static void
 intel_dp_compute_hdr_metadata_infoframe_sdp(struct intel_dp *intel_dp,
struct intel_crtc_state *crtc_state,
@@ -4902,6 +4938,24 @@ static void intel_write_dp_sdp(struct intel_encoder 
*encoder,
intel_dig_port->write_infoframe(encoder, crtc_state, type, , len);
 }
 
+void intel_write_dp_vsc_sdp(struct intel_encoder *encoder,
+   const struct intel_crtc_state *crtc_state,
+   struct drm_dp_vsc_sdp *vsc)
+{
+   struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
+   struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
+   struct dp_sdp sdp = {};
+   ssize_t len;
+
+   len = intel_dp_vsc_sdp_pack(vsc, , sizeof(sdp));
+
+   if (drm_WARN_ON(_priv->drm, len < 0))
+   return;
+
+   intel_dig_port->write_infoframe(encoder, crtc_state, DP_SDP_VSC,
+   , len);
+}
+
 void intel_dp_set_infoframes(struct intel_encoder *encoder,
 bool enable,
 const struct intel_crtc_state *crtc_state,
diff --git a/drivers/gpu/drm/i915/display/intel_dp.h 
b/drivers/gpu/drm/i915/display/intel_dp.h
index 6562bb8edeba..5074e52722c0 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.h
+++ b/drivers/gpu/drm/i915/display/intel_dp.h
@@ -18,6 +18,7 @@ struct drm_connector_state;
 struct drm_encoder;
 struct drm_i915_private;
 struct drm_modeset_acquire_ctx;
+struct drm_dp_vsc_sdp;
 struct intel_connector;
 struct intel_crtc_state;
 struct intel_digital_port;
@@ -110,6 +111,13 @@ int intel_dp_link_required(int pixel_clock, int bpp);
 int intel_dp_max_data_rate(int max_link_clock, int max_lanes);
 bool intel_dp_needs_vsc_sdp(const struct intel_crtc_state *crtc_state,
const struct drm_connector_state *conn_state);
+void intel_dp_compute_psr_vsc_sdp(struct intel_dp *intel_dp,
+ const struct intel_crtc_state *crtc_state,
+ const struct drm_connector_state *conn_state,
+ struct drm_dp_vsc_sdp *vsc);
+void intel_write_dp_vsc_sdp(struct intel_encoder *encoder,
+   const struct intel_crtc_state *crtc_state,
+   struct drm_dp_vsc_sdp *vsc);
 void intel_dp_set_infoframes(struct intel_encoder *encoder, bool enable,
 const 

[PATCH v5 16/18] drm/i915: Stop sending DP SDPs on ddi disable

2020-02-08 Thread Gwan-gyeong Mun
Call intel_dp_set_infoframes(false) function on intel_ddi_post_disable_dp()
to make sure not to send VSC SDP and HDR Metadata Infoframe SDP.

v5: Polish commit message [Uma]

Signed-off-by: Gwan-gyeong Mun 
Reviewed-by: Uma Shankar 
---
 drivers/gpu/drm/i915/display/intel_ddi.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c 
b/drivers/gpu/drm/i915/display/intel_ddi.c
index fce6e36feae1..a00433d9cdd1 100644
--- a/drivers/gpu/drm/i915/display/intel_ddi.c
+++ b/drivers/gpu/drm/i915/display/intel_ddi.c
@@ -3738,6 +3738,8 @@ static void intel_ddi_post_disable_dp(struct 
intel_encoder *encoder,
  INTEL_OUTPUT_DP_MST);
enum phy phy = intel_port_to_phy(dev_priv, encoder->port);
 
+   intel_dp_set_infoframes(encoder, false, old_crtc_state, old_conn_state);
+
/*
 * Power down sink before disabling the port, otherwise we end
 * up getting interrupts from the sink on detecting link loss.
-- 
2.24.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v5 07/18] drm: Add logging function for DP VSC SDP

2020-02-08 Thread Gwan-gyeong Mun
When receiving video it is very useful to be able to log DP VSC SDP.
This greatly simplifies debugging.

v2: Minor style fix
v3: Move logging functions to drm core [Jani N]
v5: Rebased

Signed-off-by: Gwan-gyeong Mun 
Reviewed-by: Uma Shankar 
---
 drivers/gpu/drm/drm_dp_helper.c | 174 
 include/drm/drm_dp_helper.h |   3 +
 2 files changed, 177 insertions(+)

diff --git a/drivers/gpu/drm/drm_dp_helper.c b/drivers/gpu/drm/drm_dp_helper.c
index 5a103e9b3c86..17059ed4763b 100644
--- a/drivers/gpu/drm/drm_dp_helper.c
+++ b/drivers/gpu/drm/drm_dp_helper.c
@@ -1395,3 +1395,177 @@ int drm_dp_dsc_sink_supported_input_bpcs(const u8 
dsc_dpcd[DP_DSC_RECEIVER_CAP_S
return num_bpc;
 }
 EXPORT_SYMBOL(drm_dp_dsc_sink_supported_input_bpcs);
+
+static const char *dp_pixelformat_get_name(enum dp_pixelformat pixelformat)
+{
+   if (pixelformat < 0 || pixelformat > DP_PIXELFORMAT_RESERVED)
+   return "Invalid";
+
+   switch (pixelformat) {
+   case DP_PIXELFORMAT_RGB:
+   return "RGB";
+   case DP_PIXELFORMAT_YUV444:
+   return "YUV444";
+   case DP_PIXELFORMAT_YUV422:
+   return "YUV422";
+   case DP_PIXELFORMAT_YUV420:
+   return "YUV420";
+   case DP_PIXELFORMAT_Y_ONLY:
+   return "Y_ONLY";
+   case DP_PIXELFORMAT_RAW:
+   return "RAW";
+   default:
+   return "Reserved";
+   }
+}
+
+static const char *dp_colorimetry_get_name(enum dp_pixelformat pixelformat,
+  enum dp_colorimetry colorimetry)
+{
+   if (pixelformat < 0 || pixelformat > DP_PIXELFORMAT_RESERVED)
+   return "Invalid";
+
+   switch (colorimetry) {
+   case DP_COLORIMETRY_DEFAULT:
+   switch (pixelformat) {
+   case DP_PIXELFORMAT_RGB:
+   return "sRGB";
+   case DP_PIXELFORMAT_YUV444:
+   case DP_PIXELFORMAT_YUV422:
+   case DP_PIXELFORMAT_YUV420:
+   return "BT.601";
+   case DP_PIXELFORMAT_Y_ONLY:
+   return "DICOM PS3.14";
+   case DP_PIXELFORMAT_RAW:
+   return "Custom Color Profile";
+   default:
+   return "Reserved";
+   }
+   case DP_COLORIMETRY_RGB_WIDE_FIXED: /* and DP_COLORIMETRY_BT709_YCC */
+   switch (pixelformat) {
+   case DP_PIXELFORMAT_RGB:
+   return "Wide Fixed";
+   case DP_PIXELFORMAT_YUV444:
+   case DP_PIXELFORMAT_YUV422:
+   case DP_PIXELFORMAT_YUV420:
+   return "BT.709";
+   default:
+   return "Reserved";
+   }
+   case DP_COLORIMETRY_RGB_WIDE_FLOAT: /* and DP_COLORIMETRY_XVYCC_601 */
+   switch (pixelformat) {
+   case DP_PIXELFORMAT_RGB:
+   return "Wide Float";
+   case DP_PIXELFORMAT_YUV444:
+   case DP_PIXELFORMAT_YUV422:
+   case DP_PIXELFORMAT_YUV420:
+   return "xvYCC 601";
+   default:
+   return "Reserved";
+   }
+   case DP_COLORIMETRY_OPRGB: /* and DP_COLORIMETRY_XVYCC_709 */
+   switch (pixelformat) {
+   case DP_PIXELFORMAT_RGB:
+   return "OpRGB";
+   case DP_PIXELFORMAT_YUV444:
+   case DP_PIXELFORMAT_YUV422:
+   case DP_PIXELFORMAT_YUV420:
+   return "xvYCC 709";
+   default:
+   return "Reserved";
+   }
+   case DP_COLORIMETRY_DCI_P3_RGB: /* and DP_COLORIMETRY_SYCC_601 */
+   switch (pixelformat) {
+   case DP_PIXELFORMAT_RGB:
+   return "DCI-P3";
+   case DP_PIXELFORMAT_YUV444:
+   case DP_PIXELFORMAT_YUV422:
+   case DP_PIXELFORMAT_YUV420:
+   return "sYCC 601";
+   default:
+   return "Reserved";
+   }
+   case DP_COLORIMETRY_RGB_CUSTOM: /* and DP_COLORIMETRY_OPYCC_601 */
+   switch (pixelformat) {
+   case DP_PIXELFORMAT_RGB:
+   return "Custom Profile";
+   case DP_PIXELFORMAT_YUV444:
+   case DP_PIXELFORMAT_YUV422:
+   case DP_PIXELFORMAT_YUV420:
+   return "OpYCC 601";
+   default:
+   return "Reserved";
+   }
+   case DP_COLORIMETRY_BT2020_RGB: /* and DP_COLORIMETRY_BT2020_CYCC */
+   switch (pixelformat) {
+   case DP_PIXELFORMAT_RGB:
+   return "BT.2020 RGB";
+   case DP_PIXELFORMAT_YUV444:
+   case DP_PIXELFORMAT_YUV422:
+   case 

[PATCH v5 10/18] drm/i915: Include DP VSC SDP in the crtc state dump

2020-02-08 Thread Gwan-gyeong Mun
Dump out the DP VSC SDP in the normal crtc state dump

v3: Replace a structure name to drm_dp_vsc_sdp from intel_dp_vsc_sdp
Use drm core's DP VSC SDP logging function

Signed-off-by: Gwan-gyeong Mun 
Reviewed-by: Uma Shankar 
---
 drivers/gpu/drm/i915/display/intel_display.c | 13 +
 1 file changed, 13 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_display.c 
b/drivers/gpu/drm/i915/display/intel_display.c
index 440e2c1c855c..e3694e499b28 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -13006,6 +13006,16 @@ intel_dump_infoframe(struct drm_i915_private *dev_priv,
hdmi_infoframe_log(KERN_DEBUG, dev_priv->drm.dev, frame);
 }
 
+static void
+intel_dump_dp_vsc_sdp(struct drm_i915_private *dev_priv,
+ const struct drm_dp_vsc_sdp *vsc)
+{
+   if (!drm_debug_enabled(DRM_UT_KMS))
+   return;
+
+   drm_dp_vsc_sdp_log(KERN_DEBUG, dev_priv->drm.dev, vsc);
+}
+
 #define OUTPUT_TYPE(x) [INTEL_OUTPUT_ ## x] = #x
 
 static const char * const output_type_str[] = {
@@ -13164,6 +13174,9 @@ static void intel_dump_pipe_config(const struct 
intel_crtc_state *pipe_config,
if (pipe_config->infoframes.enable &
intel_hdmi_infoframe_enable(HDMI_PACKET_TYPE_GAMUT_METADATA))
intel_dump_infoframe(dev_priv, _config->infoframes.drm);
+   if (pipe_config->infoframes.enable &
+   intel_hdmi_infoframe_enable(DP_SDP_VSC))
+   intel_dump_dp_vsc_sdp(dev_priv, _config->infoframes.vsc);
 
drm_dbg_kms(_priv->drm, "requested mode:\n");
drm_mode_debug_printmodeline(_config->hw.mode);
-- 
2.24.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v5 13/18] drm/i915: Add state readout for DP VSC SDP

2020-02-08 Thread Gwan-gyeong Mun
Added state readout for DP VSC SDP and enabled state validation
for DP VSC SDP.

v2: Minor style fix
v3: Replace a structure name to drm_dp_vsc_sdp from intel_dp_vsc_sdp
v4: Use struct drm_device logging macros

Signed-off-by: Gwan-gyeong Mun 
Reviewed-by: Uma Shankar 
---
 drivers/gpu/drm/i915/display/intel_ddi.c |  1 +
 drivers/gpu/drm/i915/display/intel_display.c | 43 
 2 files changed, 44 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c 
b/drivers/gpu/drm/i915/display/intel_ddi.c
index 55eacc4d75bb..7f29b08ea202 100644
--- a/drivers/gpu/drm/i915/display/intel_ddi.c
+++ b/drivers/gpu/drm/i915/display/intel_ddi.c
@@ -4367,6 +4367,7 @@ void intel_ddi_get_config(struct intel_encoder *encoder,
 _config->infoframes.drm);
 
intel_read_dp_sdp(encoder, pipe_config, 
HDMI_PACKET_TYPE_GAMUT_METADATA);
+   intel_read_dp_sdp(encoder, pipe_config, DP_SDP_VSC);
 }
 
 static enum intel_output_type
diff --git a/drivers/gpu/drm/i915/display/intel_display.c 
b/drivers/gpu/drm/i915/display/intel_display.c
index e3694e499b28..c11898cc1b50 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -13634,6 +13634,13 @@ intel_compare_infoframe(const union hdmi_infoframe *a,
return memcmp(a, b, sizeof(*a)) == 0;
 }
 
+static bool
+intel_compare_dp_vsc_sdp(const struct drm_dp_vsc_sdp *a,
+const struct drm_dp_vsc_sdp *b)
+{
+   return memcmp(a, b, sizeof(*a)) == 0;
+}
+
 static void
 pipe_config_infoframe_mismatch(struct drm_i915_private *dev_priv,
   bool fastset, const char *name,
@@ -13659,6 +13666,31 @@ pipe_config_infoframe_mismatch(struct drm_i915_private 
*dev_priv,
}
 }
 
+static void
+pipe_config_dp_vsc_sdp_mismatch(struct drm_i915_private *dev_priv,
+   bool fastset, const char *name,
+   const struct drm_dp_vsc_sdp *a,
+   const struct drm_dp_vsc_sdp *b)
+{
+   if (fastset) {
+   if (!drm_debug_enabled(DRM_UT_KMS))
+   return;
+
+   drm_dbg_kms(_priv->drm,
+   "fastset mismatch in %s dp sdp\n", name);
+   drm_dbg_kms(_priv->drm, "expected:\n");
+   drm_dp_vsc_sdp_log(KERN_DEBUG, dev_priv->drm.dev, a);
+   drm_dbg_kms(_priv->drm, "found:\n");
+   drm_dp_vsc_sdp_log(KERN_DEBUG, dev_priv->drm.dev, b);
+   } else {
+   drm_err(_priv->drm, "mismatch in %s dp sdp\n", name);
+   drm_err(_priv->drm, "expected:\n");
+   drm_dp_vsc_sdp_log(KERN_ERR, dev_priv->drm.dev, a);
+   drm_err(_priv->drm, "found:\n");
+   drm_dp_vsc_sdp_log(KERN_ERR, dev_priv->drm.dev, b);
+   }
+}
+
 static void __printf(4, 5)
 pipe_config_mismatch(bool fastset, const struct intel_crtc *crtc,
 const char *name, const char *format, ...)
@@ -13860,6 +13892,16 @@ intel_pipe_config_compare(const struct 
intel_crtc_state *current_config,
} \
 } while (0)
 
+#define PIPE_CONF_CHECK_DP_VSC_SDP(name) do { \
+   if (!intel_compare_dp_vsc_sdp(_config->infoframes.name, \
+ _config->infoframes.name)) { \
+   pipe_config_dp_vsc_sdp_mismatch(dev_priv, fastset, 
__stringify(name), \
+   
_config->infoframes.name, \
+   _config->infoframes.name); 
\
+   ret = false; \
+   } \
+} while (0)
+
 #define PIPE_CONF_CHECK_COLOR_LUT(name1, name2, bit_precision) do { \
if (current_config->name1 != pipe_config->name1) { \
pipe_config_mismatch(fastset, crtc, __stringify(name1), \
@@ -14035,6 +14077,7 @@ intel_pipe_config_compare(const struct intel_crtc_state 
*current_config,
PIPE_CONF_CHECK_INFOFRAME(spd);
PIPE_CONF_CHECK_INFOFRAME(hdmi);
PIPE_CONF_CHECK_INFOFRAME(drm);
+   PIPE_CONF_CHECK_DP_VSC_SDP(vsc);
 
PIPE_CONF_CHECK_X(sync_mode_slaves_mask);
PIPE_CONF_CHECK_I(master_transcoder);
-- 
2.24.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v5 02/18] drm/i915/dp: Add compute routine for DP VSC SDP

2020-02-08 Thread Gwan-gyeong Mun
In order to support state readout for DP VSC SDP, we need to have a
structure which holds DP VSC SDP payload data such as
"union hdmi_infoframe drm" which is used for DRM infoframe.
It adds a struct drm_dp_vsc_sdp vsc to intel_crtc_state.infoframes.

And it stores computed dp vsc sdp to infoframes.vsc of crtc state.
While computing we'll also fill out the inforames.enable bitmask
appropriately.

The compute routine follows DP 1.4 spec [Table 2-117: VSC SDP Payload for
DB16 through DB18].

v3: Replace a structure name to drm_dp_vsc_sdp from intel_dp_vsc_sdp
v5:
  - Rebased
  - Add warning where a bpc is 6 and a pixel format is RGB.

Signed-off-by: Gwan-gyeong Mun 
Reviewed-by: Uma Shankar 
---
 .../drm/i915/display/intel_display_types.h|  1 +
 drivers/gpu/drm/i915/display/intel_dp.c   | 98 +++
 2 files changed, 99 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h 
b/drivers/gpu/drm/i915/display/intel_display_types.h
index 7ae0bc8b80d1..7997c307026d 100644
--- a/drivers/gpu/drm/i915/display/intel_display_types.h
+++ b/drivers/gpu/drm/i915/display/intel_display_types.h
@@ -997,6 +997,7 @@ struct intel_crtc_state {
union hdmi_infoframe spd;
union hdmi_infoframe hdmi;
union hdmi_infoframe drm;
+   struct drm_dp_vsc_sdp vsc;
} infoframes;
 
/* HDMI scrambling status */
diff --git a/drivers/gpu/drm/i915/display/intel_dp.c 
b/drivers/gpu/drm/i915/display/intel_dp.c
index f4dede6253f8..499377bf2891 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -2372,6 +2372,103 @@ static bool intel_dp_port_has_audio(struct 
drm_i915_private *dev_priv,
return true;
 }
 
+static void intel_dp_compute_vsc_colorimetry(const struct intel_crtc_state 
*crtc_state,
+const struct drm_connector_state 
*conn_state,
+struct drm_dp_vsc_sdp *vsc)
+{
+   struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
+   struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
+
+   /*
+* Prepare VSC Header for SU as per DP 1.4 spec, Table 2-118
+* VSC SDP supporting 3D stereo, PSR2, and Pixel Encoding/
+* Colorimetry Format indication.
+*/
+   vsc->revision = 0x5;
+   vsc->length = 0x13;
+
+   /* DP 1.4a spec, Table 2-120 */
+   switch (crtc_state->output_format) {
+   case INTEL_OUTPUT_FORMAT_YCBCR444:
+   vsc->pixelformat = DP_PIXELFORMAT_YUV444;
+   break;
+   case INTEL_OUTPUT_FORMAT_YCBCR420:
+   vsc->pixelformat = DP_PIXELFORMAT_YUV420;
+   break;
+   case INTEL_OUTPUT_FORMAT_RGB:
+   default:
+   vsc->pixelformat = DP_PIXELFORMAT_RGB;
+   }
+
+   switch (conn_state->colorspace) {
+   case DRM_MODE_COLORIMETRY_BT709_YCC:
+   vsc->colorimetry = DP_COLORIMETRY_BT709_YCC;
+   break;
+   case DRM_MODE_COLORIMETRY_XVYCC_601:
+   vsc->colorimetry = DP_COLORIMETRY_XVYCC_601;
+   break;
+   case DRM_MODE_COLORIMETRY_XVYCC_709:
+   vsc->colorimetry = DP_COLORIMETRY_XVYCC_709;
+   break;
+   case DRM_MODE_COLORIMETRY_SYCC_601:
+   vsc->colorimetry = DP_COLORIMETRY_SYCC_601;
+   break;
+   case DRM_MODE_COLORIMETRY_OPYCC_601:
+   vsc->colorimetry = DP_COLORIMETRY_OPYCC_601;
+   break;
+   case DRM_MODE_COLORIMETRY_BT2020_CYCC:
+   vsc->colorimetry = DP_COLORIMETRY_BT2020_CYCC;
+   break;
+   case DRM_MODE_COLORIMETRY_BT2020_RGB:
+   vsc->colorimetry = DP_COLORIMETRY_BT2020_RGB;
+   break;
+   case DRM_MODE_COLORIMETRY_BT2020_YCC:
+   vsc->colorimetry = DP_COLORIMETRY_BT2020_YCC;
+   break;
+   case DRM_MODE_COLORIMETRY_DCI_P3_RGB_D65:
+   case DRM_MODE_COLORIMETRY_DCI_P3_RGB_THEATER:
+   vsc->colorimetry = DP_COLORIMETRY_DCI_P3_RGB;
+   break;
+   default:
+   /*
+* RGB->YCBCR color conversion uses the BT.709
+* color space.
+*/
+   if (crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR420)
+   vsc->colorimetry = DP_COLORIMETRY_BT709_YCC;
+   else
+   vsc->colorimetry = DP_COLORIMETRY_DEFAULT;
+   break;
+   }
+
+   vsc->bpc = crtc_state->pipe_bpp / 3;
+   drm_WARN_ON(_priv->drm, vsc->bpc == 6 &&
+   vsc->pixelformat == DP_PIXELFORMAT_RGB);
+
+   /* all YCbCr are always limited range */
+   vsc->dynamic_range = DP_DYNAMIC_RANGE_CTA;
+   vsc->content_type = DP_CONTENT_TYPE_NOT_DEFINED;
+}
+
+static void intel_dp_compute_vsc_sdp(struct intel_dp *intel_dp,
+

[PATCH v5 14/18] drm/i915: Disable DIPs when LSPCON is used

2020-02-08 Thread Gwan-gyeong Mun
When LSPCON is used, DIPs(Data Island Packets of DP or HDMI) will not be
used. Therefore it explicitly disables DIPs on encoder->pre_enable
callback.

It resolves below issue
 - reproduce step of issue
 1) Boot or Pause & Resume system
 2) Do not enable SPD (Source Product Description) DIP
 3) When driver tries to read a DIP Ctl register,
it is written that SDP DIP is enabled.

Cc: Ville Syrjälä 
Signed-off-by: Gwan-gyeong Mun 
---
 drivers/gpu/drm/i915/display/intel_ddi.c | 23 +++
 1 file changed, 23 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c 
b/drivers/gpu/drm/i915/display/intel_ddi.c
index 7f29b08ea202..195e66744c1e 100644
--- a/drivers/gpu/drm/i915/display/intel_ddi.c
+++ b/drivers/gpu/drm/i915/display/intel_ddi.c
@@ -3627,6 +3627,22 @@ static void intel_ddi_pre_enable_hdmi(struct 
intel_encoder *encoder,
   crtc_state, conn_state);
 }
 
+static void intel_ddi_disable_dips(struct intel_encoder *encoder,
+  const struct intel_crtc_state *crtc_state)
+{
+   struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
+   i915_reg_t reg = HSW_TVIDEO_DIP_CTL(crtc_state->cpu_transcoder);
+   u32 dip_enable = VIDEO_DIP_ENABLE_VSC_HSW | VIDEO_DIP_ENABLE_AVI_HSW |
+VIDEO_DIP_ENABLE_GCP_HSW | VIDEO_DIP_ENABLE_VS_HSW |
+VIDEO_DIP_ENABLE_GMP_HSW | VIDEO_DIP_ENABLE_SPD_HSW |
+VIDEO_DIP_ENABLE_DRM_GLK;
+   u32 val = intel_de_read(dev_priv, reg);
+
+   val &= ~dip_enable;
+   intel_de_write(dev_priv, reg, val);
+   intel_de_posting_read(dev_priv, reg);
+}
+
 static void intel_ddi_pre_enable(struct intel_encoder *encoder,
 const struct intel_crtc_state *crtc_state,
 const struct drm_connector_state *conn_state)
@@ -3666,6 +3682,13 @@ static void intel_ddi_pre_enable(struct intel_encoder 
*encoder,
struct intel_digital_port *dig_port =
enc_to_dig_port(encoder);
 
+   /*
+* When LSPCON is used, DIPs (Data Island Packets of DP
+* or HDMI) will not be used.
+* Therefore we explicitly disable DIPs here.
+*/
+   intel_ddi_disable_dips(encoder, crtc_state);
+
dig_port->set_infoframes(encoder,
 crtc_state->has_infoframe,
 crtc_state, conn_state);
-- 
2.24.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v5 01/18] drm: Add DP1.4 VSC SDP Payload related Data Structures

2020-02-08 Thread Gwan-gyeong Mun
It adds new enumeration definitions for VSC SDP Payload for Pixel
Encoding/Colorimetry Format.
And it adds a new drm data structure for DP VSC SDP.

enum dp_colorspace and enum dp_colorimetry correspond "Pixel Encoding and
Colorimetry Formats". enum dp_dynamic_range corresponds "Dynamic Range".
And enum dp_content_type corresponds "Content Type"
All of them are based on DP 1.4 spec [Table 2-117: VSC SDP Payload for
DB16 through DB18].

v3: Add a new drm data structure for DP VSC SDP
v5: Addressed review comments from Uma
- Add kernel docs for added data structures
- Rename enum dp_colorspace to dp_pixelformat
- Polish commit message
- Fix typos
- Drop self-explanatory comments

Signed-off-by: Gwan-gyeong Mun 
---
 include/drm/drm_dp_helper.h | 130 
 1 file changed, 130 insertions(+)

diff --git a/include/drm/drm_dp_helper.h b/include/drm/drm_dp_helper.h
index 262faf9e5e94..e332f54013d7 100644
--- a/include/drm/drm_dp_helper.h
+++ b/include/drm/drm_dp_helper.h
@@ -1209,6 +1209,136 @@ struct dp_sdp {
 #define EDP_VSC_PSR_UPDATE_RFB (1<<1)
 #define EDP_VSC_PSR_CRC_VALUES_VALID   (1<<2)
 
+/**
+ * enum dp_pixelformat - drm DP Pixel encoding formats
+ *
+ * This enum is used to indicate DP VSC SDP Pixel encoding formats.
+ * It is based on DP 1.4 spec [Table 2-117: VSC SDP Payload for DB16 through
+ * DB18]
+ *
+ * @DP_PIXELFORMAT_RGB: RGB pixel encoding format
+ * @DP_PIXELFORMAT_YUV444: YCbCr 4:4:4 pixel encoding format
+ * @DP_PIXELFORMAT_YUV422: YCbCr 4:2:2 pixel encoding format
+ * @DP_PIXELFORMAT_YUV420: YCbCr 4:2:0 pixel encoding format
+ * @DP_PIXELFORMAT_Y_ONLY: Y Only pixel encoding format
+ * @DP_PIXELFORMAT_RAW: RAW pixel encoding format
+ * @DP_PIXELFORMAT_RESERVED: Reserved pixel encoding format
+ */
+enum dp_pixelformat {
+   DP_PIXELFORMAT_RGB = 0,
+   DP_PIXELFORMAT_YUV444 = 0x1,
+   DP_PIXELFORMAT_YUV422 = 0x2,
+   DP_PIXELFORMAT_YUV420 = 0x3,
+   DP_PIXELFORMAT_Y_ONLY = 0x4,
+   DP_PIXELFORMAT_RAW = 0x5,
+   DP_PIXELFORMAT_RESERVED = 0x6,
+};
+
+/**
+ * enum dp_colorimetry - drm DP Colorimetry formats
+ *
+ * This enum is used to indicate DP VSC SDP Colorimetry formats.
+ * It is based on DP 1.4 spec [Table 2-117: VSC SDP Payload for DB16 through
+ * DB18] and a name of enum member follows DRM_MODE_COLORIMETRY definition.
+ *
+ * @DP_COLORIMETRY_DEFAULT: sRGB (IEC 61966-2-1) or
+ *  ITU-R BT.601 colorimetry format
+ * @DP_COLORIMETRY_RGB_WIDE_FIXED: RGB wide gamut fixed point colorimetry 
format
+ * @DP_COLORIMETRY_BT709_YCC: ITU-R BT.709 colorimetry format
+ * @DP_COLORIMETRY_RGB_WIDE_FLOAT: RGB wide gamut floating point
+ * (scRGB (IEC 61966-2-2)) colorimetry format
+ * @DP_COLORIMETRY_XVYCC_601: xvYCC601 colorimetry format
+ * @DP_COLORIMETRY_OPRGB: OpRGB colorimetry format
+ * @DP_COLORIMETRY_XVYCC_709: xvYCC709 colorimetry format
+ * @DP_COLORIMETRY_DCI_P3_RGB: DCI-P3 (SMPTE RP 431-2) colorimetry format
+ * @DP_COLORIMETRY_SYCC_601: sYCC601 colorimetry format
+ * @DP_COLORIMETRY_RGB_CUSTOM: RGB Custom Color Profile colorimetry format
+ * @DP_COLORIMETRY_OPYCC_601: opYCC601 colorimetry format
+ * @DP_COLORIMETRY_BT2020_RGB: ITU-R BT.2020 R' G' B' colorimetry format
+ * @DP_COLORIMETRY_BT2020_CYCC: ITU-R BT.2020 Y'c C'bc C'rc colorimetry format
+ * @DP_COLORIMETRY_BT2020_YCC: ITU-R BT.2020 Y' C'b C'r colorimetry format
+ */
+enum dp_colorimetry {
+   DP_COLORIMETRY_DEFAULT = 0,
+   DP_COLORIMETRY_RGB_WIDE_FIXED = 0x1,
+   DP_COLORIMETRY_BT709_YCC = 0x1,
+   DP_COLORIMETRY_RGB_WIDE_FLOAT = 0x2,
+   DP_COLORIMETRY_XVYCC_601 = 0x2,
+   DP_COLORIMETRY_OPRGB = 0x3,
+   DP_COLORIMETRY_XVYCC_709 = 0x3,
+   DP_COLORIMETRY_DCI_P3_RGB = 0x4,
+   DP_COLORIMETRY_SYCC_601 = 0x4,
+   DP_COLORIMETRY_RGB_CUSTOM = 0x5,
+   DP_COLORIMETRY_OPYCC_601 = 0x5,
+   DP_COLORIMETRY_BT2020_RGB = 0x6,
+   DP_COLORIMETRY_BT2020_CYCC = 0x6,
+   DP_COLORIMETRY_BT2020_YCC = 0x7,
+};
+
+/**
+ * enum dp_dynamic_range - drm DP Dynamic Range
+ *
+ * This enum is used to indicate DP VSC SDP Dynamic Range.
+ * It is based on DP 1.4 spec [Table 2-117: VSC SDP Payload for DB16 through
+ * DB18]
+ *
+ * @DP_DYNAMIC_RANGE_VESA: VESA range
+ * @DP_DYNAMIC_RANGE_CTA: CTA range
+ */
+enum dp_dynamic_range {
+   DP_DYNAMIC_RANGE_VESA = 0,
+   DP_DYNAMIC_RANGE_CTA = 1,
+};
+
+/**
+ * enum dp_content_type - drm DP Content Type
+ *
+ * This enum is used to indicate DP VSC SDP Content Types.
+ * It is based on DP 1.4 spec [Table 2-117: VSC SDP Payload for DB16 through
+ * DB18]
+ * CTA-861-G defines content types and expected processing by a sink device
+ *
+ * @DP_CONTENT_TYPE_NOT_DEFINED: Not defined type
+ * @DP_CONTENT_TYPE_GRAPHICS: Graphics type
+ * @DP_CONTENT_TYPE_PHOTO: Photo type
+ * @DP_CONTENT_TYPE_VIDEO: Video type
+ * @DP_CONTENT_TYPE_GAME: Game type
+ */
+enum dp_content_type {
+   DP_CONTENT_TYPE_NOT_DEFINED = 

[PATCH v5 05/18] video/hdmi: Add Unpack only function for DRM infoframe

2020-02-08 Thread Gwan-gyeong Mun
It adds an unpack only function for DRM infoframe for dynamic range and
mastering infoframe readout.
It unpacks the information data block contained in the binary buffer into
a structured frame of the HDMI Dynamic Range and Mastering (DRM)
information frame.

In contrast to hdmi_drm_infoframe_unpack() function, it does not verify
a checksum.

It can be used for unpacking a DP HDR Metadata Infoframe SDP case.
DP HDR Metadata Infoframe SDP uses the same Dynamic Range and Mastering
(DRM) information (CTA-861-G spec.) such as HDMI DRM infoframe.
But DP SDP header and payload structure are different from HDMI DRM
Infoframe. Therefore unpacking DRM infoframe for DP requires skipping of
a verifying checksum.

Signed-off-by: Gwan-gyeong Mun 
Reviewed-by: Uma Shankar 
---
 drivers/video/hdmi.c | 58 +++-
 include/linux/hdmi.h |  2 ++
 2 files changed, 43 insertions(+), 17 deletions(-)

diff --git a/drivers/video/hdmi.c b/drivers/video/hdmi.c
index 9c82e2a0a411..9818836d82b7 100644
--- a/drivers/video/hdmi.c
+++ b/drivers/video/hdmi.c
@@ -1775,20 +1775,18 @@ hdmi_vendor_any_infoframe_unpack(union 
hdmi_vendor_any_infoframe *frame,
 }
 
 /**
- * hdmi_drm_infoframe_unpack() - unpack binary buffer to a HDMI DRM infoframe
+ * hdmi_drm_infoframe_unpack_only() - unpack binary buffer to a HDMI DRM 
infoframe
  * @frame: HDMI DRM infoframe
  * @buffer: source buffer
  * @size: size of buffer
  *
- * Unpacks the information contained in binary @buffer into a structured
+ * Unpacks the information data block contained in binary @buffer into a 
structured
  * @frame of the HDMI Dynamic Range and Mastering (DRM) information frame.
- * Also verifies the checksum as required by section 5.3.5 of the HDMI 1.4
- * specification.
  *
  * Returns 0 on success or a negative error code on failure.
  */
-static int hdmi_drm_infoframe_unpack(struct hdmi_drm_infoframe *frame,
-const void *buffer, size_t size)
+int hdmi_drm_infoframe_unpack_only(struct hdmi_drm_infoframe *frame,
+  const void *buffer, size_t size)
 {
const u8 *ptr = buffer;
const u8 *temp;
@@ -1797,23 +1795,13 @@ static int hdmi_drm_infoframe_unpack(struct 
hdmi_drm_infoframe *frame,
int ret;
int i;
 
-   if (size < HDMI_INFOFRAME_SIZE(DRM))
-   return -EINVAL;
-
-   if (ptr[0] != HDMI_INFOFRAME_TYPE_DRM ||
-   ptr[1] != 1 ||
-   ptr[2] != HDMI_DRM_INFOFRAME_SIZE)
-   return -EINVAL;
-
-   if (hdmi_infoframe_checksum(buffer, HDMI_INFOFRAME_SIZE(DRM)) != 0)
+   if (size < HDMI_DRM_INFOFRAME_SIZE)
return -EINVAL;
 
ret = hdmi_drm_infoframe_init(frame);
if (ret)
return ret;
 
-   ptr += HDMI_INFOFRAME_HEADER_SIZE;
-
frame->eotf = ptr[0] & 0x7;
frame->metadata_type = ptr[1] & 0x7;
 
@@ -1837,6 +1825,42 @@ static int hdmi_drm_infoframe_unpack(struct 
hdmi_drm_infoframe *frame,
 
return 0;
 }
+EXPORT_SYMBOL(hdmi_drm_infoframe_unpack_only);
+
+/**
+ * hdmi_drm_infoframe_unpack() - unpack binary buffer to a HDMI DRM infoframe
+ * @frame: HDMI DRM infoframe
+ * @buffer: source buffer
+ * @size: size of buffer
+ *
+ * Unpacks the information contained in binary @buffer into a structured
+ * @frame of the HDMI Dynamic Range and Mastering (DRM) information frame.
+ * Also verifies the checksum as required by section 5.3.5 of the HDMI 1.4
+ * specification.
+ *
+ * Returns 0 on success or a negative error code on failure.
+ */
+static int hdmi_drm_infoframe_unpack(struct hdmi_drm_infoframe *frame,
+const void *buffer, size_t size)
+{
+   const u8 *ptr = buffer;
+   int ret;
+
+   if (size < HDMI_INFOFRAME_SIZE(DRM))
+   return -EINVAL;
+
+   if (ptr[0] != HDMI_INFOFRAME_TYPE_DRM ||
+   ptr[1] != 1 ||
+   ptr[2] != HDMI_DRM_INFOFRAME_SIZE)
+   return -EINVAL;
+
+   if (hdmi_infoframe_checksum(buffer, HDMI_INFOFRAME_SIZE(DRM)) != 0)
+   return -EINVAL;
+
+   ret = hdmi_drm_infoframe_unpack_only(frame, ptr + 
HDMI_INFOFRAME_HEADER_SIZE,
+size - HDMI_INFOFRAME_HEADER_SIZE);
+   return ret;
+}
 
 /**
  * hdmi_infoframe_unpack() - unpack binary buffer to a HDMI infoframe
diff --git a/include/linux/hdmi.h b/include/linux/hdmi.h
index 9918a6c910c5..afb43efc03e0 100644
--- a/include/linux/hdmi.h
+++ b/include/linux/hdmi.h
@@ -219,6 +219,8 @@ ssize_t hdmi_drm_infoframe_pack(struct hdmi_drm_infoframe 
*frame, void *buffer,
 ssize_t hdmi_drm_infoframe_pack_only(const struct hdmi_drm_infoframe *frame,
 void *buffer, size_t size);
 int hdmi_drm_infoframe_check(struct hdmi_drm_infoframe *frame);
+int hdmi_drm_infoframe_unpack_only(struct hdmi_drm_infoframe *frame,
+  const void *buffer, size_t size);
 
 enum 

[PATCH v5 12/18] drm/i915: Add state readout for DP HDR Metadata Infoframe SDP

2020-02-08 Thread Gwan-gyeong Mun
Added state readout for DP HDR Metadata Infoframe SDP.

Signed-off-by: Gwan-gyeong Mun 
Reviewed-by: Uma Shankar 
---
 drivers/gpu/drm/i915/display/intel_ddi.c | 8 
 1 file changed, 8 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c 
b/drivers/gpu/drm/i915/display/intel_ddi.c
index 857014fe5880..55eacc4d75bb 100644
--- a/drivers/gpu/drm/i915/display/intel_ddi.c
+++ b/drivers/gpu/drm/i915/display/intel_ddi.c
@@ -4298,6 +4298,9 @@ void intel_ddi_get_config(struct intel_encoder *encoder,
  pipe_config->fec_enable);
}
 
+   pipe_config->infoframes.enable |=
+   intel_hdmi_infoframes_enabled(encoder, pipe_config);
+
break;
case TRANS_DDI_MODE_SELECT_DP_MST:
pipe_config->output_types |= BIT(INTEL_OUTPUT_DP_MST);
@@ -4309,6 +4312,9 @@ void intel_ddi_get_config(struct intel_encoder *encoder,

REG_FIELD_GET(TRANS_DDI_MST_TRANSPORT_SELECT_MASK, temp);
 
intel_dp_get_m_n(intel_crtc, pipe_config);
+
+   pipe_config->infoframes.enable |=
+   intel_hdmi_infoframes_enabled(encoder, pipe_config);
break;
default:
break;
@@ -4359,6 +4365,8 @@ void intel_ddi_get_config(struct intel_encoder *encoder,
intel_read_infoframe(encoder, pipe_config,
 HDMI_INFOFRAME_TYPE_DRM,
 _config->infoframes.drm);
+
+   intel_read_dp_sdp(encoder, pipe_config, 
HDMI_PACKET_TYPE_GAMUT_METADATA);
 }
 
 static enum intel_output_type
-- 
2.24.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v5 06/18] drm/i915/dp: Read out DP SDPs

2020-02-08 Thread Gwan-gyeong Mun
It adds code to read the DP SDPs from the video DIP and unpack them into
the crtc state.

It adds routines that read out DP VSC SDP and DP HDR Metadata Infoframe SDP
In order to unpack DP VSC SDP, it adds intel_dp_vsc_sdp_unpack() 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 unpack DP HDR Metadata Infoframe SDP, it adds
intel_dp_hdr_metadata_infoframe_sdp_unpack(). 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 naming rule and style of intel_read_dp_sdp() function references
intel_read_infoframe() function of intel_hdmi.c

v2: Minor style fix
v3: Replace a structure name to drm_dp_vsc_sdp from intel_dp_vsc_sdp
v4: Use struct drm_device logging macros
v5: Addressed review comments from Uma
  - Polish commit message and comments
  - Combine the if checks of sdp.HB2 and sdp.HB3
  - Add 6bpc to unpacking of VSC SDP

Signed-off-by: Gwan-gyeong Mun 
---
 drivers/gpu/drm/i915/display/intel_dp.c | 187 
 drivers/gpu/drm/i915/display/intel_dp.h |   3 +
 2 files changed, 190 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c 
b/drivers/gpu/drm/i915/display/intel_dp.c
index bc532cca125f..5a3ea3527fc3 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -4938,6 +4938,193 @@ void intel_dp_set_infoframes(struct intel_encoder 
*encoder,
intel_write_dp_sdp(encoder, crtc_state, 
HDMI_PACKET_TYPE_GAMUT_METADATA);
 }
 
+static int intel_dp_vsc_sdp_unpack(struct drm_dp_vsc_sdp *vsc,
+  const void *buffer, size_t size)
+{
+   const struct dp_sdp *sdp = buffer;
+
+   if (size < sizeof(struct dp_sdp))
+   return -EINVAL;
+
+   memset(vsc, 0, size);
+
+   if (sdp->sdp_header.HB0 != 0)
+   return -EINVAL;
+
+   if (sdp->sdp_header.HB1 != DP_SDP_VSC)
+   return -EINVAL;
+
+   vsc->sdp_type = sdp->sdp_header.HB1;
+   vsc->revision = sdp->sdp_header.HB2;
+   vsc->length = sdp->sdp_header.HB3;
+
+   if ((sdp->sdp_header.HB2 == 0x2 && sdp->sdp_header.HB3 == 0x8) ||
+   (sdp->sdp_header.HB2 == 0x4 && sdp->sdp_header.HB3 == 0xe)) {
+   /*
+* - HB2 = 0x2, HB3 = 0x8
+*   VSC SDP supporting 3D stereo + PSR
+* - HB2 = 0x4, HB3 = 0xe
+*   VSC SDP supporting 3D stereo + PSR2 with Y-coordinate of
+*   first scan line of the SU region (applies to eDP v1.4b
+*   and higher).
+*/
+   return 0;
+   } else if (sdp->sdp_header.HB2 == 0x5 && sdp->sdp_header.HB3 == 0x13) {
+   /*
+* - HB2 = 0x5, HB3 = 0x13
+*   VSC SDP supporting 3D stereo + PSR2 + Pixel 
Encoding/Colorimetry
+*   Format.
+*/
+   vsc->pixelformat = (sdp->db[16] >> 4) & 0xf;
+   vsc->colorimetry = sdp->db[16] & 0xf;
+   vsc->dynamic_range = (sdp->db[17] >> 7) & 0x1;
+
+   switch (sdp->db[17] & 0x7) {
+   case 0x0:
+   vsc->bpc = 6;
+   break;
+   case 0x1:
+   vsc->bpc = 8;
+   break;
+   case 0x2:
+   vsc->bpc = 10;
+   break;
+   case 0x3:
+   vsc->bpc = 12;
+   break;
+   case 0x4:
+   vsc->bpc = 16;
+   break;
+   default:
+   MISSING_CASE(sdp->db[17] & 0x7);
+   return -EINVAL;
+   }
+
+   vsc->content_type = sdp->db[18] & 0x7;
+   } else {
+   return -EINVAL;
+   }
+
+   return 0;
+}
+
+static int
+intel_dp_hdr_metadata_infoframe_sdp_unpack(struct hdmi_drm_infoframe 
*drm_infoframe,
+  const void *buffer, size_t size)
+{
+   int ret;
+
+   const struct dp_sdp *sdp = buffer;
+
+   if (size < sizeof(struct dp_sdp))
+   return -EINVAL;
+
+   if (sdp->sdp_header.HB0 != 0)
+   return -EINVAL;
+
+   if (sdp->sdp_header.HB1 != HDMI_INFOFRAME_TYPE_DRM)
+   return -EINVAL;
+
+   /*
+* Least Significant Eight Bits of (Data Byte Count – 1)
+* 1Dh (i.e., Data Byte Count = 30 bytes).
+*/
+   if (sdp->sdp_header.HB2 != 0x1D)
+   return -EINVAL;
+
+   /* Most Significant Two Bits of (Data Byte Count – 1), Clear to 00b. */
+   if ((sdp->sdp_header.HB3 & 0x3) != 0)
+   return -EINVAL;
+
+   /* INFOFRAME SDP Version Number */
+   if 

[PATCH v5 04/18] drm/i915/dp: Add writing of DP SDPs

2020-02-08 Thread Gwan-gyeong Mun
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 mechanism 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.
v4: Use struct drm_device logging macros
v5:
  - use intel_de_*() functions for register access
  - Addressed review comments from Uma
Polish commit message and comments
Add 6bpc to packing of VSC SDP

Signed-off-by: Gwan-gyeong Mun 
---
 drivers/gpu/drm/i915/display/intel_dp.c | 199 
 drivers/gpu/drm/i915/display/intel_dp.h |   3 +
 2 files changed, 202 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c 
b/drivers/gpu/drm/i915/display/intel_dp.c
index 472ce3203a09..bc532cca125f 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -4739,6 +4739,205 @@ 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->pixelformat & 0xf) << 4; /* DB16[7:4] */
+   sdp->db[16] |= vsc->colorimetry & 0xf; /* DB16[3:0] */
+
+   switch (vsc->bpc) {
+   case 6:
+   /* 6bpc: 0x0 */
+   break;
+   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 

[PATCH v5 03/18] drm/i915/dp: Add compute routine for DP HDR Metadata Infoframe SDP

2020-02-08 Thread Gwan-gyeong Mun
It stores computed dp hdr metadata infoframe sdp to infoframes.drm of
crtc state. It referenced intel_hdmi_compute_drm_infoframe().

While computing, we'll also fill out the infoframes.enable bitmask
appropriately.

v2: Wrap a long line.
v4: Use struct drm_device logging macros
v5: Fix typo [Uma]

Signed-off-by: Gwan-gyeong Mun 
Reviewed-by: Uma Shankar 
---
 drivers/gpu/drm/i915/display/intel_dp.c | 24 
 1 file changed, 24 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c 
b/drivers/gpu/drm/i915/display/intel_dp.c
index 499377bf2891..472ce3203a09 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -2469,6 +2469,29 @@ static void intel_dp_compute_vsc_sdp(struct intel_dp 
*intel_dp,
 _state->infoframes.vsc);
 }
 
+static void
+intel_dp_compute_hdr_metadata_infoframe_sdp(struct intel_dp *intel_dp,
+   struct intel_crtc_state *crtc_state,
+   const struct drm_connector_state 
*conn_state)
+{
+   int ret;
+   struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
+   struct hdmi_drm_infoframe *drm_infoframe = 
_state->infoframes.drm.drm;
+
+   if (!conn_state->hdr_output_metadata)
+   return;
+
+   ret = drm_hdmi_infoframe_set_hdr_metadata(drm_infoframe, conn_state);
+
+   if (ret) {
+   drm_dbg_kms(_priv->drm, "couldn't set HDR metadata in 
infoframe\n");
+   return;
+   }
+
+   crtc_state->infoframes.enable |=
+   intel_hdmi_infoframe_enable(HDMI_PACKET_TYPE_GAMUT_METADATA);
+}
+
 int
 intel_dp_compute_config(struct intel_encoder *encoder,
struct intel_crtc_state *pipe_config,
@@ -2575,6 +2598,7 @@ intel_dp_compute_config(struct intel_encoder *encoder,
 
intel_psr_compute_config(intel_dp, pipe_config);
intel_dp_compute_vsc_sdp(intel_dp, pipe_config, conn_state);
+   intel_dp_compute_hdr_metadata_infoframe_sdp(intel_dp, pipe_config, 
conn_state);
 
return 0;
 }
-- 
2.24.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v5 18/18] drm/i915/psr: Use new DP VSC SDP compute routine on PSR

2020-02-08 Thread Gwan-gyeong Mun
In order to use a common VSC SDP Colorimetry calculating code on PSR,
it uses a new psr vsc sdp compute routine.
Because PSR routine has its own scenario and timings of writing a VSC SDP,
the current PSR routine needs to have its own drm_dp_vsc_sdp structure
member variable on struct i915_psr.

In order to calculate colorimetry information, intel_psr_update()
function and intel_psr_enable() function extend a drm_connector_state
argument.

There are no changes to PSR mechanism.

v3: Replace a structure name to drm_dp_vsc_sdp from intel_dp_vsc_sdp
v4: Rebased

Signed-off-by: Gwan-gyeong Mun 
Reviewed-by: Uma Shankar 
---
 drivers/gpu/drm/i915/display/intel_ddi.c |  4 +-
 drivers/gpu/drm/i915/display/intel_psr.c | 54 +++-
 drivers/gpu/drm/i915/display/intel_psr.h |  6 ++-
 drivers/gpu/drm/i915/i915_drv.h  |  1 +
 4 files changed, 22 insertions(+), 43 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c 
b/drivers/gpu/drm/i915/display/intel_ddi.c
index a00433d9cdd1..d45122a5e8b5 100644
--- a/drivers/gpu/drm/i915/display/intel_ddi.c
+++ b/drivers/gpu/drm/i915/display/intel_ddi.c
@@ -3926,7 +3926,7 @@ static void intel_enable_ddi_dp(struct intel_encoder 
*encoder,
intel_dp_stop_link_train(intel_dp);
 
intel_edp_backlight_on(crtc_state, conn_state);
-   intel_psr_enable(intel_dp, crtc_state);
+   intel_psr_enable(intel_dp, crtc_state, conn_state);
intel_dp_set_infoframes(encoder, true, crtc_state, conn_state);
intel_edp_drrs_enable(intel_dp, crtc_state);
 
@@ -4094,7 +4094,7 @@ static void intel_ddi_update_pipe_dp(struct intel_encoder 
*encoder,
 
intel_ddi_set_dp_msa(crtc_state, conn_state);
 
-   intel_psr_update(intel_dp, crtc_state);
+   intel_psr_update(intel_dp, crtc_state, conn_state);
intel_dp_set_infoframes(encoder, true, crtc_state, conn_state);
intel_edp_drrs_enable(intel_dp, crtc_state);
 
diff --git a/drivers/gpu/drm/i915/display/intel_psr.c 
b/drivers/gpu/drm/i915/display/intel_psr.c
index db3d1561e9bf..953c0286307d 100644
--- a/drivers/gpu/drm/i915/display/intel_psr.c
+++ b/drivers/gpu/drm/i915/display/intel_psr.c
@@ -335,39 +335,6 @@ void intel_psr_init_dpcd(struct intel_dp *intel_dp)
}
 }
 
-static void intel_psr_setup_vsc(struct intel_dp *intel_dp,
-   const struct intel_crtc_state *crtc_state)
-{
-   struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
-   struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
-   struct dp_sdp psr_vsc;
-
-   if (dev_priv->psr.psr2_enabled) {
-   /* Prepare VSC Header for SU as per EDP 1.4 spec, Table 6.11 */
-   memset(_vsc, 0, sizeof(psr_vsc));
-   psr_vsc.sdp_header.HB0 = 0;
-   psr_vsc.sdp_header.HB1 = 0x7;
-   if (dev_priv->psr.colorimetry_support) {
-   psr_vsc.sdp_header.HB2 = 0x5;
-   psr_vsc.sdp_header.HB3 = 0x13;
-   } else {
-   psr_vsc.sdp_header.HB2 = 0x4;
-   psr_vsc.sdp_header.HB3 = 0xe;
-   }
-   } else {
-   /* Prepare VSC packet as per EDP 1.3 spec, Table 3.10 */
-   memset(_vsc, 0, sizeof(psr_vsc));
-   psr_vsc.sdp_header.HB0 = 0;
-   psr_vsc.sdp_header.HB1 = 0x7;
-   psr_vsc.sdp_header.HB2 = 0x2;
-   psr_vsc.sdp_header.HB3 = 0x8;
-   }
-
-   intel_dig_port->write_infoframe(_dig_port->base,
-   crtc_state,
-   DP_SDP_VSC, _vsc, sizeof(psr_vsc));
-}
-
 static void hsw_psr_setup_aux(struct intel_dp *intel_dp)
 {
struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
@@ -859,9 +826,12 @@ static void intel_psr_enable_source(struct intel_dp 
*intel_dp,
 }
 
 static void intel_psr_enable_locked(struct drm_i915_private *dev_priv,
-   const struct intel_crtc_state *crtc_state)
+   const struct intel_crtc_state *crtc_state,
+   const struct drm_connector_state 
*conn_state)
 {
struct intel_dp *intel_dp = dev_priv->psr.dp;
+   struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
+   struct intel_encoder *encoder = _dig_port->base;
u32 val;
 
drm_WARN_ON(_priv->drm, dev_priv->psr.enabled);
@@ -900,7 +870,9 @@ static void intel_psr_enable_locked(struct drm_i915_private 
*dev_priv,
 
drm_dbg_kms(_priv->drm, "Enabling PSR%s\n",
dev_priv->psr.psr2_enabled ? "2" : "1");
-   intel_psr_setup_vsc(intel_dp, crtc_state);
+   intel_dp_compute_psr_vsc_sdp(intel_dp, crtc_state, conn_state,
+_priv->psr.vsc);
+   intel_write_dp_vsc_sdp(encoder, crtc_state, _priv->psr.vsc);
intel_psr_enable_sink(intel_dp);

[PATCH v5 08/18] drm/i915: Include HDMI DRM infoframe in the crtc state dump

2020-02-08 Thread Gwan-gyeong Mun
Dump out the HDMI Dynamic Range and Mastering (DRM) infoframe in the
normal crtc state dump.

Signed-off-by: Gwan-gyeong Mun 
Reviewed-by: Uma Shankar 
---
 drivers/gpu/drm/i915/display/intel_display.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_display.c 
b/drivers/gpu/drm/i915/display/intel_display.c
index 368e481d45ee..66dbaab5867e 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -13158,6 +13158,9 @@ static void intel_dump_pipe_config(const struct 
intel_crtc_state *pipe_config,
if (pipe_config->infoframes.enable &
intel_hdmi_infoframe_enable(HDMI_INFOFRAME_TYPE_VENDOR))
intel_dump_infoframe(dev_priv, _config->infoframes.hdmi);
+   if (pipe_config->infoframes.enable &
+   intel_hdmi_infoframe_enable(HDMI_INFOFRAME_TYPE_DRM))
+   intel_dump_infoframe(dev_priv, _config->infoframes.drm);
 
drm_dbg_kms(_priv->drm, "requested mode:\n");
drm_mode_debug_printmodeline(_config->hw.mode);
-- 
2.24.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [Intel-gfx] [PATCH v3 11/17] drm/i915: Program DP SDPs with computed configs

2020-02-08 Thread Mun, Gwan-gyeong
On Wed, 2020-02-05 at 22:21 +0530, Shankar, Uma wrote:
> > -Original Message-
> > From: Intel-gfx  On Behalf
> > Of Gwan-
> > gyeong Mun
> > Sent: Tuesday, February 4, 2020 4:50 AM
> > To: intel-...@lists.freedesktop.org
> > Cc: linux-fb...@vger.kernel.org; dri-devel@lists.freedesktop.org
> > Subject: [Intel-gfx] [PATCH v3 11/17] drm/i915: Program DP SDPs
> > with computed
> > configs
> > 
> > In order to use computed config for DP SDPs (DP VSC SDP and DP HDR
> > Metadata
> > Infoframe SDP), it replaces intel_dp_vsc_enable() function and
> > intel_dp_hdr_metadata_enable() function to
> > intel_dp_set_infoframes() function.
> > 
> > Before applying it, routines of program SDP always calculated
> > configs when they
> > called. And it removes unused functions.
> 
> Fix the sentence, seems unclear.
> With that fixed,
Okay, I'll update with the condition of before / after.

> Reviewed-by: Uma Shankar 
> 
> > v3: Rebased
> > 
> > Signed-off-by: Gwan-gyeong Mun 
> > ---
> >  drivers/gpu/drm/i915/display/intel_ddi.c |   3 +-
> >  drivers/gpu/drm/i915/display/intel_dp.c  | 226 -
> > --
> >  drivers/gpu/drm/i915/display/intel_dp.h  |   6 -
> >  3 files changed, 1 insertion(+), 234 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c
> > b/drivers/gpu/drm/i915/display/intel_ddi.c
> > index c96f629cddc3..374ab6a3757c 100644
> > --- a/drivers/gpu/drm/i915/display/intel_ddi.c
> > +++ b/drivers/gpu/drm/i915/display/intel_ddi.c
> > @@ -3900,8 +3900,7 @@ static void intel_enable_ddi_dp(struct
> > intel_encoder
> > *encoder,
> > 
> > intel_edp_backlight_on(crtc_state, conn_state);
> > intel_psr_enable(intel_dp, crtc_state);
> > -   intel_dp_vsc_enable(intel_dp, crtc_state, conn_state);
> > -   intel_dp_hdr_metadata_enable(intel_dp, crtc_state, conn_state);
> > +   intel_dp_set_infoframes(encoder, true, crtc_state, conn_state);
> > intel_edp_drrs_enable(intel_dp, crtc_state);
> > 
> > if (crtc_state->has_audio)
> > diff --git a/drivers/gpu/drm/i915/display/intel_dp.c
> > b/drivers/gpu/drm/i915/display/intel_dp.c
> > index d4ece0a824c0..cffb77daec96 100644
> > --- a/drivers/gpu/drm/i915/display/intel_dp.c
> > +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> > @@ -5095,232 +5095,6 @@ void intel_read_dp_sdp(struct intel_encoder
> > *encoder,
> > }
> >  }
> > 
> > -static void
> > -intel_dp_setup_vsc_sdp(struct intel_dp *intel_dp,
> > -  const struct intel_crtc_state *crtc_state,
> > -  const struct drm_connector_state *conn_state)
> > -{
> > -   struct intel_digital_port *intel_dig_port =
> > dp_to_dig_port(intel_dp);
> > -   struct dp_sdp vsc_sdp = {};
> > -
> > -   /* Prepare VSC Header for SU as per DP 1.4a spec, Table 2-119
> > */
> > -   vsc_sdp.sdp_header.HB0 = 0;
> > -   vsc_sdp.sdp_header.HB1 = 0x7;
> > -
> > -   /*
> > -* VSC SDP supporting 3D stereo, PSR2, and Pixel Encoding/
> > -* Colorimetry Format indication.
> > -*/
> > -   vsc_sdp.sdp_header.HB2 = 0x5;
> > -
> > -   /*
> > -* VSC SDP supporting 3D stereo, + PSR2, + Pixel Encoding/
> > -* Colorimetry Format indication (HB2 = 05h).
> > -*/
> > -   vsc_sdp.sdp_header.HB3 = 0x13;
> > -
> > -   /* DP 1.4a spec, Table 2-120 */
> > -   switch (crtc_state->output_format) {
> > -   case INTEL_OUTPUT_FORMAT_YCBCR444:
> > -   vsc_sdp.db[16] = 0x1 << 4; /* YCbCr 444 : DB16[7:4] =
> > 1h */
> > -   break;
> > -   case INTEL_OUTPUT_FORMAT_YCBCR420:
> > -   vsc_sdp.db[16] = 0x3 << 4; /* YCbCr 420 : DB16[7:4] =
> > 3h */
> > -   break;
> > -   case INTEL_OUTPUT_FORMAT_RGB:
> > -   default:
> > -   /* RGB: DB16[7:4] = 0h */
> > -   break;
> > -   }
> > -
> > -   switch (conn_state->colorspace) {
> > -   case DRM_MODE_COLORIMETRY_BT709_YCC:
> > -   vsc_sdp.db[16] |= 0x1;
> > -   break;
> > -   case DRM_MODE_COLORIMETRY_XVYCC_601:
> > -   vsc_sdp.db[16] |= 0x2;
> > -   break;
> > -   case DRM_MODE_COLORIMETRY_XVYCC_709:
> > -   vsc_sdp.db[16] |= 0x3;
> > -   break;
> > -   case DRM_MODE_COLORIMETRY_SYCC_601:
> > -   vsc_sdp.db[16] |= 0x4;
> > -   break;
> > -   case DRM_MODE_COLORIMETRY_OPYCC_601:
> > -   vsc_sdp.db[16] |= 0x5;
> > -   break;
> > -   case DRM_MODE_COLORIMETRY_BT2020_CYCC:
> > -   case DRM_MODE_COLORIMETRY_BT2020_RGB:
> > -   vsc_sdp.db[16] |= 0x6;
> > -   break;
> > -   case DRM_MODE_COLORIMETRY_BT2020_YCC:
> > -   vsc_sdp.db[16] |= 0x7;
> > -   break;
> > -   case DRM_MODE_COLORIMETRY_DCI_P3_RGB_D65:
> > -   case DRM_MODE_COLORIMETRY_DCI_P3_RGB_THEATER:
> > -   vsc_sdp.db[16] |= 0x4; /* DCI-P3 (SMPTE RP 431-2) */
> > -   break;
> > -   default:
> > -   /* sRGB (IEC 61966-2-1) / ITU-R BT.601: DB16[0:3] = 0h
> > */
> > -
> > -   /* RGB->YCBCR color conversion uses the BT.709 color
> > space. */
> > -   if (crtc_state->output_format ==
> > 

Re: [PATCH v3 06/17] drm/i915/dp: Read out DP SDPs (Secondary Data Packet)

2020-02-08 Thread Mun, Gwan-gyeong
On Wed, 2020-02-05 at 21:59 +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-...@lists.freedesktop.org
> > Cc: linux-fb...@vger.kernel.org; dri-devel@lists.freedesktop.org
> > Subject: [PATCH v3 06/17] drm/i915/dp: Read out DP SDPs (Secondary
> > Data Packet)
> 
> Drop the content in bracket.
> 
> > It adds code to read the DP SDPs from the video DIP and unpack them
> > into the crtc
> > state.
> > 
> > It adds routines that read out DP VSC SDP and DP HDR Metadata
> > Infoframe SDP In
> > order to unpack DP VSC SDP, it adds intel_dp_vsc_sdp_unpack()
> > 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 unpack DP HDR Metadata Infoframe SDP, it adds
> > intel_dp_hdr_metadata_infoframe_sdp_unpack(). 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 nameing rule and style of intel_read_dp_sdp() function references
> 
> Typo in naming.
> 
> > intel_read_infoframe() function of intel_hdmi.c
> > 
> > v2: Minor style fix
> > v3: 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 | 170
> > 
> >  drivers/gpu/drm/i915/display/intel_dp.h |   3 +
> >  2 files changed, 173 insertions(+)
> > 
> > diff --git a/drivers/gpu/drm/i915/display/intel_dp.c
> > b/drivers/gpu/drm/i915/display/intel_dp.c
> > index dd7e5588001e..d4ece0a824c0 100644
> > --- a/drivers/gpu/drm/i915/display/intel_dp.c
> > +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> > @@ -4925,6 +4925,176 @@ void intel_dp_set_infoframes(struct
> > intel_encoder
> > *encoder,
> > intel_write_dp_sdp(encoder, crtc_state,
> > HDMI_PACKET_TYPE_GAMUT_METADATA);  }
> > 
> > +static int intel_dp_vsc_sdp_unpack(struct drm_dp_vsc_sdp *vsc,
> > +  const void *buffer, size_t size) {
> > +   const struct dp_sdp *sdp = buffer;
> > +
> > +   if (size < sizeof(struct dp_sdp))
> > +   return -EINVAL;
> > +
> > +   memset(vsc, 0, size);
> > +
> > +   if (sdp->sdp_header.HB0 != 0)
> > +   return -EINVAL;
> > +
> > +   if (sdp->sdp_header.HB1 != DP_SDP_VSC)
> > +   return -EINVAL;
> > +   vsc->sdp_type = sdp->sdp_header.HB1;
> > +
> > +   if (sdp->sdp_header.HB2 == 0x2 && sdp->sdp_header.HB3 == 0x8) {
> > +   vsc->revision = sdp->sdp_header.HB2;
> > +   vsc->length = sdp->sdp_header.HB3;
> > +   } else if (sdp->sdp_header.HB2 == 0x4 && sdp->sdp_header.HB3 ==
> > 0xe) {
> > +   vsc->revision = sdp->sdp_header.HB2;
> > +   vsc->length = sdp->sdp_header.HB3;
> > +   } else if (sdp->sdp_header.HB2 == 0x5 && sdp->sdp_header.HB3 ==
> > 0x13) {
> > +   vsc->revision = sdp->sdp_header.HB2;
> > +   vsc->length = sdp->sdp_header.HB3;
> 
> The above 2 lines can be done unconditionally, may be combine the if
> checks.
> 
> > +   vsc->colorspace = (sdp->db[16] >> 4) & 0xf;
> > +   vsc->colorimetry = sdp->db[16] & 0xf;
> > +   vsc->dynamic_range = (sdp->db[17] >> 7) & 0x1;
> > +
> > +   switch (sdp->db[17] & 0x7) {
> > +   case 0x1:
> > +   vsc->bpc = 8;
> > +   break;
> > +   case 0x2:
> > +   vsc->bpc = 10;
> > +   break;
> > +   case 0x3:
> > +   vsc->bpc = 12;
> > +   break;
> > +   case 0x4:
> > +   vsc->bpc = 16;
> > +   break;
> > +   default:
> > +   MISSING_CASE(sdp->db[17] & 0x7);
> 
> Handle 6bpc case as well.
> 
Yes,  I'll update everything that you commented.
> > +   return -EINVAL;
> > +   }
> > +
> > +   vsc->content_type = sdp->db[18] & 0x7;
> > +   } else {
> > +   return -EINVAL;
> > +   }
> > +
> > +   return 0;
> > +}
> > +
> > +static int
> > +intel_dp_hdr_metadata_infoframe_sdp_unpack(struct
> > hdmi_drm_infoframe
> > *drm_infoframe,
> > +  const void *buffer, size_t
> > size) {
> > +   int ret;
> > +
> > +   const struct dp_sdp *sdp = buffer;
> > +
> > +   if (size < sizeof(struct dp_sdp))
> > +   return -EINVAL;
> > +
> > +   if (sdp->sdp_header.HB0 != 0)
> > +   return -EINVAL;
> > +
> > +   if (sdp->sdp_header.HB1 != HDMI_INFOFRAME_TYPE_DRM)
> > +   return -EINVAL;
> > +
> > +   /*
> > +* Least Significant Eight Bits of (Data Byte Count – 1)
> > +* 1Dh (i.e., Data Byte Count = 30 bytes).
> > +*/
> > +   if (sdp->sdp_header.HB2 != 0x1D)
> > +   return -EINVAL;
> > +
> > +  

Re: [PATCH v3 04/17] drm/i915/dp: Add writing of DP SDPs (Secondary Data Packet)

2020-02-08 Thread Mun, Gwan-gyeong
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-...@lists.freedesktop.org
> > Cc: linux-fb...@vger.kernel.org; dri-devel@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: [PATCH v3 01/17] drm: add DP 1.4 VSC SDP Payload related enums and a structure

2020-02-08 Thread Mun, Gwan-gyeong
On Wed, 2020-02-05 at 20:12 +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-...@lists.freedesktop.org
> > Cc: linux-fb...@vger.kernel.org; dri-devel@lists.freedesktop.org
> > Subject: [PATCH v3 01/17] drm: add DP 1.4 VSC SDP Payload related
> > enums and a
> > structure
> 
> %s/add/Add/
> Also you can rephrase this as " Add DP1.4 VSC SDP Payload related
> Data Structures"/
> 
Hi Uma,
Thank you for reviewing a patch series.

Okay I'll rephrase commit message with your guide.

> > It adds new enumeration definitions for VSC SDP Payload for Pixel
> > Encoding/Colorimetry Format.
> > And it adds a new drm data structure for DP VSC SDP.
> > 
> > enum dp_colorspace and enum dp_colorimetry correspond "Pixel
> > Encoding and
> > Colorimetry Formats". enum dp_dynamic_range corresponds "Dynamic
> > Range".
> > And enum dp_content_type corresponds "Content Type"
> > All of them are based on DP 1.4 spec [Table 2-117: VSC SDP Payload
> > for
> > DB16 through DB18].
> > 
> > v3: Add a new drm data structure for DP VSC SDP
> > 
> > Signed-off-by: Gwan-gyeong Mun 
> > ---
> >  include/drm/drm_dp_helper.h | 57
> > +
> >  1 file changed, 57 insertions(+)
> > 
> > diff --git a/include/drm/drm_dp_helper.h
> > b/include/drm/drm_dp_helper.h index
> > 262faf9e5e94..c098727681fa 100644
> > --- a/include/drm/drm_dp_helper.h
> > +++ b/include/drm/drm_dp_helper.h
> > @@ -1209,6 +1209,63 @@ struct dp_sdp {
> >  #define EDP_VSC_PSR_UPDATE_RFB (1<<1)
> >  #define EDP_VSC_PSR_CRC_VALUES_VALID   (1<<2)
> > 
> > +/* Based on DP 1.4 spec [Table 2-117: VSC SDP Payload for DB16
> > through
> > +DB18] */ enum dp_colorspace {
> 
> We should not call this colorspace, rather rename it to
> dp_pixelformat.
> These are not colorspaces.
> 
> Also add these to kernel docs as they are standard definitions.
> 
> > +   DP_COLORSPACE_RGB = 0,
> 
> Make this as DP_PIXELFORMAT_RGB and rename all the below ones as
> well.
> 
> > +   DP_COLORSPACE_YUV444 = 0x1,
> > +   DP_COLORSPACE_YUV422 = 0x2,
> > +   DP_COLORSPACE_YUV420 = 0x3,
> > +   DP_COLORSPACE_Y_ONLY = 0x4,
> > +   DP_COLORSPACE_RAW = 0x5,
> > +   DP_COLORSPACE_RESERVED = 0x6,
> > +};
> > +
> > +/**
> > + * Based on DP 1.4 spec [Table 2-117: VSC SDP Payload for DB16
> > through
> > +DB18]
> > + * and a name of enum member followes DRM_MODE_COLORIMETRY
> > definition.
> 
> Typo in follows
> 
> > + */
> > +enum dp_colorimetry {
> 
> You can call this as dp_colorspace (this is actual colorspace), you
> can stick with colorimetry as well.
> Will leave that to you.
Yes, the DP spec uses colorimetry as the term, I prefer colorimetry.
> 
> > +   DP_COLORIMETRY_DEFAULT = 0, /* sRGB (IEC 61966-2-1) / ITU-R
> > BT.601 */
> > +   DP_COLORIMETRY_RGB_WIDE_FIXED = 0x1,
> > +   DP_COLORIMETRY_BT709_YCC = 0x1,
> > +   DP_COLORIMETRY_RGB_WIDE_FLOAT = 0x2,
> > +   DP_COLORIMETRY_XVYCC_601 = 0x2,
> > +   DP_COLORIMETRY_OPRGB = 0x3,
> > +   DP_COLORIMETRY_XVYCC_709 = 0x3,
> > +   DP_COLORIMETRY_DCI_P3_RGB = 0x4,
> > +   DP_COLORIMETRY_SYCC_601 = 0x4,
> > +   DP_COLORIMETRY_RGB_CUSTOM = 0x5,
> > +   DP_COLORIMETRY_OPYCC_601 = 0x5,
> > +   DP_COLORIMETRY_BT2020_RGB = 0x6,
> > +   DP_COLORIMETRY_BT2020_CYCC = 0x6,
> > +   DP_COLORIMETRY_BT2020_YCC = 0x7,
> > +};
> > +
> > +enum dp_dynamic_range {
> > +   DP_DYNAMIC_RANGE_VESA = 0,
> > +   DP_DYNAMIC_RANGE_CTA = 1,
> > +};
> > +
> > +enum dp_content_type {
> > +   DP_CONTENT_TYPE_NOT_DEFINED = 0x00,
> > +   DP_CONTENT_TYPE_GRAPHICS = 0x01,
> > +   DP_CONTENT_TYPE_PHOTO = 0x02,
> > +   DP_CONTENT_TYPE_VIDEO = 0x03,
> > +   DP_CONTENT_TYPE_GAME = 0x04,
> > +};
> > +
> > +/* DRM DP VSC SDP as per DP 1.4 spec */ struct drm_dp_vsc_sdp {
> > +   unsigned char sdp_type; /* Secondary-data Packet Type */
> > +   unsigned char revision; /* Revision Number */
> 
> These comments seems self-explanatory, you can probably drop them.
> 
Thank you for review in detail, I'll update everything that you commented.
> > +   unsigned char length; /* Number of Valid Data Bytes */
> > +   enum dp_colorspace colorspace;
> > +   enum dp_colorimetry colorimetry;
> > +   int bpc; /* bit per color */
> > +   enum dp_dynamic_range dynamic_range;
> > +   enum dp_content_type content_type;
> > +};
> > +
> >  int drm_dp_psr_setup_time(const u8
> > psr_cap[EDP_PSR_RECEIVER_CAP_SIZE]);
> > 
> >  static inline int
> > --
> > 2.24.1
> > 
> > ___
> > dri-devel mailing list
> > dri-devel@lists.freedesktop.org
> > https://lists.freedesktop.org/mailman/listinfo/dri-devel
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v5] arm64: dts: qcom: sc7180: Add A618 gpu dt blob

2020-02-08 Thread Sharat Masetty
This patch adds the required dt nodes and properties
to enabled A618 GPU.

Signed-off-by: Sharat Masetty 
---
 arch/arm64/boot/dts/qcom/sc7180.dtsi | 102 +++
 1 file changed, 102 insertions(+)

diff --git a/arch/arm64/boot/dts/qcom/sc7180.dtsi 
b/arch/arm64/boot/dts/qcom/sc7180.dtsi
index f3fcc5c..5cdcbce 100644
--- a/arch/arm64/boot/dts/qcom/sc7180.dtsi
+++ b/arch/arm64/boot/dts/qcom/sc7180.dtsi
@@ -1043,6 +1043,108 @@
};
};
 
+   gpu: gpu@500 {
+   compatible = "qcom,adreno-618.0", "qcom,adreno";
+   #stream-id-cells = <16>;
+   reg = <0 0x0500 0 0x4>, <0 0x0509e000 0 0x1000>,
+   <0 0x05061000 0 0x800>;
+   reg-names = "kgsl_3d0_reg_memory", "cx_mem", "cx_dbgc";
+   interrupts = ;
+   iommus = <_smmu 0>;
+   operating-points-v2 = <_opp_table>;
+   qcom,gmu = <>;
+
+   gpu_opp_table: opp-table {
+   compatible = "operating-points-v2";
+
+   opp-8 {
+   opp-hz = /bits/ 64 <8>;
+   opp-level = 
;
+   };
+
+   opp-65000 {
+   opp-hz = /bits/ 64 <65000>;
+   opp-level = 
;
+   };
+
+   opp-56500 {
+   opp-hz = /bits/ 64 <56500>;
+   opp-level = ;
+   };
+
+   opp-43000 {
+   opp-hz = /bits/ 64 <43000>;
+   opp-level = 
;
+   };
+
+   opp-35500 {
+   opp-hz = /bits/ 64 <35500>;
+   opp-level = ;
+   };
+
+   opp-26700 {
+   opp-hz = /bits/ 64 <26700>;
+   opp-level = 
;
+   };
+
+   opp-18000 {
+   opp-hz = /bits/ 64 <18000>;
+   opp-level = 
;
+   };
+   };
+   };
+
+   adreno_smmu: iommu@504 {
+   compatible = "qcom,sc7180-smmu-v2", "qcom,smmu-v2";
+   reg = <0 0x0504 0 0x1>;
+   #iommu-cells = <1>;
+   #global-interrupts = <2>;
+   interrupts = ,
+   ,
+   ,
+   ,
+   ,
+   ,
+   ,
+   ,
+   ,
+   ;
+   clocks = < GCC_GPU_MEMNOC_GFX_CLK>,
+   < GCC_GPU_CFG_AHB_CLK>,
+   < GCC_DDRSS_GPU_AXI_CLK>;
+
+   clock-names = "bus", "iface", "mem_iface_clk";
+   power-domains = < CX_GDSC>;
+   };
+
+   gmu: gmu@506a000 {
+   compatible="qcom,adreno-gmu-618.0", "qcom,adreno-gmu";
+   reg = <0 0x0506a000 0 0x31000>, <0 0x0b29 0 
0x1>,
+   <0 0x0b49 0 0x1>;
+   reg-names = "gmu", "gmu_pdc", "gmu_pdc_seq";
+   interrupts = ,
+  ;
+   interrupt-names = "hfi", "gmu";
+   clocks = < GPU_CC_CX_GMU_CLK>,
+  < GPU_CC_CXO_CLK>,
+  < GCC_DDRSS_GPU_AXI_CLK>,
+  < GCC_GPU_MEMNOC_GFX_CLK>;
+   clock-names = "gmu", "cxo", "axi", "memnoc";
+   power-domains = < CX_GDSC>, <0>;
+   power-domain-names = "cx", "gx";
+   iommus = <_smmu 5>;
+   operating-points-v2 = <_opp_table>;
+
+   gmu_opp_table: opp-table {
+   compatible = "operating-points-v2";
+
+   opp-2 {
+   opp-hz = /bits/ 64 <2>;
+   opp-level = 
;
+  

[PATCH v5] sc7180: Add A618 GPU bindings

2020-02-08 Thread Sharat Masetty
I used this branch qcom/arm64-for-5.6-to-be-rebased as suggested by Matthias.
This patch needs the clock patches and the clock patches have not yet landed, so
please apply the following series and patches in order

a) All patches from 
https://patchwork.kernel.org/project/linux-clk/list/?series=203517=%2a=both
b) Patches 1 and 2 from 
https://patchwork.kernel.org/project/linux-clk/list/?series=203527=both=%2a
c) All patches from 
https://patchwork.kernel.org/project/linux-clk/list/?series=221739=both=%2a
d) 
https://lore.kernel.org/linux-arm-msm/20200124144154.v2.10.I1a4b93fb005791e29a9dcf288fc8bd459a555a59%40changeid/raw
e) This patch "arm64: dts: qcom: sc7180: Add A618 gpu dt blob"

v3: Addressed review comments from previous submits. Also removed the
interconnect bindings from this patch and I will submit as a new patch with its
dependencies listed. Also I will be sending a new patch for updating the
bindings documentation.

v4: Add GX_GDSC power domain binding for GMU

v5: Change to a dummy GX_GDSC binding for faster landing

Sharat Masetty (1):
  arm64: dts: qcom: sc7180: Add A618 gpu dt blob

 arch/arm64/boot/dts/qcom/sc7180.dtsi | 102 +++
 1 file changed, 102 insertions(+)

--
1.9.1
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH v2 3/4] thermal: devfreq_cooling: Refactor code and switch to use Energy Model

2020-02-08 Thread kbuild test robot
Hi,

I love your patch! Perhaps something to improve:

[auto build test WARNING on pm/linux-next]
[also build test WARNING on linus/master next-20200207]
[cannot apply to tip/sched/core linux/master v5.5]
[if your patch is applied to the wrong git tree, please drop us a note to help
improve the system. BTW, we also suggest to use '--base' option to specify the
base tree in git format-patch, please see https://stackoverflow.com/a/37406982]

url:
https://github.com/0day-ci/linux/commits/lukasz-luba-arm-com/Add-support-for-devices-in-the-Energy-Model/20200208-123516
base:   https://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git 
linux-next
config: sparc-allyesconfig (attached as .config)
compiler: sparc64-linux-gcc (GCC) 7.5.0
reproduce:
wget 
https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O 
~/bin/make.cross
chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
GCC_VERSION=7.5.0 make.cross ARCH=sparc 

If you fix the issue, kindly add following tag
Reported-by: kbuild test robot 

All warnings (new ones prefixed by >>):

   In file included from include/linux/devfreq_cooling.h:21:0,
from drivers/thermal/devfreq_cooling.c:14:
   drivers/thermal/devfreq_cooling.c: In function 'freq_get_state':
>> include/linux/thermal.h:24:32: warning: overflow in implicit constant 
>> conversion [-Woverflow]
#define THERMAL_CSTATE_INVALID -1UL
   ^
>> drivers/thermal/devfreq_cooling.c:207:9: note: in expansion of macro 
>> 'THERMAL_CSTATE_INVALID'
 return THERMAL_CSTATE_INVALID;
^~
--
   In file included from include/linux/devfreq_cooling.h:21:0,
from drivers//thermal/devfreq_cooling.c:14:
   drivers//thermal/devfreq_cooling.c: In function 'freq_get_state':
>> include/linux/thermal.h:24:32: warning: overflow in implicit constant 
>> conversion [-Woverflow]
#define THERMAL_CSTATE_INVALID -1UL
   ^
   drivers//thermal/devfreq_cooling.c:207:9: note: in expansion of macro 
'THERMAL_CSTATE_INVALID'
 return THERMAL_CSTATE_INVALID;
^~

vim +24 include/linux/thermal.h

23064088d6aea04 Durgadoss R 2012-09-18  22  
57df8106932b574 Zhang Rui   2013-02-08  23  /* invalid cooling state */
57df8106932b574 Zhang Rui   2013-02-08 @24  #define THERMAL_CSTATE_INVALID -1UL
57df8106932b574 Zhang Rui   2013-02-08  25  

:: The code at line 24 was first introduced by commit
:: 57df8106932b57427df1eaaa13871857f75b1194 Thermal: exynos: fix cooling 
state translation

:: TO: Zhang Rui 
:: CC: Zhang Rui 

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-...@lists.01.org


.config.gz
Description: application/gzip
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH v2 3/4] thermal: devfreq_cooling: Refactor code and switch to use Energy Model

2020-02-08 Thread kbuild test robot
Hi,

I love your patch! Perhaps something to improve:

[auto build test WARNING on pm/linux-next]
[also build test WARNING on linus/master next-20200207]
[cannot apply to tip/sched/core linux/master v5.5]
[if your patch is applied to the wrong git tree, please drop us a note to help
improve the system. BTW, we also suggest to use '--base' option to specify the
base tree in git format-patch, please see https://stackoverflow.com/a/37406982]

url:
https://github.com/0day-ci/linux/commits/lukasz-luba-arm-com/Add-support-for-devices-in-the-Energy-Model/20200208-123516
base:   https://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git 
linux-next
config: x86_64-randconfig-a003-20200208 (attached as .config)
compiler: gcc-4.9 (Debian 4.9.2-10+deb8u1) 4.9.2
reproduce:
# save the attached .config to linux build tree
make ARCH=x86_64 

If you fix the issue, kindly add following tag
Reported-by: kbuild test robot 

All warnings (new ones prefixed by >>):

   drivers/thermal/devfreq_cooling.c: In function 'freq_get_state':
>> drivers/thermal/devfreq_cooling.c:207:2: warning: overflow in implicit 
>> constant conversion [-Woverflow]
 return THERMAL_CSTATE_INVALID;
 ^

vim +207 drivers/thermal/devfreq_cooling.c

a76caf55e5b356b Ørjan Eide  2015-09-10  188  
a76caf55e5b356b Ørjan Eide  2015-09-10  189  /**
ed9aa27ba36cc93 Lukasz Luba 2020-02-06  190   * freq_get_state() - get the 
performance index corresponding to a frequency
a76caf55e5b356b Ørjan Eide  2015-09-10  191   * @dfc:   Pointer to devfreq 
cooling device
ed9aa27ba36cc93 Lukasz Luba 2020-02-06  192   * @freq:  frequency in kHz
a76caf55e5b356b Ørjan Eide  2015-09-10  193   *
ed9aa27ba36cc93 Lukasz Luba 2020-02-06  194   * Return: the performance index 
associated with the @freq, or
a76caf55e5b356b Ørjan Eide  2015-09-10  195   * THERMAL_CSTATE_INVALID if it 
wasn't found.
a76caf55e5b356b Ørjan Eide  2015-09-10  196   */
ed9aa27ba36cc93 Lukasz Luba 2020-02-06  197  static int
a76caf55e5b356b Ørjan Eide  2015-09-10  198  freq_get_state(struct 
devfreq_cooling_device *dfc, unsigned long freq)
a76caf55e5b356b Ørjan Eide  2015-09-10  199  {
a76caf55e5b356b Ørjan Eide  2015-09-10  200 int i;
a76caf55e5b356b Ørjan Eide  2015-09-10  201  
ed9aa27ba36cc93 Lukasz Luba 2020-02-06  202 for (i = 0; i <= 
dfc->max_level; i++) {
ed9aa27ba36cc93 Lukasz Luba 2020-02-06  203 if 
(dfc->em->table[i].frequency == freq)
a76caf55e5b356b Ørjan Eide  2015-09-10  204 return i;
a76caf55e5b356b Ørjan Eide  2015-09-10  205 }
a76caf55e5b356b Ørjan Eide  2015-09-10  206  
a76caf55e5b356b Ørjan Eide  2015-09-10 @207 return THERMAL_CSTATE_INVALID;
a76caf55e5b356b Ørjan Eide  2015-09-10  208  }
a76caf55e5b356b Ørjan Eide  2015-09-10  209  

:: The code at line 207 was first introduced by commit
:: a76caf55e5b356ba20a5a43ac4d9f7a04b20941d thermal: Add devfreq cooling

:: TO: Ørjan Eide 
:: CC: Eduardo Valentin 

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-...@lists.01.org


.config.gz
Description: application/gzip
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel