diff options
27 files changed, 91 insertions, 66 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c index 4cfecdce29a3..1f0426d2fc2a 100644 --- a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c +++ b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c | |||
@@ -1682,7 +1682,7 @@ static void dce_v10_0_afmt_setmode(struct drm_encoder *encoder, | |||
1682 | dce_v10_0_audio_write_sad_regs(encoder); | 1682 | dce_v10_0_audio_write_sad_regs(encoder); |
1683 | dce_v10_0_audio_write_latency_fields(encoder, mode); | 1683 | dce_v10_0_audio_write_latency_fields(encoder, mode); |
1684 | 1684 | ||
1685 | err = drm_hdmi_avi_infoframe_from_display_mode(&frame, mode, false); | 1685 | err = drm_hdmi_avi_infoframe_from_display_mode(&frame, connector, mode); |
1686 | if (err < 0) { | 1686 | if (err < 0) { |
1687 | DRM_ERROR("failed to setup AVI infoframe: %zd\n", err); | 1687 | DRM_ERROR("failed to setup AVI infoframe: %zd\n", err); |
1688 | return; | 1688 | return; |
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c index 7c868916d90f..2280b971d758 100644 --- a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c +++ b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c | |||
@@ -1724,7 +1724,7 @@ static void dce_v11_0_afmt_setmode(struct drm_encoder *encoder, | |||
1724 | dce_v11_0_audio_write_sad_regs(encoder); | 1724 | dce_v11_0_audio_write_sad_regs(encoder); |
1725 | dce_v11_0_audio_write_latency_fields(encoder, mode); | 1725 | dce_v11_0_audio_write_latency_fields(encoder, mode); |
1726 | 1726 | ||
1727 | err = drm_hdmi_avi_infoframe_from_display_mode(&frame, mode, false); | 1727 | err = drm_hdmi_avi_infoframe_from_display_mode(&frame, connector, mode); |
1728 | if (err < 0) { | 1728 | if (err < 0) { |
1729 | DRM_ERROR("failed to setup AVI infoframe: %zd\n", err); | 1729 | DRM_ERROR("failed to setup AVI infoframe: %zd\n", err); |
1730 | return; | 1730 | return; |
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c index 17eaaba36017..db443ec53d3a 100644 --- a/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c +++ b/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c | |||
@@ -1423,6 +1423,7 @@ static void dce_v6_0_audio_set_avi_infoframe(struct drm_encoder *encoder, | |||
1423 | struct amdgpu_device *adev = dev->dev_private; | 1423 | struct amdgpu_device *adev = dev->dev_private; |
1424 | struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); | 1424 | struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); |
1425 | struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv; | 1425 | struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv; |
1426 | struct drm_connector *connector = amdgpu_get_connector_for_encoder(encoder); | ||
1426 | struct hdmi_avi_infoframe frame; | 1427 | struct hdmi_avi_infoframe frame; |
1427 | u8 buffer[HDMI_INFOFRAME_HEADER_SIZE + HDMI_AVI_INFOFRAME_SIZE]; | 1428 | u8 buffer[HDMI_INFOFRAME_HEADER_SIZE + HDMI_AVI_INFOFRAME_SIZE]; |
1428 | uint8_t *payload = buffer + 3; | 1429 | uint8_t *payload = buffer + 3; |
@@ -1430,7 +1431,7 @@ static void dce_v6_0_audio_set_avi_infoframe(struct drm_encoder *encoder, | |||
1430 | ssize_t err; | 1431 | ssize_t err; |
1431 | u32 tmp; | 1432 | u32 tmp; |
1432 | 1433 | ||
1433 | err = drm_hdmi_avi_infoframe_from_display_mode(&frame, mode, false); | 1434 | err = drm_hdmi_avi_infoframe_from_display_mode(&frame, connector, mode); |
1434 | if (err < 0) { | 1435 | if (err < 0) { |
1435 | DRM_ERROR("failed to setup AVI infoframe: %zd\n", err); | 1436 | DRM_ERROR("failed to setup AVI infoframe: %zd\n", err); |
1436 | return; | 1437 | return; |
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c index 8c0576978d36..13da915991dd 100644 --- a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c +++ b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c | |||
@@ -1616,7 +1616,7 @@ static void dce_v8_0_afmt_setmode(struct drm_encoder *encoder, | |||
1616 | dce_v8_0_audio_write_sad_regs(encoder); | 1616 | dce_v8_0_audio_write_sad_regs(encoder); |
1617 | dce_v8_0_audio_write_latency_fields(encoder, mode); | 1617 | dce_v8_0_audio_write_latency_fields(encoder, mode); |
1618 | 1618 | ||
1619 | err = drm_hdmi_avi_infoframe_from_display_mode(&frame, mode, false); | 1619 | err = drm_hdmi_avi_infoframe_from_display_mode(&frame, connector, mode); |
1620 | if (err < 0) { | 1620 | if (err < 0) { |
1621 | DRM_ERROR("failed to setup AVI infoframe: %zd\n", err); | 1621 | DRM_ERROR("failed to setup AVI infoframe: %zd\n", err); |
1622 | return; | 1622 | return; |
diff --git a/drivers/gpu/drm/bridge/analogix-anx78xx.c b/drivers/gpu/drm/bridge/analogix-anx78xx.c index f8433c93f463..e11309e9bc4f 100644 --- a/drivers/gpu/drm/bridge/analogix-anx78xx.c +++ b/drivers/gpu/drm/bridge/analogix-anx78xx.c | |||
@@ -1094,8 +1094,9 @@ static void anx78xx_bridge_mode_set(struct drm_bridge *bridge, | |||
1094 | 1094 | ||
1095 | mutex_lock(&anx78xx->lock); | 1095 | mutex_lock(&anx78xx->lock); |
1096 | 1096 | ||
1097 | err = drm_hdmi_avi_infoframe_from_display_mode(&frame, adjusted_mode, | 1097 | err = drm_hdmi_avi_infoframe_from_display_mode(&frame, |
1098 | false); | 1098 | &anx78xx->connector, |
1099 | adjusted_mode); | ||
1099 | if (err) { | 1100 | if (err) { |
1100 | DRM_ERROR("Failed to setup AVI infoframe: %d\n", err); | 1101 | DRM_ERROR("Failed to setup AVI infoframe: %d\n", err); |
1101 | goto unlock; | 1102 | goto unlock; |
diff --git a/drivers/gpu/drm/bridge/sii902x.c b/drivers/gpu/drm/bridge/sii902x.c index bfa902013aa4..a9b4f45ae87c 100644 --- a/drivers/gpu/drm/bridge/sii902x.c +++ b/drivers/gpu/drm/bridge/sii902x.c | |||
@@ -258,7 +258,8 @@ static void sii902x_bridge_mode_set(struct drm_bridge *bridge, | |||
258 | if (ret) | 258 | if (ret) |
259 | return; | 259 | return; |
260 | 260 | ||
261 | ret = drm_hdmi_avi_infoframe_from_display_mode(&frame, adj, false); | 261 | ret = drm_hdmi_avi_infoframe_from_display_mode(&frame, |
262 | &sii902x->connector, adj); | ||
262 | if (ret < 0) { | 263 | if (ret < 0) { |
263 | DRM_ERROR("couldn't fill AVI infoframe\n"); | 264 | DRM_ERROR("couldn't fill AVI infoframe\n"); |
264 | return; | 265 | return; |
diff --git a/drivers/gpu/drm/bridge/sil-sii8620.c b/drivers/gpu/drm/bridge/sil-sii8620.c index a6e8f4591e63..0cc293a6ac24 100644 --- a/drivers/gpu/drm/bridge/sil-sii8620.c +++ b/drivers/gpu/drm/bridge/sil-sii8620.c | |||
@@ -1104,8 +1104,7 @@ static void sii8620_set_infoframes(struct sii8620 *ctx, | |||
1104 | int ret; | 1104 | int ret; |
1105 | 1105 | ||
1106 | ret = drm_hdmi_avi_infoframe_from_display_mode(&frm.avi, | 1106 | ret = drm_hdmi_avi_infoframe_from_display_mode(&frm.avi, |
1107 | mode, | 1107 | NULL, mode); |
1108 | true); | ||
1109 | if (ctx->use_packed_pixel) | 1108 | if (ctx->use_packed_pixel) |
1110 | frm.avi.colorspace = HDMI_COLORSPACE_YUV422; | 1109 | frm.avi.colorspace = HDMI_COLORSPACE_YUV422; |
1111 | 1110 | ||
diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c index 64c3cf027518..88b720b63126 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | |||
@@ -1344,7 +1344,8 @@ static void hdmi_config_AVI(struct dw_hdmi *hdmi, struct drm_display_mode *mode) | |||
1344 | u8 val; | 1344 | u8 val; |
1345 | 1345 | ||
1346 | /* Initialise info frame from DRM mode */ | 1346 | /* Initialise info frame from DRM mode */ |
1347 | drm_hdmi_avi_infoframe_from_display_mode(&frame, mode, false); | 1347 | drm_hdmi_avi_infoframe_from_display_mode(&frame, |
1348 | &hdmi->connector, mode); | ||
1348 | 1349 | ||
1349 | if (hdmi_bus_fmt_is_yuv444(hdmi->hdmi_data.enc_out_bus_format)) | 1350 | if (hdmi_bus_fmt_is_yuv444(hdmi->hdmi_data.enc_out_bus_format)) |
1350 | frame.colorspace = HDMI_COLORSPACE_YUV444; | 1351 | frame.colorspace = HDMI_COLORSPACE_YUV444; |
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c index b506e3622b08..cd25bd08bf53 100644 --- a/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c | |||
@@ -4830,19 +4830,32 @@ void drm_set_preferred_mode(struct drm_connector *connector, | |||
4830 | } | 4830 | } |
4831 | EXPORT_SYMBOL(drm_set_preferred_mode); | 4831 | EXPORT_SYMBOL(drm_set_preferred_mode); |
4832 | 4832 | ||
4833 | static bool is_hdmi2_sink(struct drm_connector *connector) | ||
4834 | { | ||
4835 | /* | ||
4836 | * FIXME: sil-sii8620 doesn't have a connector around when | ||
4837 | * we need one, so we have to be prepared for a NULL connector. | ||
4838 | */ | ||
4839 | if (!connector) | ||
4840 | return true; | ||
4841 | |||
4842 | return connector->display_info.hdmi.scdc.supported || | ||
4843 | connector->display_info.color_formats & DRM_COLOR_FORMAT_YCRCB420; | ||
4844 | } | ||
4845 | |||
4833 | /** | 4846 | /** |
4834 | * drm_hdmi_avi_infoframe_from_display_mode() - fill an HDMI AVI infoframe with | 4847 | * drm_hdmi_avi_infoframe_from_display_mode() - fill an HDMI AVI infoframe with |
4835 | * data from a DRM display mode | 4848 | * data from a DRM display mode |
4836 | * @frame: HDMI AVI infoframe | 4849 | * @frame: HDMI AVI infoframe |
4850 | * @connector: the connector | ||
4837 | * @mode: DRM display mode | 4851 | * @mode: DRM display mode |
4838 | * @is_hdmi2_sink: Sink is HDMI 2.0 compliant | ||
4839 | * | 4852 | * |
4840 | * Return: 0 on success or a negative error code on failure. | 4853 | * Return: 0 on success or a negative error code on failure. |
4841 | */ | 4854 | */ |
4842 | int | 4855 | int |
4843 | drm_hdmi_avi_infoframe_from_display_mode(struct hdmi_avi_infoframe *frame, | 4856 | drm_hdmi_avi_infoframe_from_display_mode(struct hdmi_avi_infoframe *frame, |
4844 | const struct drm_display_mode *mode, | 4857 | struct drm_connector *connector, |
4845 | bool is_hdmi2_sink) | 4858 | const struct drm_display_mode *mode) |
4846 | { | 4859 | { |
4847 | enum hdmi_picture_aspect picture_aspect; | 4860 | enum hdmi_picture_aspect picture_aspect; |
4848 | int err; | 4861 | int err; |
@@ -4864,7 +4877,7 @@ drm_hdmi_avi_infoframe_from_display_mode(struct hdmi_avi_infoframe *frame, | |||
4864 | * HDMI 2.0 VIC range: 1 <= VIC <= 107 (CEA-861-F). So we | 4877 | * HDMI 2.0 VIC range: 1 <= VIC <= 107 (CEA-861-F). So we |
4865 | * have to make sure we dont break HDMI 1.4 sinks. | 4878 | * have to make sure we dont break HDMI 1.4 sinks. |
4866 | */ | 4879 | */ |
4867 | if (!is_hdmi2_sink && frame->video_code > 64) | 4880 | if (!is_hdmi2_sink(connector) && frame->video_code > 64) |
4868 | frame->video_code = 0; | 4881 | frame->video_code = 0; |
4869 | 4882 | ||
4870 | /* | 4883 | /* |
@@ -4923,21 +4936,17 @@ EXPORT_SYMBOL(drm_hdmi_avi_infoframe_from_display_mode); | |||
4923 | * drm_hdmi_avi_infoframe_quant_range() - fill the HDMI AVI infoframe | 4936 | * drm_hdmi_avi_infoframe_quant_range() - fill the HDMI AVI infoframe |
4924 | * quantization range information | 4937 | * quantization range information |
4925 | * @frame: HDMI AVI infoframe | 4938 | * @frame: HDMI AVI infoframe |
4939 | * @connector: the connector | ||
4926 | * @mode: DRM display mode | 4940 | * @mode: DRM display mode |
4927 | * @rgb_quant_range: RGB quantization range (Q) | 4941 | * @rgb_quant_range: RGB quantization range (Q) |
4928 | * @rgb_quant_range_selectable: Sink support selectable RGB quantization range (QS) | 4942 | * @rgb_quant_range_selectable: Sink support selectable RGB quantization range (QS) |
4929 | * @is_hdmi2_sink: HDMI 2.0 sink, which has different default recommendations | ||
4930 | * | ||
4931 | * Note that @is_hdmi2_sink can be derived by looking at the | ||
4932 | * &drm_scdc.supported flag stored in &drm_hdmi_info.scdc, | ||
4933 | * &drm_display_info.hdmi, which can be found in &drm_connector.display_info. | ||
4934 | */ | 4943 | */ |
4935 | void | 4944 | void |
4936 | drm_hdmi_avi_infoframe_quant_range(struct hdmi_avi_infoframe *frame, | 4945 | drm_hdmi_avi_infoframe_quant_range(struct hdmi_avi_infoframe *frame, |
4946 | struct drm_connector *connector, | ||
4937 | const struct drm_display_mode *mode, | 4947 | const struct drm_display_mode *mode, |
4938 | enum hdmi_quantization_range rgb_quant_range, | 4948 | enum hdmi_quantization_range rgb_quant_range, |
4939 | bool rgb_quant_range_selectable, | 4949 | bool rgb_quant_range_selectable) |
4940 | bool is_hdmi2_sink) | ||
4941 | { | 4950 | { |
4942 | /* | 4951 | /* |
4943 | * CEA-861: | 4952 | * CEA-861: |
@@ -4968,7 +4977,7 @@ drm_hdmi_avi_infoframe_quant_range(struct hdmi_avi_infoframe *frame, | |||
4968 | * we limit non-zero YQ to HDMI 2.0 sinks only as HDMI 2.0 is based | 4977 | * we limit non-zero YQ to HDMI 2.0 sinks only as HDMI 2.0 is based |
4969 | * on on CEA-861-F. | 4978 | * on on CEA-861-F. |
4970 | */ | 4979 | */ |
4971 | if (!is_hdmi2_sink || | 4980 | if (!is_hdmi2_sink(connector) || |
4972 | rgb_quant_range == HDMI_QUANTIZATION_RANGE_LIMITED) | 4981 | rgb_quant_range == HDMI_QUANTIZATION_RANGE_LIMITED) |
4973 | frame->ycc_quantization_range = | 4982 | frame->ycc_quantization_range = |
4974 | HDMI_YCC_QUANTIZATION_RANGE_LIMITED; | 4983 | HDMI_YCC_QUANTIZATION_RANGE_LIMITED; |
diff --git a/drivers/gpu/drm/exynos/exynos_hdmi.c b/drivers/gpu/drm/exynos/exynos_hdmi.c index 2092a650df7d..b857df67aff0 100644 --- a/drivers/gpu/drm/exynos/exynos_hdmi.c +++ b/drivers/gpu/drm/exynos/exynos_hdmi.c | |||
@@ -819,7 +819,8 @@ static void hdmi_reg_infoframes(struct hdmi_context *hdata) | |||
819 | return; | 819 | return; |
820 | } | 820 | } |
821 | 821 | ||
822 | ret = drm_hdmi_avi_infoframe_from_display_mode(&frm.avi, m, false); | 822 | ret = drm_hdmi_avi_infoframe_from_display_mode(&frm.avi, |
823 | &hdata->connector, m); | ||
823 | if (!ret) | 824 | if (!ret) |
824 | ret = hdmi_avi_infoframe_pack(&frm.avi, buf, sizeof(buf)); | 825 | ret = hdmi_avi_infoframe_pack(&frm.avi, buf, sizeof(buf)); |
825 | if (ret > 0) { | 826 | if (ret > 0) { |
diff --git a/drivers/gpu/drm/i2c/tda998x_drv.c b/drivers/gpu/drm/i2c/tda998x_drv.c index a7c39f39793f..38c66fbc8276 100644 --- a/drivers/gpu/drm/i2c/tda998x_drv.c +++ b/drivers/gpu/drm/i2c/tda998x_drv.c | |||
@@ -849,7 +849,8 @@ tda998x_write_avi(struct tda998x_priv *priv, struct drm_display_mode *mode) | |||
849 | { | 849 | { |
850 | union hdmi_infoframe frame; | 850 | union hdmi_infoframe frame; |
851 | 851 | ||
852 | drm_hdmi_avi_infoframe_from_display_mode(&frame.avi, mode, false); | 852 | drm_hdmi_avi_infoframe_from_display_mode(&frame.avi, |
853 | &priv->connector, mode); | ||
853 | frame.avi.quantization_range = HDMI_QUANTIZATION_RANGE_FULL; | 854 | frame.avi.quantization_range = HDMI_QUANTIZATION_RANGE_FULL; |
854 | 855 | ||
855 | tda998x_write_if(priv, DIP_IF_FLAGS_IF2, REG_IF2_HB0, &frame); | 856 | tda998x_write_if(priv, DIP_IF_FLAGS_IF2, REG_IF2_HB0, &frame); |
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c index e2c6a2b3e8f2..8a260bd6954c 100644 --- a/drivers/gpu/drm/i915/intel_hdmi.c +++ b/drivers/gpu/drm/i915/intel_hdmi.c | |||
@@ -465,15 +465,12 @@ static void intel_hdmi_set_avi_infoframe(struct intel_encoder *encoder, | |||
465 | struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base); | 465 | struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base); |
466 | const struct drm_display_mode *adjusted_mode = | 466 | const struct drm_display_mode *adjusted_mode = |
467 | &crtc_state->base.adjusted_mode; | 467 | &crtc_state->base.adjusted_mode; |
468 | struct drm_connector *connector = &intel_hdmi->attached_connector->base; | ||
469 | bool is_hdmi2_sink = connector->display_info.hdmi.scdc.supported || | ||
470 | connector->display_info.color_formats & DRM_COLOR_FORMAT_YCRCB420; | ||
471 | union hdmi_infoframe frame; | 468 | union hdmi_infoframe frame; |
472 | int ret; | 469 | int ret; |
473 | 470 | ||
474 | ret = drm_hdmi_avi_infoframe_from_display_mode(&frame.avi, | 471 | ret = drm_hdmi_avi_infoframe_from_display_mode(&frame.avi, |
475 | adjusted_mode, | 472 | conn_state->connector, |
476 | is_hdmi2_sink); | 473 | adjusted_mode); |
477 | if (ret < 0) { | 474 | if (ret < 0) { |
478 | DRM_ERROR("couldn't fill AVI infoframe\n"); | 475 | DRM_ERROR("couldn't fill AVI infoframe\n"); |
479 | return; | 476 | return; |
@@ -486,12 +483,13 @@ static void intel_hdmi_set_avi_infoframe(struct intel_encoder *encoder, | |||
486 | else | 483 | else |
487 | frame.avi.colorspace = HDMI_COLORSPACE_RGB; | 484 | frame.avi.colorspace = HDMI_COLORSPACE_RGB; |
488 | 485 | ||
489 | drm_hdmi_avi_infoframe_quant_range(&frame.avi, adjusted_mode, | 486 | drm_hdmi_avi_infoframe_quant_range(&frame.avi, |
487 | conn_state->connector, | ||
488 | adjusted_mode, | ||
490 | crtc_state->limited_color_range ? | 489 | crtc_state->limited_color_range ? |
491 | HDMI_QUANTIZATION_RANGE_LIMITED : | 490 | HDMI_QUANTIZATION_RANGE_LIMITED : |
492 | HDMI_QUANTIZATION_RANGE_FULL, | 491 | HDMI_QUANTIZATION_RANGE_FULL, |
493 | intel_hdmi->rgb_quant_range_selectable, | 492 | intel_hdmi->rgb_quant_range_selectable); |
494 | is_hdmi2_sink); | ||
495 | 493 | ||
496 | drm_hdmi_avi_infoframe_content_type(&frame.avi, | 494 | drm_hdmi_avi_infoframe_content_type(&frame.avi, |
497 | conn_state); | 495 | conn_state); |
diff --git a/drivers/gpu/drm/i915/intel_lspcon.c b/drivers/gpu/drm/i915/intel_lspcon.c index 96a8d9524b0c..c18f14d41f1d 100644 --- a/drivers/gpu/drm/i915/intel_lspcon.c +++ b/drivers/gpu/drm/i915/intel_lspcon.c | |||
@@ -462,10 +462,8 @@ void lspcon_set_infoframes(struct intel_encoder *encoder, | |||
462 | uint8_t buf[VIDEO_DIP_DATA_SIZE]; | 462 | uint8_t buf[VIDEO_DIP_DATA_SIZE]; |
463 | struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base); | 463 | struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base); |
464 | struct intel_lspcon *lspcon = &dig_port->lspcon; | 464 | struct intel_lspcon *lspcon = &dig_port->lspcon; |
465 | struct intel_dp *intel_dp = &dig_port->dp; | 465 | const struct drm_display_mode *adjusted_mode = |
466 | struct drm_connector *connector = &intel_dp->attached_connector->base; | 466 | &crtc_state->base.adjusted_mode; |
467 | const struct drm_display_mode *mode = &crtc_state->base.adjusted_mode; | ||
468 | bool is_hdmi2_sink = connector->display_info.hdmi.scdc.supported; | ||
469 | 467 | ||
470 | if (!lspcon->active) { | 468 | if (!lspcon->active) { |
471 | DRM_ERROR("Writing infoframes while LSPCON disabled ?\n"); | 469 | DRM_ERROR("Writing infoframes while LSPCON disabled ?\n"); |
@@ -473,7 +471,8 @@ void lspcon_set_infoframes(struct intel_encoder *encoder, | |||
473 | } | 471 | } |
474 | 472 | ||
475 | ret = drm_hdmi_avi_infoframe_from_display_mode(&frame.avi, | 473 | ret = drm_hdmi_avi_infoframe_from_display_mode(&frame.avi, |
476 | mode, is_hdmi2_sink); | 474 | conn_state->connector, |
475 | adjusted_mode); | ||
477 | if (ret < 0) { | 476 | if (ret < 0) { |
478 | DRM_ERROR("couldn't fill AVI infoframe\n"); | 477 | DRM_ERROR("couldn't fill AVI infoframe\n"); |
479 | return; | 478 | return; |
@@ -488,11 +487,13 @@ void lspcon_set_infoframes(struct intel_encoder *encoder, | |||
488 | frame.avi.colorspace = HDMI_COLORSPACE_RGB; | 487 | frame.avi.colorspace = HDMI_COLORSPACE_RGB; |
489 | } | 488 | } |
490 | 489 | ||
491 | drm_hdmi_avi_infoframe_quant_range(&frame.avi, mode, | 490 | drm_hdmi_avi_infoframe_quant_range(&frame.avi, |
491 | conn_state->connector, | ||
492 | adjusted_mode, | ||
492 | crtc_state->limited_color_range ? | 493 | crtc_state->limited_color_range ? |
493 | HDMI_QUANTIZATION_RANGE_LIMITED : | 494 | HDMI_QUANTIZATION_RANGE_LIMITED : |
494 | HDMI_QUANTIZATION_RANGE_FULL, | 495 | HDMI_QUANTIZATION_RANGE_FULL, |
495 | false, is_hdmi2_sink); | 496 | false); |
496 | 497 | ||
497 | ret = hdmi_infoframe_pack(&frame, buf, sizeof(buf)); | 498 | ret = hdmi_infoframe_pack(&frame, buf, sizeof(buf)); |
498 | if (ret < 0) { | 499 | if (ret < 0) { |
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c index 5805ec1aba12..1277d31adb54 100644 --- a/drivers/gpu/drm/i915/intel_sdvo.c +++ b/drivers/gpu/drm/i915/intel_sdvo.c | |||
@@ -981,7 +981,8 @@ static bool intel_sdvo_write_infoframe(struct intel_sdvo *intel_sdvo, | |||
981 | } | 981 | } |
982 | 982 | ||
983 | static bool intel_sdvo_set_avi_infoframe(struct intel_sdvo *intel_sdvo, | 983 | static bool intel_sdvo_set_avi_infoframe(struct intel_sdvo *intel_sdvo, |
984 | const struct intel_crtc_state *pipe_config) | 984 | const struct intel_crtc_state *pipe_config, |
985 | const struct drm_connector_state *conn_state) | ||
985 | { | 986 | { |
986 | uint8_t sdvo_data[HDMI_INFOFRAME_SIZE(AVI)]; | 987 | uint8_t sdvo_data[HDMI_INFOFRAME_SIZE(AVI)]; |
987 | union hdmi_infoframe frame; | 988 | union hdmi_infoframe frame; |
@@ -989,8 +990,8 @@ static bool intel_sdvo_set_avi_infoframe(struct intel_sdvo *intel_sdvo, | |||
989 | ssize_t len; | 990 | ssize_t len; |
990 | 991 | ||
991 | ret = drm_hdmi_avi_infoframe_from_display_mode(&frame.avi, | 992 | ret = drm_hdmi_avi_infoframe_from_display_mode(&frame.avi, |
992 | &pipe_config->base.adjusted_mode, | 993 | conn_state->connector, |
993 | false); | 994 | &pipe_config->base.adjusted_mode); |
994 | if (ret < 0) { | 995 | if (ret < 0) { |
995 | DRM_ERROR("couldn't fill AVI infoframe\n"); | 996 | DRM_ERROR("couldn't fill AVI infoframe\n"); |
996 | return false; | 997 | return false; |
@@ -1316,7 +1317,8 @@ static void intel_sdvo_pre_enable(struct intel_encoder *intel_encoder, | |||
1316 | intel_sdvo_set_encode(intel_sdvo, SDVO_ENCODE_HDMI); | 1317 | intel_sdvo_set_encode(intel_sdvo, SDVO_ENCODE_HDMI); |
1317 | intel_sdvo_set_colorimetry(intel_sdvo, | 1318 | intel_sdvo_set_colorimetry(intel_sdvo, |
1318 | SDVO_COLORIMETRY_RGB256); | 1319 | SDVO_COLORIMETRY_RGB256); |
1319 | intel_sdvo_set_avi_infoframe(intel_sdvo, crtc_state); | 1320 | intel_sdvo_set_avi_infoframe(intel_sdvo, |
1321 | crtc_state, conn_state); | ||
1320 | } else | 1322 | } else |
1321 | intel_sdvo_set_encode(intel_sdvo, SDVO_ENCODE_DVI); | 1323 | intel_sdvo_set_encode(intel_sdvo, SDVO_ENCODE_DVI); |
1322 | 1324 | ||
diff --git a/drivers/gpu/drm/mediatek/mtk_hdmi.c b/drivers/gpu/drm/mediatek/mtk_hdmi.c index 862f3ec22131..f3ef7bf80563 100644 --- a/drivers/gpu/drm/mediatek/mtk_hdmi.c +++ b/drivers/gpu/drm/mediatek/mtk_hdmi.c | |||
@@ -981,7 +981,8 @@ static int mtk_hdmi_setup_avi_infoframe(struct mtk_hdmi *hdmi, | |||
981 | u8 buffer[17]; | 981 | u8 buffer[17]; |
982 | ssize_t err; | 982 | ssize_t err; |
983 | 983 | ||
984 | err = drm_hdmi_avi_infoframe_from_display_mode(&frame, mode, false); | 984 | err = drm_hdmi_avi_infoframe_from_display_mode(&frame, |
985 | &hdmi->conn, mode); | ||
985 | if (err < 0) { | 986 | if (err < 0) { |
986 | dev_err(hdmi->dev, | 987 | dev_err(hdmi->dev, |
987 | "Failed to get AVI infoframe from mode: %zd\n", err); | 988 | "Failed to get AVI infoframe from mode: %zd\n", err); |
diff --git a/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c b/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c index 7e357077ed26..5ed4cab2819f 100644 --- a/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c +++ b/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c | |||
@@ -101,7 +101,8 @@ static void msm_hdmi_config_avi_infoframe(struct hdmi *hdmi) | |||
101 | u32 val; | 101 | u32 val; |
102 | int len; | 102 | int len; |
103 | 103 | ||
104 | drm_hdmi_avi_infoframe_from_display_mode(&frame.avi, mode, false); | 104 | drm_hdmi_avi_infoframe_from_display_mode(&frame.avi, |
105 | hdmi->connector, mode); | ||
105 | 106 | ||
106 | len = hdmi_infoframe_pack(&frame, buffer, sizeof(buffer)); | 107 | len = hdmi_infoframe_pack(&frame, buffer, sizeof(buffer)); |
107 | if (len < 0) { | 108 | if (len < 0) { |
diff --git a/drivers/gpu/drm/nouveau/dispnv50/disp.c b/drivers/gpu/drm/nouveau/dispnv50/disp.c index 4a56841958c8..f36146d4d9b7 100644 --- a/drivers/gpu/drm/nouveau/dispnv50/disp.c +++ b/drivers/gpu/drm/nouveau/dispnv50/disp.c | |||
@@ -554,7 +554,7 @@ nv50_hdmi_enable(struct drm_encoder *encoder, struct drm_display_mode *mode) | |||
554 | u32 max_ac_packet; | 554 | u32 max_ac_packet; |
555 | union hdmi_infoframe avi_frame; | 555 | union hdmi_infoframe avi_frame; |
556 | union hdmi_infoframe vendor_frame; | 556 | union hdmi_infoframe vendor_frame; |
557 | bool scdc_supported, high_tmds_clock_ratio = false, scrambling = false; | 557 | bool high_tmds_clock_ratio = false, scrambling = false; |
558 | u8 config; | 558 | u8 config; |
559 | int ret; | 559 | int ret; |
560 | int size; | 560 | int size; |
@@ -564,10 +564,9 @@ nv50_hdmi_enable(struct drm_encoder *encoder, struct drm_display_mode *mode) | |||
564 | return; | 564 | return; |
565 | 565 | ||
566 | hdmi = &nv_connector->base.display_info.hdmi; | 566 | hdmi = &nv_connector->base.display_info.hdmi; |
567 | scdc_supported = hdmi->scdc.supported; | ||
568 | 567 | ||
569 | ret = drm_hdmi_avi_infoframe_from_display_mode(&avi_frame.avi, mode, | 568 | ret = drm_hdmi_avi_infoframe_from_display_mode(&avi_frame.avi, |
570 | scdc_supported); | 569 | &nv_connector->base, mode); |
571 | if (!ret) { | 570 | if (!ret) { |
572 | /* We have an AVI InfoFrame, populate it to the display */ | 571 | /* We have an AVI InfoFrame, populate it to the display */ |
573 | args.pwr.avi_infoframe_length | 572 | args.pwr.avi_infoframe_length |
diff --git a/drivers/gpu/drm/omapdrm/omap_encoder.c b/drivers/gpu/drm/omapdrm/omap_encoder.c index 452e625f6ce3..4566e0a75cb8 100644 --- a/drivers/gpu/drm/omapdrm/omap_encoder.c +++ b/drivers/gpu/drm/omapdrm/omap_encoder.c | |||
@@ -128,8 +128,8 @@ static void omap_encoder_mode_set(struct drm_encoder *encoder, | |||
128 | if (hdmi_mode && dssdev->ops->hdmi.set_infoframe) { | 128 | if (hdmi_mode && dssdev->ops->hdmi.set_infoframe) { |
129 | struct hdmi_avi_infoframe avi; | 129 | struct hdmi_avi_infoframe avi; |
130 | 130 | ||
131 | r = drm_hdmi_avi_infoframe_from_display_mode(&avi, adjusted_mode, | 131 | r = drm_hdmi_avi_infoframe_from_display_mode(&avi, connector, |
132 | false); | 132 | adjusted_mode); |
133 | if (r == 0) | 133 | if (r == 0) |
134 | dssdev->ops->hdmi.set_infoframe(dssdev, &avi); | 134 | dssdev->ops->hdmi.set_infoframe(dssdev, &avi); |
135 | } | 135 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_audio.c b/drivers/gpu/drm/radeon/radeon_audio.c index 770e31f5fd1b..5a7d48339b32 100644 --- a/drivers/gpu/drm/radeon/radeon_audio.c +++ b/drivers/gpu/drm/radeon/radeon_audio.c | |||
@@ -516,7 +516,7 @@ static int radeon_audio_set_avi_packet(struct drm_encoder *encoder, | |||
516 | if (!connector) | 516 | if (!connector) |
517 | return -EINVAL; | 517 | return -EINVAL; |
518 | 518 | ||
519 | err = drm_hdmi_avi_infoframe_from_display_mode(&frame, mode, false); | 519 | err = drm_hdmi_avi_infoframe_from_display_mode(&frame, connector, mode); |
520 | if (err < 0) { | 520 | if (err < 0) { |
521 | DRM_ERROR("failed to setup AVI infoframe: %d\n", err); | 521 | DRM_ERROR("failed to setup AVI infoframe: %d\n", err); |
522 | return err; | 522 | return err; |
diff --git a/drivers/gpu/drm/rockchip/inno_hdmi.c b/drivers/gpu/drm/rockchip/inno_hdmi.c index 1c02b3e61299..27c945e030a0 100644 --- a/drivers/gpu/drm/rockchip/inno_hdmi.c +++ b/drivers/gpu/drm/rockchip/inno_hdmi.c | |||
@@ -295,7 +295,9 @@ static int inno_hdmi_config_video_avi(struct inno_hdmi *hdmi, | |||
295 | union hdmi_infoframe frame; | 295 | union hdmi_infoframe frame; |
296 | int rc; | 296 | int rc; |
297 | 297 | ||
298 | rc = drm_hdmi_avi_infoframe_from_display_mode(&frame.avi, mode, false); | 298 | rc = drm_hdmi_avi_infoframe_from_display_mode(&frame.avi, |
299 | &hdmi->connector, | ||
300 | mode); | ||
299 | 301 | ||
300 | if (hdmi->hdmi_data.enc_out_format == HDMI_COLORSPACE_YUV444) | 302 | if (hdmi->hdmi_data.enc_out_format == HDMI_COLORSPACE_YUV444) |
301 | frame.avi.colorspace = HDMI_COLORSPACE_YUV444; | 303 | frame.avi.colorspace = HDMI_COLORSPACE_YUV444; |
diff --git a/drivers/gpu/drm/sti/sti_hdmi.c b/drivers/gpu/drm/sti/sti_hdmi.c index ccf718404a1c..4b86878f8ddf 100644 --- a/drivers/gpu/drm/sti/sti_hdmi.c +++ b/drivers/gpu/drm/sti/sti_hdmi.c | |||
@@ -434,7 +434,8 @@ static int hdmi_avi_infoframe_config(struct sti_hdmi *hdmi) | |||
434 | 434 | ||
435 | DRM_DEBUG_DRIVER("\n"); | 435 | DRM_DEBUG_DRIVER("\n"); |
436 | 436 | ||
437 | ret = drm_hdmi_avi_infoframe_from_display_mode(&infoframe, mode, false); | 437 | ret = drm_hdmi_avi_infoframe_from_display_mode(&infoframe, |
438 | hdmi->drm_connector, mode); | ||
438 | if (ret < 0) { | 439 | if (ret < 0) { |
439 | DRM_ERROR("failed to setup AVI infoframe: %d\n", ret); | 440 | DRM_ERROR("failed to setup AVI infoframe: %d\n", ret); |
440 | return ret; | 441 | return ret; |
diff --git a/drivers/gpu/drm/sun4i/sun4i_hdmi_enc.c b/drivers/gpu/drm/sun4i/sun4i_hdmi_enc.c index 061d2e0d9011..554a6f4561f3 100644 --- a/drivers/gpu/drm/sun4i/sun4i_hdmi_enc.c +++ b/drivers/gpu/drm/sun4i/sun4i_hdmi_enc.c | |||
@@ -52,7 +52,8 @@ static int sun4i_hdmi_setup_avi_infoframes(struct sun4i_hdmi *hdmi, | |||
52 | u8 buffer[17]; | 52 | u8 buffer[17]; |
53 | int i, ret; | 53 | int i, ret; |
54 | 54 | ||
55 | ret = drm_hdmi_avi_infoframe_from_display_mode(&frame, mode, false); | 55 | ret = drm_hdmi_avi_infoframe_from_display_mode(&frame, |
56 | &hdmi->connector, mode); | ||
56 | if (ret < 0) { | 57 | if (ret < 0) { |
57 | DRM_ERROR("Failed to get infoframes from mode\n"); | 58 | DRM_ERROR("Failed to get infoframes from mode\n"); |
58 | return ret; | 59 | return ret; |
diff --git a/drivers/gpu/drm/tegra/hdmi.c b/drivers/gpu/drm/tegra/hdmi.c index 0082468f703c..a7566c67bfb0 100644 --- a/drivers/gpu/drm/tegra/hdmi.c +++ b/drivers/gpu/drm/tegra/hdmi.c | |||
@@ -741,7 +741,8 @@ static void tegra_hdmi_setup_avi_infoframe(struct tegra_hdmi *hdmi, | |||
741 | u8 buffer[17]; | 741 | u8 buffer[17]; |
742 | ssize_t err; | 742 | ssize_t err; |
743 | 743 | ||
744 | err = drm_hdmi_avi_infoframe_from_display_mode(&frame, mode, false); | 744 | err = drm_hdmi_avi_infoframe_from_display_mode(&frame, |
745 | &hdmi->output.connector, mode); | ||
745 | if (err < 0) { | 746 | if (err < 0) { |
746 | dev_err(hdmi->dev, "failed to setup AVI infoframe: %zd\n", err); | 747 | dev_err(hdmi->dev, "failed to setup AVI infoframe: %zd\n", err); |
747 | return; | 748 | return; |
diff --git a/drivers/gpu/drm/tegra/sor.c b/drivers/gpu/drm/tegra/sor.c index b129da2e5afd..d90bf5f6a67a 100644 --- a/drivers/gpu/drm/tegra/sor.c +++ b/drivers/gpu/drm/tegra/sor.c | |||
@@ -2116,7 +2116,8 @@ tegra_sor_hdmi_setup_avi_infoframe(struct tegra_sor *sor, | |||
2116 | value &= ~INFOFRAME_CTRL_ENABLE; | 2116 | value &= ~INFOFRAME_CTRL_ENABLE; |
2117 | tegra_sor_writel(sor, value, SOR_HDMI_AVI_INFOFRAME_CTRL); | 2117 | tegra_sor_writel(sor, value, SOR_HDMI_AVI_INFOFRAME_CTRL); |
2118 | 2118 | ||
2119 | err = drm_hdmi_avi_infoframe_from_display_mode(&frame, mode, false); | 2119 | err = drm_hdmi_avi_infoframe_from_display_mode(&frame, |
2120 | &sor->output.connector, mode); | ||
2120 | if (err < 0) { | 2121 | if (err < 0) { |
2121 | dev_err(sor->dev, "failed to setup AVI infoframe: %d\n", err); | 2122 | dev_err(sor->dev, "failed to setup AVI infoframe: %d\n", err); |
2122 | return err; | 2123 | return err; |
diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c index 2f276222e30f..4f9a80f7f242 100644 --- a/drivers/gpu/drm/vc4/vc4_hdmi.c +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c | |||
@@ -424,18 +424,19 @@ static void vc4_hdmi_set_avi_infoframe(struct drm_encoder *encoder) | |||
424 | union hdmi_infoframe frame; | 424 | union hdmi_infoframe frame; |
425 | int ret; | 425 | int ret; |
426 | 426 | ||
427 | ret = drm_hdmi_avi_infoframe_from_display_mode(&frame.avi, mode, false); | 427 | ret = drm_hdmi_avi_infoframe_from_display_mode(&frame.avi, |
428 | hdmi->connector, mode); | ||
428 | if (ret < 0) { | 429 | if (ret < 0) { |
429 | DRM_ERROR("couldn't fill AVI infoframe\n"); | 430 | DRM_ERROR("couldn't fill AVI infoframe\n"); |
430 | return; | 431 | return; |
431 | } | 432 | } |
432 | 433 | ||
433 | drm_hdmi_avi_infoframe_quant_range(&frame.avi, mode, | 434 | drm_hdmi_avi_infoframe_quant_range(&frame.avi, |
435 | hdmi->connector, mode, | ||
434 | vc4_encoder->limited_rgb_range ? | 436 | vc4_encoder->limited_rgb_range ? |
435 | HDMI_QUANTIZATION_RANGE_LIMITED : | 437 | HDMI_QUANTIZATION_RANGE_LIMITED : |
436 | HDMI_QUANTIZATION_RANGE_FULL, | 438 | HDMI_QUANTIZATION_RANGE_FULL, |
437 | vc4_encoder->rgb_range_selectable, | 439 | vc4_encoder->rgb_range_selectable); |
438 | false); | ||
439 | 440 | ||
440 | frame.avi.right_bar = cstate->tv.margins.right; | 441 | frame.avi.right_bar = cstate->tv.margins.right; |
441 | frame.avi.left_bar = cstate->tv.margins.left; | 442 | frame.avi.left_bar = cstate->tv.margins.left; |
diff --git a/drivers/gpu/drm/zte/zx_hdmi.c b/drivers/gpu/drm/zte/zx_hdmi.c index 78655269d843..9fc98bb4f3d9 100644 --- a/drivers/gpu/drm/zte/zx_hdmi.c +++ b/drivers/gpu/drm/zte/zx_hdmi.c | |||
@@ -125,7 +125,9 @@ static int zx_hdmi_config_video_avi(struct zx_hdmi *hdmi, | |||
125 | union hdmi_infoframe frame; | 125 | union hdmi_infoframe frame; |
126 | int ret; | 126 | int ret; |
127 | 127 | ||
128 | ret = drm_hdmi_avi_infoframe_from_display_mode(&frame.avi, mode, false); | 128 | ret = drm_hdmi_avi_infoframe_from_display_mode(&frame.avi, |
129 | &hdmi->connector, | ||
130 | mode); | ||
129 | if (ret) { | 131 | if (ret) { |
130 | DRM_DEV_ERROR(hdmi->dev, "failed to get avi infoframe: %d\n", | 132 | DRM_DEV_ERROR(hdmi->dev, "failed to get avi infoframe: %d\n", |
131 | ret); | 133 | ret); |
diff --git a/include/drm/drm_edid.h b/include/drm/drm_edid.h index e3c404833115..9db6f130df65 100644 --- a/include/drm/drm_edid.h +++ b/include/drm/drm_edid.h | |||
@@ -352,18 +352,18 @@ drm_load_edid_firmware(struct drm_connector *connector) | |||
352 | 352 | ||
353 | int | 353 | int |
354 | drm_hdmi_avi_infoframe_from_display_mode(struct hdmi_avi_infoframe *frame, | 354 | drm_hdmi_avi_infoframe_from_display_mode(struct hdmi_avi_infoframe *frame, |
355 | const struct drm_display_mode *mode, | 355 | struct drm_connector *connector, |
356 | bool is_hdmi2_sink); | 356 | const struct drm_display_mode *mode); |
357 | int | 357 | int |
358 | drm_hdmi_vendor_infoframe_from_display_mode(struct hdmi_vendor_infoframe *frame, | 358 | drm_hdmi_vendor_infoframe_from_display_mode(struct hdmi_vendor_infoframe *frame, |
359 | struct drm_connector *connector, | 359 | struct drm_connector *connector, |
360 | const struct drm_display_mode *mode); | 360 | const struct drm_display_mode *mode); |
361 | void | 361 | void |
362 | drm_hdmi_avi_infoframe_quant_range(struct hdmi_avi_infoframe *frame, | 362 | drm_hdmi_avi_infoframe_quant_range(struct hdmi_avi_infoframe *frame, |
363 | struct drm_connector *connector, | ||
363 | const struct drm_display_mode *mode, | 364 | const struct drm_display_mode *mode, |
364 | enum hdmi_quantization_range rgb_quant_range, | 365 | enum hdmi_quantization_range rgb_quant_range, |
365 | bool rgb_quant_range_selectable, | 366 | bool rgb_quant_range_selectable); |
366 | bool is_hdmi2_sink); | ||
367 | 367 | ||
368 | /** | 368 | /** |
369 | * drm_eld_mnl - Get ELD monitor name length in bytes. | 369 | * drm_eld_mnl - Get ELD monitor name length in bytes. |