[PATCH v5 11/18] 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. 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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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)
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)
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
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
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
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
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
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