public inbox for intel-gfx@lists.freedesktop.org
 help / color / mirror / Atom feed
* [Intel-gfx] [PATCH 00/13] drm/display & drm/i915: more struct drm_edid conversions
@ 2023-04-21 11:47 Jani Nikula
  2023-04-21 11:47 ` [Intel-gfx] [PATCH 01/13] drm/edid: parse display info has_audio similar to is_hdmi Jani Nikula
                   ` (15 more replies)
  0 siblings, 16 replies; 31+ messages in thread
From: Jani Nikula @ 2023-04-21 11:47 UTC (permalink / raw)
  To: intel-gfx; +Cc: jani.nikula

Move struct drm_edid conversions forward.

There are still some drm_edid_raw() stragglers, but this nudges things
forward nicely.

Jani Nikula (13):
  drm/edid: parse display info has_audio similar to is_hdmi
  drm/display/dp_mst: drop has_audio from struct drm_dp_mst_port
  drm/i915/dp: stop caching has_audio in struct intel_dp
  drm/i915/dp: stop caching has_hdmi_sink in struct intel_dp
  drm/i915/hdmi: stop caching has_audio in struct intel_hdmi
  drm/i915/hdmi: stop caching has_hdmi_sink in struct intel_hdmi
  drm/i915/sdvo: stop caching has_hdmi_monitor in struct intel_sdvo
  drm/i915/sdvo: stop caching has_hdmi_audio in struct intel_sdvo
  drm/edid: add drm_edid_read_switcheroo()
  drm/i915/lvds: switch to drm_edid_read_switcheroo()
  drm/edid: make drm_edid_duplicate() safe to call with NULL parameter
  drm/display/dp_mst: convert to struct drm_edid
  drm/i915/display: switch the rest of the connectors to struct drm_edid

 drivers/gpu/drm/display/drm_dp_mst_topology.c |  55 +++++++--
 drivers/gpu/drm/drm_edid.c                    |  38 +++++++
 .../gpu/drm/i915/display/intel_connector.c    |  18 +--
 .../gpu/drm/i915/display/intel_connector.h    |   4 +-
 drivers/gpu/drm/i915/display/intel_crt.c      |  34 +++---
 drivers/gpu/drm/i915/display/intel_ddi.c      |   6 +-
 .../drm/i915/display/intel_display_debugfs.c  |  14 +--
 .../drm/i915/display/intel_display_types.h    |   4 -
 drivers/gpu/drm/i915/display/intel_dp.c       |  26 ++---
 drivers/gpu/drm/i915/display/intel_dp.h       |   1 +
 drivers/gpu/drm/i915/display/intel_dp_mst.c   |  12 +-
 drivers/gpu/drm/i915/display/intel_hdmi.c     |  14 +--
 drivers/gpu/drm/i915/display/intel_lvds.c     |  13 +--
 drivers/gpu/drm/i915/display/intel_sdvo.c     | 107 +++++++++---------
 include/drm/display/drm_dp_mst_helper.h       |  14 +--
 include/drm/drm_connector.h                   |   8 ++
 include/drm/drm_edid.h                        |   2 +
 17 files changed, 217 insertions(+), 153 deletions(-)

-- 
2.39.2


^ permalink raw reply	[flat|nested] 31+ messages in thread

* [Intel-gfx] [PATCH 01/13] drm/edid: parse display info has_audio similar to is_hdmi
  2023-04-21 11:47 [Intel-gfx] [PATCH 00/13] drm/display & drm/i915: more struct drm_edid conversions Jani Nikula
@ 2023-04-21 11:47 ` Jani Nikula
  2023-05-29  4:56   ` Nautiyal, Ankit K
  2023-04-21 11:47 ` [Intel-gfx] [PATCH 02/13] drm/display/dp_mst: drop has_audio from struct drm_dp_mst_port Jani Nikula
                   ` (14 subsequent siblings)
  15 siblings, 1 reply; 31+ messages in thread
From: Jani Nikula @ 2023-04-21 11:47 UTC (permalink / raw)
  To: intel-gfx; +Cc: jani.nikula

Since we already iterate everything that's needed for determining audio,
reduce the need to call drm_detect_monitor_audio() by storing has_audio
to connector info.

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/drm_edid.c  | 6 ++++++
 include/drm/drm_connector.h | 8 ++++++++
 2 files changed, 14 insertions(+)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 0454da505687..813ce00a106a 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -6243,6 +6243,9 @@ static void drm_parse_cea_ext(struct drm_connector *connector,
 			info->color_formats |= DRM_COLOR_FORMAT_YCBCR444;
 		if (edid_ext[3] & EDID_CEA_YCRCB422)
 			info->color_formats |= DRM_COLOR_FORMAT_YCBCR422;
+		if (edid_ext[3] & EDID_BASIC_AUDIO)
+			info->has_audio = true;
+
 	}
 	drm_edid_iter_end(&edid_iter);
 
@@ -6268,6 +6271,8 @@ static void drm_parse_cea_ext(struct drm_connector *connector,
 			drm_parse_hdr_metadata_block(connector, data);
 		else if (cea_db_tag(db) == CTA_DB_VIDEO)
 			parse_cta_vdb(connector, db);
+		else if (cea_db_tag(db) == CTA_DB_AUDIO)
+			info->has_audio = true;
 	}
 	cea_db_iter_end(&iter);
 
@@ -6424,6 +6429,7 @@ static void drm_reset_display_info(struct drm_connector *connector)
 	info->max_tmds_clock = 0;
 	info->dvi_dual = false;
 	info->is_hdmi = false;
+	info->has_audio = false;
 	info->has_hdmi_infoframe = false;
 	info->rgb_quant_range_selectable = false;
 	memset(&info->hdmi, 0, sizeof(info->hdmi));
diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h
index 7b5048516185..c8be6a343589 100644
--- a/include/drm/drm_connector.h
+++ b/include/drm/drm_connector.h
@@ -653,6 +653,14 @@ struct drm_display_info {
 	 */
 	bool is_hdmi;
 
+	/**
+	 * @has_audio: True if the sink supports audio.
+	 *
+	 * This field shall be used instead of calling
+	 * drm_detect_monitor_audio() when possible.
+	 */
+	bool has_audio;
+
 	/**
 	 * @has_hdmi_infoframe: Does the sink support the HDMI infoframe?
 	 */
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [Intel-gfx] [PATCH 02/13] drm/display/dp_mst: drop has_audio from struct drm_dp_mst_port
  2023-04-21 11:47 [Intel-gfx] [PATCH 00/13] drm/display & drm/i915: more struct drm_edid conversions Jani Nikula
  2023-04-21 11:47 ` [Intel-gfx] [PATCH 01/13] drm/edid: parse display info has_audio similar to is_hdmi Jani Nikula
@ 2023-04-21 11:47 ` Jani Nikula
  2023-05-29  5:10   ` Nautiyal, Ankit K
  2023-04-21 11:47 ` [Intel-gfx] [PATCH 03/13] drm/i915/dp: stop caching has_audio in struct intel_dp Jani Nikula
                   ` (13 subsequent siblings)
  15 siblings, 1 reply; 31+ messages in thread
From: Jani Nikula @ 2023-04-21 11:47 UTC (permalink / raw)
  To: intel-gfx; +Cc: jani.nikula

Caching the has_audio in struct drm_dp_mst_port seems odd, and oddly
placed. Defer audio handling to drivers, and use the info from the
connector display info. i915 was the only one using it anyway.

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/display/drm_dp_mst_topology.c        | 2 +-
 drivers/gpu/drm/i915/display/intel_display_debugfs.c | 4 ++--
 drivers/gpu/drm/i915/display/intel_dp_mst.c          | 2 +-
 include/drm/display/drm_dp_mst_helper.h              | 5 -----
 4 files changed, 4 insertions(+), 9 deletions(-)

diff --git a/drivers/gpu/drm/display/drm_dp_mst_topology.c b/drivers/gpu/drm/display/drm_dp_mst_topology.c
index 38dab76ae69e..a2b8732db0c8 100644
--- a/drivers/gpu/drm/display/drm_dp_mst_topology.c
+++ b/drivers/gpu/drm/display/drm_dp_mst_topology.c
@@ -4170,7 +4170,7 @@ struct edid *drm_dp_mst_get_edid(struct drm_connector *connector, struct drm_dp_
 	else {
 		edid = drm_get_edid(connector, &port->aux.ddc);
 	}
-	port->has_audio = drm_detect_monitor_audio(edid);
+
 	drm_dp_mst_topology_put_port(port);
 	return edid;
 }
diff --git a/drivers/gpu/drm/i915/display/intel_display_debugfs.c b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
index e72288662f02..77caed2552d0 100644
--- a/drivers/gpu/drm/i915/display/intel_display_debugfs.c
+++ b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
@@ -244,9 +244,9 @@ static void intel_dp_info(struct seq_file *m,
 }
 
 static void intel_dp_mst_info(struct seq_file *m,
-			      struct intel_connector *intel_connector)
+			      struct intel_connector *connector)
 {
-	bool has_audio = intel_connector->port->has_audio;
+	bool has_audio = connector->base.display_info.has_audio;
 
 	seq_printf(m, "\taudio support: %s\n", str_yes_no(has_audio));
 }
diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c b/drivers/gpu/drm/i915/display/intel_dp_mst.c
index 2c49d9ab86a2..506118a13866 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
@@ -298,7 +298,7 @@ static bool intel_dp_mst_has_audio(const struct drm_connector_state *conn_state)
 		to_intel_connector(conn_state->connector);
 
 	if (intel_conn_state->force_audio == HDMI_AUDIO_AUTO)
-		return connector->port->has_audio;
+		return connector->base.display_info.has_audio;
 	else
 		return intel_conn_state->force_audio == HDMI_AUDIO_ON;
 }
diff --git a/include/drm/display/drm_dp_mst_helper.h b/include/drm/display/drm_dp_mst_helper.h
index 32c764fb9cb5..5be96a158ab2 100644
--- a/include/drm/display/drm_dp_mst_helper.h
+++ b/include/drm/display/drm_dp_mst_helper.h
@@ -139,11 +139,6 @@ struct drm_dp_mst_port {
 	 * that the EDID for all connectors is read immediately.
 	 */
 	struct edid *cached_edid;
-	/**
-	 * @has_audio: Tracks whether the sink connector to this port is
-	 * audio-capable.
-	 */
-	bool has_audio;
 
 	/**
 	 * @fec_capable: bool indicating if FEC can be supported up to that
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [Intel-gfx] [PATCH 03/13] drm/i915/dp: stop caching has_audio in struct intel_dp
  2023-04-21 11:47 [Intel-gfx] [PATCH 00/13] drm/display & drm/i915: more struct drm_edid conversions Jani Nikula
  2023-04-21 11:47 ` [Intel-gfx] [PATCH 01/13] drm/edid: parse display info has_audio similar to is_hdmi Jani Nikula
  2023-04-21 11:47 ` [Intel-gfx] [PATCH 02/13] drm/display/dp_mst: drop has_audio from struct drm_dp_mst_port Jani Nikula
@ 2023-04-21 11:47 ` Jani Nikula
  2023-05-29  5:15   ` Nautiyal, Ankit K
  2023-04-21 11:47 ` [Intel-gfx] [PATCH 04/13] drm/i915/dp: stop caching has_hdmi_sink " Jani Nikula
                   ` (12 subsequent siblings)
  15 siblings, 1 reply; 31+ messages in thread
From: Jani Nikula @ 2023-04-21 11:47 UTC (permalink / raw)
  To: intel-gfx; +Cc: jani.nikula

Use the information stored in display info.

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/i915/display/intel_display_debugfs.c | 2 +-
 drivers/gpu/drm/i915/display/intel_display_types.h   | 1 -
 drivers/gpu/drm/i915/display/intel_dp.c              | 5 ++---
 3 files changed, 3 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display_debugfs.c b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
index 77caed2552d0..1416b82fc8a3 100644
--- a/drivers/gpu/drm/i915/display/intel_display_debugfs.c
+++ b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
@@ -237,7 +237,7 @@ static void intel_dp_info(struct seq_file *m,
 
 	seq_printf(m, "\tDPCD rev: %x\n", intel_dp->dpcd[DP_DPCD_REV]);
 	seq_printf(m, "\taudio support: %s\n",
-		   str_yes_no(intel_dp->has_audio));
+		   str_yes_no(intel_connector->base.display_info.has_audio));
 
 	drm_dp_downstream_debug(m, intel_dp->dpcd, intel_dp->downstream_ports,
 				edid ? edid->data : NULL, &intel_dp->aux);
diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
index 35c260bd1461..9c9b771cbcbd 100644
--- a/drivers/gpu/drm/i915/display/intel_display_types.h
+++ b/drivers/gpu/drm/i915/display/intel_display_types.h
@@ -1670,7 +1670,6 @@ struct intel_dp {
 	u8 sink_count;
 	bool link_trained;
 	bool has_hdmi_sink;
-	bool has_audio;
 	bool reset_link_params;
 	bool use_max_params;
 	u8 dpcd[DP_RECEIVER_CAP_SIZE];
diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
index 1d28a2560ae0..cda69861b00a 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -2077,6 +2077,7 @@ static bool intel_dp_has_audio(struct intel_encoder *encoder,
 {
 	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
 	struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
+	struct intel_connector *connector = intel_dp->attached_connector;
 	const struct intel_digital_connector_state *intel_conn_state =
 		to_intel_digital_connector_state(conn_state);
 
@@ -2084,7 +2085,7 @@ static bool intel_dp_has_audio(struct intel_encoder *encoder,
 		return false;
 
 	if (intel_conn_state->force_audio == HDMI_AUDIO_AUTO)
-		return intel_dp->has_audio;
+		return connector->base.display_info.has_audio;
 	else
 		return intel_conn_state->force_audio == HDMI_AUDIO_ON;
 }
@@ -4712,7 +4713,6 @@ intel_dp_set_edid(struct intel_dp *intel_dp)
 	edid = drm_edid_raw(drm_edid);
 	if (edid && edid->input & DRM_EDID_INPUT_DIGITAL) {
 		intel_dp->has_hdmi_sink = drm_detect_hdmi_monitor(edid);
-		intel_dp->has_audio = drm_detect_monitor_audio(edid);
 	}
 
 	drm_dp_cec_set_edid(&intel_dp->aux, edid);
@@ -4728,7 +4728,6 @@ intel_dp_unset_edid(struct intel_dp *intel_dp)
 	connector->detect_edid = NULL;
 
 	intel_dp->has_hdmi_sink = false;
-	intel_dp->has_audio = false;
 
 	intel_dp->dfp.max_bpc = 0;
 	intel_dp->dfp.max_dotclock = 0;
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [Intel-gfx] [PATCH 04/13] drm/i915/dp: stop caching has_hdmi_sink in struct intel_dp
  2023-04-21 11:47 [Intel-gfx] [PATCH 00/13] drm/display & drm/i915: more struct drm_edid conversions Jani Nikula
                   ` (2 preceding siblings ...)
  2023-04-21 11:47 ` [Intel-gfx] [PATCH 03/13] drm/i915/dp: stop caching has_audio in struct intel_dp Jani Nikula
@ 2023-04-21 11:47 ` Jani Nikula
  2023-05-29  5:22   ` Nautiyal, Ankit K
  2023-04-21 11:47 ` [Intel-gfx] [PATCH 05/13] drm/i915/hdmi: stop caching has_audio in struct intel_hdmi Jani Nikula
                   ` (11 subsequent siblings)
  15 siblings, 1 reply; 31+ messages in thread
From: Jani Nikula @ 2023-04-21 11:47 UTC (permalink / raw)
  To: intel-gfx; +Cc: jani.nikula

Use the information stored in display info. Add intel_dp_has_hdmi_sink()
helper to access it.

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/i915/display/intel_ddi.c      |  6 +++---
 .../drm/i915/display/intel_display_types.h    |  1 -
 drivers/gpu/drm/i915/display/intel_dp.c       | 21 ++++++++++---------
 drivers/gpu/drm/i915/display/intel_dp.h       |  1 +
 4 files changed, 15 insertions(+), 14 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c
index 29e4bfab4635..9b462dd8bb14 100644
--- a/drivers/gpu/drm/i915/display/intel_ddi.c
+++ b/drivers/gpu/drm/i915/display/intel_ddi.c
@@ -2800,7 +2800,7 @@ static void intel_ddi_pre_enable(struct intel_atomic_state *state,
 
 		/* FIXME precompute everything properly */
 		/* FIXME how do we turn infoframes off again? */
-		if (dig_port->lspcon.active && dig_port->dp.has_hdmi_sink)
+		if (dig_port->lspcon.active && intel_dp_has_hdmi_sink(&dig_port->dp))
 			dig_port->set_infoframes(encoder,
 						 crtc_state->has_infoframe,
 						 crtc_state, conn_state);
@@ -3109,7 +3109,7 @@ static void intel_enable_ddi_dp(struct intel_atomic_state *state,
 	drm_connector_update_privacy_screen(conn_state);
 	intel_edp_backlight_on(crtc_state, conn_state);
 
-	if (!dig_port->lspcon.active || dig_port->dp.has_hdmi_sink)
+	if (!dig_port->lspcon.active || intel_dp_has_hdmi_sink(&dig_port->dp))
 		intel_dp_set_infoframes(encoder, true, crtc_state, conn_state);
 
 	intel_audio_codec_enable(encoder, crtc_state, conn_state);
@@ -3736,7 +3736,7 @@ static void intel_ddi_read_func_ctl(struct intel_encoder *encoder,
 				    pipe_config->fec_enable);
 		}
 
-		if (dig_port->lspcon.active && dig_port->dp.has_hdmi_sink)
+		if (dig_port->lspcon.active && intel_dp_has_hdmi_sink(&dig_port->dp))
 			pipe_config->infoframes.enable |=
 				intel_lspcon_infoframes_enabled(encoder, pipe_config);
 		else
diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
index 9c9b771cbcbd..17681a8e745c 100644
--- a/drivers/gpu/drm/i915/display/intel_display_types.h
+++ b/drivers/gpu/drm/i915/display/intel_display_types.h
@@ -1669,7 +1669,6 @@ struct intel_dp {
 	u8 lane_count;
 	u8 sink_count;
 	bool link_trained;
-	bool has_hdmi_sink;
 	bool reset_link_params;
 	bool use_max_params;
 	u8 dpcd[DP_RECEIVER_CAP_SIZE];
diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
index cda69861b00a..1708277547f3 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -1201,6 +1201,13 @@ void intel_dp_compute_rate(struct intel_dp *intel_dp, int port_clock,
 	}
 }
 
+bool intel_dp_has_hdmi_sink(struct intel_dp *intel_dp)
+{
+	struct intel_connector *connector = intel_dp->attached_connector;
+
+	return connector->base.display_info.is_hdmi;
+}
+
 static bool intel_dp_source_supports_fec(struct intel_dp *intel_dp,
 					 const struct intel_crtc_state *pipe_config)
 {
@@ -1265,7 +1272,7 @@ static int intel_dp_hdmi_compute_bpc(struct intel_dp *intel_dp,
 
 	for (; bpc >= 8; bpc -= 2) {
 		if (intel_hdmi_bpc_possible(crtc_state, bpc,
-					    intel_dp->has_hdmi_sink, ycbcr420_output) &&
+					    intel_dp_has_hdmi_sink(intel_dp), ycbcr420_output) &&
 		    intel_dp_tmds_clock_valid(intel_dp, clock, bpc, ycbcr420_output,
 					      respect_downstream_limits) == MODE_OK)
 			return bpc;
@@ -2646,7 +2653,7 @@ static int intel_dp_pcon_start_frl_training(struct intel_dp *intel_dp)
 static bool intel_dp_is_hdmi_2_1_sink(struct intel_dp *intel_dp)
 {
 	if (drm_dp_is_branch(intel_dp->dpcd) &&
-	    intel_dp->has_hdmi_sink &&
+	    intel_dp_has_hdmi_sink(intel_dp) &&
 	    intel_dp_hdmi_sink_max_frl(intel_dp) > 0)
 		return true;
 
@@ -2812,13 +2819,12 @@ void intel_dp_configure_protocol_converter(struct intel_dp *intel_dp,
 	if (!drm_dp_is_branch(intel_dp->dpcd))
 		return;
 
-	tmp = intel_dp->has_hdmi_sink ?
-		DP_HDMI_DVI_OUTPUT_CONFIG : 0;
+	tmp = intel_dp_has_hdmi_sink(intel_dp) ? DP_HDMI_DVI_OUTPUT_CONFIG : 0;
 
 	if (drm_dp_dpcd_writeb(&intel_dp->aux,
 			       DP_PROTOCOL_CONVERTER_CONTROL_0, tmp) != 1)
 		drm_dbg_kms(&i915->drm, "Failed to %s protocol converter HDMI mode\n",
-			    str_enable_disable(intel_dp->has_hdmi_sink));
+			    str_enable_disable(intel_dp_has_hdmi_sink(intel_dp)));
 
 	tmp = crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR444 &&
 		intel_dp->dfp.ycbcr_444_to_420 ? DP_CONVERSION_TO_YCBCR420_ENABLE : 0;
@@ -4711,9 +4717,6 @@ intel_dp_set_edid(struct intel_dp *intel_dp)
 
 	/* FIXME: Get rid of drm_edid_raw() */
 	edid = drm_edid_raw(drm_edid);
-	if (edid && edid->input & DRM_EDID_INPUT_DIGITAL) {
-		intel_dp->has_hdmi_sink = drm_detect_hdmi_monitor(edid);
-	}
 
 	drm_dp_cec_set_edid(&intel_dp->aux, edid);
 }
@@ -4727,8 +4730,6 @@ intel_dp_unset_edid(struct intel_dp *intel_dp)
 	drm_edid_free(connector->detect_edid);
 	connector->detect_edid = NULL;
 
-	intel_dp->has_hdmi_sink = false;
-
 	intel_dp->dfp.max_bpc = 0;
 	intel_dp->dfp.max_dotclock = 0;
 	intel_dp->dfp.min_tmds_clock = 0;
diff --git a/drivers/gpu/drm/i915/display/intel_dp.h b/drivers/gpu/drm/i915/display/intel_dp.h
index ef39e4f7a329..803b0822c661 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.h
+++ b/drivers/gpu/drm/i915/display/intel_dp.h
@@ -62,6 +62,7 @@ int intel_dp_dsc_compute_config(struct intel_dp *intel_dp,
 				struct link_config_limits *limits,
 				int timeslots,
 				bool recompute_pipe_bpp);
+bool intel_dp_has_hdmi_sink(struct intel_dp *intel_dp);
 bool intel_dp_is_edp(struct intel_dp *intel_dp);
 bool intel_dp_is_uhbr(const struct intel_crtc_state *crtc_state);
 bool intel_dp_is_port_edp(struct drm_i915_private *dev_priv, enum port port);
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [Intel-gfx] [PATCH 05/13] drm/i915/hdmi: stop caching has_audio in struct intel_hdmi
  2023-04-21 11:47 [Intel-gfx] [PATCH 00/13] drm/display & drm/i915: more struct drm_edid conversions Jani Nikula
                   ` (3 preceding siblings ...)
  2023-04-21 11:47 ` [Intel-gfx] [PATCH 04/13] drm/i915/dp: stop caching has_hdmi_sink " Jani Nikula
@ 2023-04-21 11:47 ` Jani Nikula
  2023-05-29  5:43   ` Nautiyal, Ankit K
  2023-04-21 11:47 ` [Intel-gfx] [PATCH 06/13] drm/i915/hdmi: stop caching has_hdmi_sink " Jani Nikula
                   ` (10 subsequent siblings)
  15 siblings, 1 reply; 31+ messages in thread
From: Jani Nikula @ 2023-04-21 11:47 UTC (permalink / raw)
  To: intel-gfx; +Cc: jani.nikula

Use the information stored in display info.

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/i915/display/intel_display_debugfs.c | 8 +++-----
 drivers/gpu/drm/i915/display/intel_display_types.h   | 1 -
 drivers/gpu/drm/i915/display/intel_hdmi.c            | 6 ++----
 3 files changed, 5 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display_debugfs.c b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
index 1416b82fc8a3..2a4df62692a6 100644
--- a/drivers/gpu/drm/i915/display/intel_display_debugfs.c
+++ b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
@@ -252,13 +252,11 @@ static void intel_dp_mst_info(struct seq_file *m,
 }
 
 static void intel_hdmi_info(struct seq_file *m,
-			    struct intel_connector *intel_connector)
+			    struct intel_connector *connector)
 {
-	struct intel_encoder *intel_encoder = intel_attached_encoder(intel_connector);
-	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(intel_encoder);
+	bool has_audio = connector->base.display_info.has_audio;
 
-	seq_printf(m, "\taudio support: %s\n",
-		   str_yes_no(intel_hdmi->has_audio));
+	seq_printf(m, "\taudio support: %s\n", str_yes_no(has_audio));
 }
 
 static void intel_connector_info(struct seq_file *m,
diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
index 17681a8e745c..d7ff75167f1f 100644
--- a/drivers/gpu/drm/i915/display/intel_display_types.h
+++ b/drivers/gpu/drm/i915/display/intel_display_types.h
@@ -1549,7 +1549,6 @@ struct intel_hdmi {
 		int max_tmds_clock;
 	} dp_dual_mode;
 	bool has_hdmi_sink;
-	bool has_audio;
 	struct intel_connector *attached_connector;
 	struct cec_notifier *cec_notifier;
 };
diff --git a/drivers/gpu/drm/i915/display/intel_hdmi.c b/drivers/gpu/drm/i915/display/intel_hdmi.c
index 8141d5184856..3045bf21ba8f 100644
--- a/drivers/gpu/drm/i915/display/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/display/intel_hdmi.c
@@ -2158,7 +2158,7 @@ static bool intel_hdmi_has_audio(struct intel_encoder *encoder,
 				 const struct intel_crtc_state *crtc_state,
 				 const struct drm_connector_state *conn_state)
 {
-	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
+	struct drm_connector *connector = conn_state->connector;
 	const struct intel_digital_connector_state *intel_conn_state =
 		to_intel_digital_connector_state(conn_state);
 
@@ -2166,7 +2166,7 @@ static bool intel_hdmi_has_audio(struct intel_encoder *encoder,
 		return false;
 
 	if (intel_conn_state->force_audio == HDMI_AUDIO_AUTO)
-		return intel_hdmi->has_audio;
+		return connector->display_info.has_audio;
 	else
 		return intel_conn_state->force_audio == HDMI_AUDIO_ON;
 }
@@ -2360,7 +2360,6 @@ intel_hdmi_unset_edid(struct drm_connector *connector)
 	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(to_intel_connector(connector));
 
 	intel_hdmi->has_hdmi_sink = false;
-	intel_hdmi->has_audio = false;
 
 	intel_hdmi->dp_dual_mode.type = DRM_DP_DUAL_MODE_NONE;
 	intel_hdmi->dp_dual_mode.max_tmds_clock = 0;
@@ -2453,7 +2452,6 @@ intel_hdmi_set_edid(struct drm_connector *connector)
 	/* FIXME: Get rid of drm_edid_raw() */
 	edid = drm_edid_raw(drm_edid);
 	if (edid && edid->input & DRM_EDID_INPUT_DIGITAL) {
-		intel_hdmi->has_audio = drm_detect_monitor_audio(edid);
 		intel_hdmi->has_hdmi_sink = drm_detect_hdmi_monitor(edid);
 
 		intel_hdmi_dp_dual_mode_detect(connector);
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [Intel-gfx] [PATCH 06/13] drm/i915/hdmi: stop caching has_hdmi_sink in struct intel_hdmi
  2023-04-21 11:47 [Intel-gfx] [PATCH 00/13] drm/display & drm/i915: more struct drm_edid conversions Jani Nikula
                   ` (4 preceding siblings ...)
  2023-04-21 11:47 ` [Intel-gfx] [PATCH 05/13] drm/i915/hdmi: stop caching has_audio in struct intel_hdmi Jani Nikula
@ 2023-04-21 11:47 ` Jani Nikula
  2023-05-29  5:49   ` Nautiyal, Ankit K
  2023-04-21 11:47 ` [Intel-gfx] [PATCH 07/13] drm/i915/sdvo: stop caching has_hdmi_monitor in struct intel_sdvo Jani Nikula
                   ` (9 subsequent siblings)
  15 siblings, 1 reply; 31+ messages in thread
From: Jani Nikula @ 2023-04-21 11:47 UTC (permalink / raw)
  To: intel-gfx; +Cc: jani.nikula

Use the information stored in display info.

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/i915/display/intel_display_types.h | 1 -
 drivers/gpu/drm/i915/display/intel_hdmi.c          | 8 +++-----
 2 files changed, 3 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
index d7ff75167f1f..dc7f3bf731cd 100644
--- a/drivers/gpu/drm/i915/display/intel_display_types.h
+++ b/drivers/gpu/drm/i915/display/intel_display_types.h
@@ -1548,7 +1548,6 @@ struct intel_hdmi {
 		enum drm_dp_dual_mode_type type;
 		int max_tmds_clock;
 	} dp_dual_mode;
-	bool has_hdmi_sink;
 	struct intel_connector *attached_connector;
 	struct cec_notifier *cec_notifier;
 };
diff --git a/drivers/gpu/drm/i915/display/intel_hdmi.c b/drivers/gpu/drm/i915/display/intel_hdmi.c
index 3045bf21ba8f..aa0c726cb525 100644
--- a/drivers/gpu/drm/i915/display/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/display/intel_hdmi.c
@@ -1789,7 +1789,9 @@ static int intel_hdmi_source_max_tmds_clock(struct intel_encoder *encoder)
 static bool intel_has_hdmi_sink(struct intel_hdmi *hdmi,
 				const struct drm_connector_state *conn_state)
 {
-	return hdmi->has_hdmi_sink &&
+	struct intel_connector *connector = hdmi->attached_connector;
+
+	return connector->base.display_info.is_hdmi &&
 		READ_ONCE(to_intel_digital_connector_state(conn_state)->force_audio) != HDMI_AUDIO_OFF_DVI;
 }
 
@@ -2359,8 +2361,6 @@ intel_hdmi_unset_edid(struct drm_connector *connector)
 {
 	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(to_intel_connector(connector));
 
-	intel_hdmi->has_hdmi_sink = false;
-
 	intel_hdmi->dp_dual_mode.type = DRM_DP_DUAL_MODE_NONE;
 	intel_hdmi->dp_dual_mode.max_tmds_clock = 0;
 
@@ -2452,8 +2452,6 @@ intel_hdmi_set_edid(struct drm_connector *connector)
 	/* FIXME: Get rid of drm_edid_raw() */
 	edid = drm_edid_raw(drm_edid);
 	if (edid && edid->input & DRM_EDID_INPUT_DIGITAL) {
-		intel_hdmi->has_hdmi_sink = drm_detect_hdmi_monitor(edid);
-
 		intel_hdmi_dp_dual_mode_detect(connector);
 
 		connected = true;
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [Intel-gfx] [PATCH 07/13] drm/i915/sdvo: stop caching has_hdmi_monitor in struct intel_sdvo
  2023-04-21 11:47 [Intel-gfx] [PATCH 00/13] drm/display & drm/i915: more struct drm_edid conversions Jani Nikula
                   ` (5 preceding siblings ...)
  2023-04-21 11:47 ` [Intel-gfx] [PATCH 06/13] drm/i915/hdmi: stop caching has_hdmi_sink " Jani Nikula
@ 2023-04-21 11:47 ` Jani Nikula
  2023-05-29  6:05   ` Nautiyal, Ankit K
  2023-04-21 11:47 ` [Intel-gfx] [PATCH 08/13] drm/i915/sdvo: stop caching has_hdmi_audio " Jani Nikula
                   ` (8 subsequent siblings)
  15 siblings, 1 reply; 31+ messages in thread
From: Jani Nikula @ 2023-04-21 11:47 UTC (permalink / raw)
  To: intel-gfx; +Cc: jani.nikula

Use the information stored in display info.

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/i915/display/intel_sdvo.c | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_sdvo.c b/drivers/gpu/drm/i915/display/intel_sdvo.c
index e12ba458636c..0bbfab95ca37 100644
--- a/drivers/gpu/drm/i915/display/intel_sdvo.c
+++ b/drivers/gpu/drm/i915/display/intel_sdvo.c
@@ -117,7 +117,6 @@ struct intel_sdvo {
 
 	enum port port;
 
-	bool has_hdmi_monitor;
 	bool has_hdmi_audio;
 
 	/* DDC bus used by this SDVO encoder */
@@ -1303,10 +1302,13 @@ static void i9xx_adjust_sdvo_tv_clock(struct intel_crtc_state *pipe_config)
 	pipe_config->clock_set = true;
 }
 
-static bool intel_has_hdmi_sink(struct intel_sdvo *sdvo,
+static bool intel_has_hdmi_sink(struct intel_sdvo_connector *intel_sdvo_connector,
 				const struct drm_connector_state *conn_state)
 {
-	return sdvo->has_hdmi_monitor &&
+	struct drm_connector *connector = conn_state->connector;
+
+	return intel_sdvo_connector->is_hdmi &&
+		connector->display_info.is_hdmi &&
 		READ_ONCE(to_intel_digital_connector_state(conn_state)->force_audio) != HDMI_AUDIO_OFF_DVI;
 }
 
@@ -1400,7 +1402,7 @@ static int intel_sdvo_compute_config(struct intel_encoder *encoder,
 	pipe_config->pixel_multiplier =
 		intel_sdvo_get_pixel_multiplier(adjusted_mode);
 
-	pipe_config->has_hdmi_sink = intel_has_hdmi_sink(intel_sdvo, conn_state);
+	pipe_config->has_hdmi_sink = intel_has_hdmi_sink(intel_sdvo_connector, conn_state);
 
 	pipe_config->has_audio =
 		intel_sdvo_has_audio(encoder, pipe_config, conn_state) &&
@@ -1906,7 +1908,7 @@ intel_sdvo_mode_valid(struct drm_connector *connector,
 	struct intel_sdvo_connector *intel_sdvo_connector =
 		to_intel_sdvo_connector(connector);
 	int max_dotclk = to_i915(connector->dev)->max_dotclk_freq;
-	bool has_hdmi_sink = intel_has_hdmi_sink(intel_sdvo, connector->state);
+	bool has_hdmi_sink = intel_has_hdmi_sink(intel_sdvo_connector, connector->state);
 	int clock = mode->clock;
 
 	if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
@@ -2095,7 +2097,6 @@ intel_sdvo_tmds_sink_detect(struct drm_connector *connector)
 		if (edid->input & DRM_EDID_INPUT_DIGITAL) {
 			status = connector_status_connected;
 			if (intel_sdvo_connector->is_hdmi) {
-				intel_sdvo->has_hdmi_monitor = drm_detect_hdmi_monitor(edid);
 				intel_sdvo->has_hdmi_audio = drm_detect_monitor_audio(edid);
 			}
 		} else
@@ -2147,7 +2148,6 @@ intel_sdvo_detect(struct drm_connector *connector, bool force)
 
 	intel_sdvo->attached_output = response;
 
-	intel_sdvo->has_hdmi_monitor = false;
 	intel_sdvo->has_hdmi_audio = false;
 
 	if ((intel_sdvo_connector->output_flag & response) == 0)
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [Intel-gfx] [PATCH 08/13] drm/i915/sdvo: stop caching has_hdmi_audio in struct intel_sdvo
  2023-04-21 11:47 [Intel-gfx] [PATCH 00/13] drm/display & drm/i915: more struct drm_edid conversions Jani Nikula
                   ` (6 preceding siblings ...)
  2023-04-21 11:47 ` [Intel-gfx] [PATCH 07/13] drm/i915/sdvo: stop caching has_hdmi_monitor in struct intel_sdvo Jani Nikula
@ 2023-04-21 11:47 ` Jani Nikula
  2023-05-29  6:06   ` Nautiyal, Ankit K
  2023-04-21 11:47 ` [Intel-gfx] [PATCH 09/13] drm/edid: add drm_edid_read_switcheroo() Jani Nikula
                   ` (7 subsequent siblings)
  15 siblings, 1 reply; 31+ messages in thread
From: Jani Nikula @ 2023-04-21 11:47 UTC (permalink / raw)
  To: intel-gfx; +Cc: jani.nikula

Use the information stored in display info.

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/i915/display/intel_sdvo.c | 20 +++++++-------------
 1 file changed, 7 insertions(+), 13 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_sdvo.c b/drivers/gpu/drm/i915/display/intel_sdvo.c
index 0bbfab95ca37..0f0c1733cd0d 100644
--- a/drivers/gpu/drm/i915/display/intel_sdvo.c
+++ b/drivers/gpu/drm/i915/display/intel_sdvo.c
@@ -117,8 +117,6 @@ struct intel_sdvo {
 
 	enum port port;
 
-	bool has_hdmi_audio;
-
 	/* DDC bus used by this SDVO encoder */
 	u8 ddc_bus;
 
@@ -1328,7 +1326,9 @@ static bool intel_sdvo_has_audio(struct intel_encoder *encoder,
 				 const struct intel_crtc_state *crtc_state,
 				 const struct drm_connector_state *conn_state)
 {
-	struct intel_sdvo *intel_sdvo = to_sdvo(encoder);
+	struct drm_connector *connector = conn_state->connector;
+	struct intel_sdvo_connector *intel_sdvo_connector =
+		to_intel_sdvo_connector(connector);
 	const struct intel_digital_connector_state *intel_conn_state =
 		to_intel_digital_connector_state(conn_state);
 
@@ -1336,7 +1336,8 @@ static bool intel_sdvo_has_audio(struct intel_encoder *encoder,
 		return false;
 
 	if (intel_conn_state->force_audio == HDMI_AUDIO_AUTO)
-		return intel_sdvo->has_hdmi_audio;
+		return intel_sdvo_connector->is_hdmi &&
+			connector->display_info.has_audio;
 	else
 		return intel_conn_state->force_audio == HDMI_AUDIO_ON;
 }
@@ -2056,8 +2057,6 @@ static enum drm_connector_status
 intel_sdvo_tmds_sink_detect(struct drm_connector *connector)
 {
 	struct intel_sdvo *intel_sdvo = intel_attached_sdvo(to_intel_connector(connector));
-	struct intel_sdvo_connector *intel_sdvo_connector =
-		to_intel_sdvo_connector(connector);
 	enum drm_connector_status status;
 	struct edid *edid;
 
@@ -2094,12 +2093,9 @@ intel_sdvo_tmds_sink_detect(struct drm_connector *connector)
 	status = connector_status_unknown;
 	if (edid != NULL) {
 		/* DDC bus is shared, match EDID to connector type */
-		if (edid->input & DRM_EDID_INPUT_DIGITAL) {
+		if (edid->input & DRM_EDID_INPUT_DIGITAL)
 			status = connector_status_connected;
-			if (intel_sdvo_connector->is_hdmi) {
-				intel_sdvo->has_hdmi_audio = drm_detect_monitor_audio(edid);
-			}
-		} else
+		else
 			status = connector_status_disconnected;
 		kfree(edid);
 	}
@@ -2148,8 +2144,6 @@ intel_sdvo_detect(struct drm_connector *connector, bool force)
 
 	intel_sdvo->attached_output = response;
 
-	intel_sdvo->has_hdmi_audio = false;
-
 	if ((intel_sdvo_connector->output_flag & response) == 0)
 		ret = connector_status_disconnected;
 	else if (IS_TMDS(intel_sdvo_connector))
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [Intel-gfx] [PATCH 09/13] drm/edid: add drm_edid_read_switcheroo()
  2023-04-21 11:47 [Intel-gfx] [PATCH 00/13] drm/display & drm/i915: more struct drm_edid conversions Jani Nikula
                   ` (7 preceding siblings ...)
  2023-04-21 11:47 ` [Intel-gfx] [PATCH 08/13] drm/i915/sdvo: stop caching has_hdmi_audio " Jani Nikula
@ 2023-04-21 11:47 ` Jani Nikula
  2023-05-30  4:09   ` Nautiyal, Ankit K
  2023-04-21 11:47 ` [Intel-gfx] [PATCH 10/13] drm/i915/lvds: switch to drm_edid_read_switcheroo() Jani Nikula
                   ` (6 subsequent siblings)
  15 siblings, 1 reply; 31+ messages in thread
From: Jani Nikula @ 2023-04-21 11:47 UTC (permalink / raw)
  To: intel-gfx; +Cc: jani.nikula

Add a switcheroo variant to the struct drm_edid based EDID read
functions.

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/drm_edid.c | 29 +++++++++++++++++++++++++++++
 include/drm/drm_edid.h     |  2 ++
 2 files changed, 31 insertions(+)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 813ce00a106a..941f3d53a701 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -2844,6 +2844,35 @@ struct edid *drm_get_edid_switcheroo(struct drm_connector *connector,
 }
 EXPORT_SYMBOL(drm_get_edid_switcheroo);
 
+/**
+ * drm_edid_read_switcheroo - get EDID data for a vga_switcheroo output
+ * @connector: connector we're probing
+ * @adapter: I2C adapter to use for DDC
+ *
+ * Wrapper around drm_edid_read_ddc() for laptops with dual GPUs using one set
+ * of outputs. The wrapper adds the requisite vga_switcheroo calls to
+ * temporarily switch DDC to the GPU which is retrieving EDID.
+ *
+ * Return: Pointer to valid EDID or %NULL if we couldn't find any.
+ */
+const struct drm_edid *drm_edid_read_switcheroo(struct drm_connector *connector,
+						struct i2c_adapter *adapter)
+{
+	struct drm_device *dev = connector->dev;
+	struct pci_dev *pdev = to_pci_dev(dev->dev);
+	const struct drm_edid *drm_edid;
+
+	if (drm_WARN_ON_ONCE(dev, !dev_is_pci(dev->dev)))
+		return NULL;
+
+	vga_switcheroo_lock_ddc(pdev);
+	drm_edid = drm_edid_read_ddc(connector, adapter);
+	vga_switcheroo_unlock_ddc(pdev);
+
+	return drm_edid;
+}
+EXPORT_SYMBOL(drm_edid_read_switcheroo);
+
 /**
  * drm_edid_duplicate - duplicate an EDID and the extensions
  * @edid: EDID to duplicate
diff --git a/include/drm/drm_edid.h b/include/drm/drm_edid.h
index 571885d32907..169755d3de19 100644
--- a/include/drm/drm_edid.h
+++ b/include/drm/drm_edid.h
@@ -613,6 +613,8 @@ const struct drm_edid *drm_edid_read_ddc(struct drm_connector *connector,
 const struct drm_edid *drm_edid_read_custom(struct drm_connector *connector,
 					    int (*read_block)(void *context, u8 *buf, unsigned int block, size_t len),
 					    void *context);
+const struct drm_edid *drm_edid_read_switcheroo(struct drm_connector *connector,
+						struct i2c_adapter *adapter);
 int drm_edid_connector_update(struct drm_connector *connector,
 			      const struct drm_edid *edid);
 int drm_edid_connector_add_modes(struct drm_connector *connector);
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [Intel-gfx] [PATCH 10/13] drm/i915/lvds: switch to drm_edid_read_switcheroo()
  2023-04-21 11:47 [Intel-gfx] [PATCH 00/13] drm/display & drm/i915: more struct drm_edid conversions Jani Nikula
                   ` (8 preceding siblings ...)
  2023-04-21 11:47 ` [Intel-gfx] [PATCH 09/13] drm/edid: add drm_edid_read_switcheroo() Jani Nikula
@ 2023-04-21 11:47 ` Jani Nikula
  2023-04-23  8:10   ` Lukas Wunner
  2023-04-21 11:47 ` [Intel-gfx] [PATCH 11/13] drm/edid: make drm_edid_duplicate() safe to call with NULL parameter Jani Nikula
                   ` (5 subsequent siblings)
  15 siblings, 1 reply; 31+ messages in thread
From: Jani Nikula @ 2023-04-21 11:47 UTC (permalink / raw)
  To: intel-gfx; +Cc: jani.nikula

Use drm_edid_read_switcheroo() to switch from struct edid to struct
drm_edid.

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/i915/display/intel_lvds.c | 13 ++-----------
 1 file changed, 2 insertions(+), 11 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_lvds.c b/drivers/gpu/drm/i915/display/intel_lvds.c
index 8e9a3d72b83b..682d5cdaa0ba 100644
--- a/drivers/gpu/drm/i915/display/intel_lvds.c
+++ b/drivers/gpu/drm/i915/display/intel_lvds.c
@@ -943,17 +943,8 @@ void intel_lvds_init(struct drm_i915_private *i915)
 	 */
 	mutex_lock(&i915->drm.mode_config.mutex);
 	if (vga_switcheroo_handler_flags() & VGA_SWITCHEROO_CAN_SWITCH_DDC) {
-		const struct edid *edid;
-
-		/* FIXME: Make drm_get_edid_switcheroo() return drm_edid */
-		edid = drm_get_edid_switcheroo(&connector->base,
-					       intel_gmbus_get_adapter(i915, pin));
-		if (edid) {
-			drm_edid = drm_edid_alloc(edid, (edid->extensions + 1) * EDID_LENGTH);
-			kfree(edid);
-		} else {
-			drm_edid = NULL;
-		}
+		drm_edid = drm_edid_read_switcheroo(&connector->base,
+						    intel_gmbus_get_adapter(i915, pin));
 	} else {
 		drm_edid = drm_edid_read_ddc(&connector->base,
 					     intel_gmbus_get_adapter(i915, pin));
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [Intel-gfx] [PATCH 11/13] drm/edid: make drm_edid_duplicate() safe to call with NULL parameter
  2023-04-21 11:47 [Intel-gfx] [PATCH 00/13] drm/display & drm/i915: more struct drm_edid conversions Jani Nikula
                   ` (9 preceding siblings ...)
  2023-04-21 11:47 ` [Intel-gfx] [PATCH 10/13] drm/i915/lvds: switch to drm_edid_read_switcheroo() Jani Nikula
@ 2023-04-21 11:47 ` Jani Nikula
  2023-05-29 13:11   ` Nautiyal, Ankit K
  2023-04-21 11:47 ` [Intel-gfx] [PATCH 12/13] drm/display/dp_mst: convert to struct drm_edid Jani Nikula
                   ` (4 subsequent siblings)
  15 siblings, 1 reply; 31+ messages in thread
From: Jani Nikula @ 2023-04-21 11:47 UTC (permalink / raw)
  To: intel-gfx; +Cc: jani.nikula

It's a bit tedious to check for NULL before calling
drm_edid_duplicate(). Make it handle NULL parameter graciously.

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/drm_edid.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 941f3d53a701..e0dbd9140726 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -2881,6 +2881,9 @@ EXPORT_SYMBOL(drm_edid_read_switcheroo);
  */
 struct edid *drm_edid_duplicate(const struct edid *edid)
 {
+	if (!edid)
+		return NULL;
+
 	return kmemdup(edid, edid_size(edid), GFP_KERNEL);
 }
 EXPORT_SYMBOL(drm_edid_duplicate);
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [Intel-gfx] [PATCH 12/13] drm/display/dp_mst: convert to struct drm_edid
  2023-04-21 11:47 [Intel-gfx] [PATCH 00/13] drm/display & drm/i915: more struct drm_edid conversions Jani Nikula
                   ` (10 preceding siblings ...)
  2023-04-21 11:47 ` [Intel-gfx] [PATCH 11/13] drm/edid: make drm_edid_duplicate() safe to call with NULL parameter Jani Nikula
@ 2023-04-21 11:47 ` Jani Nikula
  2023-05-29 13:08   ` Nautiyal, Ankit K
  2023-04-21 11:47 ` [Intel-gfx] [PATCH 13/13] drm/i915/display: switch the rest of the connectors " Jani Nikula
                   ` (3 subsequent siblings)
  15 siblings, 1 reply; 31+ messages in thread
From: Jani Nikula @ 2023-04-21 11:47 UTC (permalink / raw)
  To: intel-gfx; +Cc: jani.nikula

Convert the topology manager to use struct drm_edid, add
drm_dp_mst_edid_read() that returns drm_edid, and rewrite the old
drm_dp_mst_get_edid() to use it.

Note that the old drm_get_edid() ended up calling
drm_connector_update_edid_property(). This responsibility is now
deferred to drivers, which all do it anyway after calling
drm_dp_mst_edid_read() or drm_dp_mst_get_edid().

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/display/drm_dp_mst_topology.c | 53 +++++++++++++++----
 include/drm/display/drm_dp_mst_helper.h       |  9 +++-
 2 files changed, 49 insertions(+), 13 deletions(-)

diff --git a/drivers/gpu/drm/display/drm_dp_mst_topology.c b/drivers/gpu/drm/display/drm_dp_mst_topology.c
index a2b8732db0c8..be71be95b706 100644
--- a/drivers/gpu/drm/display/drm_dp_mst_topology.c
+++ b/drivers/gpu/drm/display/drm_dp_mst_topology.c
@@ -1823,7 +1823,7 @@ static void drm_dp_destroy_port(struct kref *kref)
 		return;
 	}
 
-	kfree(port->cached_edid);
+	drm_edid_free(port->cached_edid);
 
 	/*
 	 * we can't destroy the connector here, as we might be holding the
@@ -2272,8 +2272,8 @@ drm_dp_mst_port_add_connector(struct drm_dp_mst_branch *mstb,
 	if (port->pdt != DP_PEER_DEVICE_NONE &&
 	    drm_dp_mst_is_end_device(port->pdt, port->mcs) &&
 	    port->port_num >= DP_MST_LOGICAL_PORT_0)
-		port->cached_edid = drm_get_edid(port->connector,
-						 &port->aux.ddc);
+		port->cached_edid = drm_edid_read_ddc(port->connector,
+						      &port->aux.ddc);
 
 	drm_connector_register(port->connector);
 	return;
@@ -4133,7 +4133,7 @@ drm_dp_mst_detect_port(struct drm_connector *connector,
 		ret = connector_status_connected;
 		/* for logical ports - cache the EDID */
 		if (port->port_num >= DP_MST_LOGICAL_PORT_0 && !port->cached_edid)
-			port->cached_edid = drm_get_edid(connector, &port->aux.ddc);
+			port->cached_edid = drm_edid_read_ddc(connector, &port->aux.ddc);
 		break;
 	case DP_PEER_DEVICE_DP_LEGACY_CONV:
 		if (port->ldps)
@@ -4147,7 +4147,7 @@ drm_dp_mst_detect_port(struct drm_connector *connector,
 EXPORT_SYMBOL(drm_dp_mst_detect_port);
 
 /**
- * drm_dp_mst_get_edid() - get EDID for an MST port
+ * drm_dp_mst_edid_read() - get EDID for an MST port
  * @connector: toplevel connector to get EDID for
  * @mgr: manager for this port
  * @port: unverified pointer to a port.
@@ -4156,9 +4156,11 @@ EXPORT_SYMBOL(drm_dp_mst_detect_port);
  * It validates the pointer still exists so the caller doesn't require a
  * reference.
  */
-struct edid *drm_dp_mst_get_edid(struct drm_connector *connector, struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port)
+const struct drm_edid *drm_dp_mst_edid_read(struct drm_connector *connector,
+					    struct drm_dp_mst_topology_mgr *mgr,
+					    struct drm_dp_mst_port *port)
 {
-	struct edid *edid = NULL;
+	const struct drm_edid *drm_edid;
 
 	/* we need to search for the port in the mgr in case it's gone */
 	port = drm_dp_mst_topology_get_port_validated(mgr, port);
@@ -4166,12 +4168,41 @@ struct edid *drm_dp_mst_get_edid(struct drm_connector *connector, struct drm_dp_
 		return NULL;
 
 	if (port->cached_edid)
-		edid = drm_edid_duplicate(port->cached_edid);
-	else {
-		edid = drm_get_edid(connector, &port->aux.ddc);
-	}
+		drm_edid = drm_edid_dup(port->cached_edid);
+	else
+		drm_edid = drm_edid_read_ddc(connector, &port->aux.ddc);
 
 	drm_dp_mst_topology_put_port(port);
+
+	return drm_edid;
+}
+EXPORT_SYMBOL(drm_dp_mst_edid_read);
+
+/**
+ * drm_dp_mst_get_edid() - get EDID for an MST port
+ * @connector: toplevel connector to get EDID for
+ * @mgr: manager for this port
+ * @port: unverified pointer to a port.
+ *
+ * This function is deprecated; please use drm_dp_mst_edid_read() instead.
+ *
+ * This returns an EDID for the port connected to a connector,
+ * It validates the pointer still exists so the caller doesn't require a
+ * reference.
+ */
+struct edid *drm_dp_mst_get_edid(struct drm_connector *connector,
+				 struct drm_dp_mst_topology_mgr *mgr,
+				 struct drm_dp_mst_port *port)
+{
+	const struct drm_edid *drm_edid;
+	struct edid *edid;
+
+	drm_edid = drm_dp_mst_edid_read(connector, mgr, port);
+
+	edid = drm_edid_duplicate(drm_edid_raw(drm_edid));
+
+	drm_edid_free(drm_edid);
+
 	return edid;
 }
 EXPORT_SYMBOL(drm_dp_mst_get_edid);
diff --git a/include/drm/display/drm_dp_mst_helper.h b/include/drm/display/drm_dp_mst_helper.h
index 5be96a158ab2..f962e97880b4 100644
--- a/include/drm/display/drm_dp_mst_helper.h
+++ b/include/drm/display/drm_dp_mst_helper.h
@@ -138,7 +138,7 @@ struct drm_dp_mst_port {
 	 * @cached_edid: for DP logical ports - make tiling work by ensuring
 	 * that the EDID for all connectors is read immediately.
 	 */
-	struct edid *cached_edid;
+	const struct drm_edid *cached_edid;
 
 	/**
 	 * @fec_capable: bool indicating if FEC can be supported up to that
@@ -819,7 +819,12 @@ drm_dp_mst_detect_port(struct drm_connector *connector,
 		       struct drm_dp_mst_topology_mgr *mgr,
 		       struct drm_dp_mst_port *port);
 
-struct edid *drm_dp_mst_get_edid(struct drm_connector *connector, struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port);
+const struct drm_edid *drm_dp_mst_edid_read(struct drm_connector *connector,
+					    struct drm_dp_mst_topology_mgr *mgr,
+					    struct drm_dp_mst_port *port);
+struct edid *drm_dp_mst_get_edid(struct drm_connector *connector,
+				 struct drm_dp_mst_topology_mgr *mgr,
+				 struct drm_dp_mst_port *port);
 
 int drm_dp_get_vc_payload_bw(const struct drm_dp_mst_topology_mgr *mgr,
 			     int link_rate, int link_lane_count);
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [Intel-gfx] [PATCH 13/13] drm/i915/display: switch the rest of the connectors to struct drm_edid
  2023-04-21 11:47 [Intel-gfx] [PATCH 00/13] drm/display & drm/i915: more struct drm_edid conversions Jani Nikula
                   ` (11 preceding siblings ...)
  2023-04-21 11:47 ` [Intel-gfx] [PATCH 12/13] drm/display/dp_mst: convert to struct drm_edid Jani Nikula
@ 2023-04-21 11:47 ` Jani Nikula
  2023-05-30  4:38   ` Nautiyal, Ankit K
  2023-04-21 14:11 ` [Intel-gfx] ✗ Fi.CI.SPARSE: warning for drm/display & drm/i915: more struct drm_edid conversions Patchwork
                   ` (2 subsequent siblings)
  15 siblings, 1 reply; 31+ messages in thread
From: Jani Nikula @ 2023-04-21 11:47 UTC (permalink / raw)
  To: intel-gfx; +Cc: jani.nikula

Convert the remaining uses of struct edid based drm_get_edid(),
drm_connector_update_edid_property() and drm_add_edid_modes() calls to
the struct drm_edid based drm_edid_read_ddc(),
drm_edid_connector_update() and drm_edid_connector_add_modes().

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 .../gpu/drm/i915/display/intel_connector.c    | 18 ++---
 .../gpu/drm/i915/display/intel_connector.h    |  4 +-
 drivers/gpu/drm/i915/display/intel_crt.c      | 34 +++++----
 drivers/gpu/drm/i915/display/intel_dp_mst.c   | 10 ++-
 drivers/gpu/drm/i915/display/intel_sdvo.c     | 73 ++++++++++---------
 5 files changed, 74 insertions(+), 65 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_connector.c b/drivers/gpu/drm/i915/display/intel_connector.c
index 257afac34839..00ea71b03ec7 100644
--- a/drivers/gpu/drm/i915/display/intel_connector.c
+++ b/drivers/gpu/drm/i915/display/intel_connector.c
@@ -176,15 +176,15 @@ enum pipe intel_connector_get_pipe(struct intel_connector *connector)
 /**
  * intel_connector_update_modes - update connector from edid
  * @connector: DRM connector device to use
- * @edid: previously read EDID information
+ * @drm_edid: previously read EDID information
  */
 int intel_connector_update_modes(struct drm_connector *connector,
-				struct edid *edid)
+				 const struct drm_edid *drm_edid)
 {
 	int ret;
 
-	drm_connector_update_edid_property(connector, edid);
-	ret = drm_add_edid_modes(connector, edid);
+	drm_edid_connector_update(connector, drm_edid);
+	ret = drm_edid_connector_add_modes(connector);
 
 	return ret;
 }
@@ -199,15 +199,15 @@ int intel_connector_update_modes(struct drm_connector *connector,
 int intel_ddc_get_modes(struct drm_connector *connector,
 			struct i2c_adapter *adapter)
 {
-	struct edid *edid;
+	const struct drm_edid *drm_edid;
 	int ret;
 
-	edid = drm_get_edid(connector, adapter);
-	if (!edid)
+	drm_edid = drm_edid_read_ddc(connector, adapter);
+	if (!drm_edid)
 		return 0;
 
-	ret = intel_connector_update_modes(connector, edid);
-	kfree(edid);
+	ret = intel_connector_update_modes(connector, drm_edid);
+	drm_edid_free(drm_edid);
 
 	return ret;
 }
diff --git a/drivers/gpu/drm/i915/display/intel_connector.h b/drivers/gpu/drm/i915/display/intel_connector.h
index 9d2bc261b204..aaf7281462dc 100644
--- a/drivers/gpu/drm/i915/display/intel_connector.h
+++ b/drivers/gpu/drm/i915/display/intel_connector.h
@@ -9,7 +9,7 @@
 #include <linux/types.h>
 
 struct drm_connector;
-struct edid;
+struct drm_edid;
 struct i2c_adapter;
 struct intel_connector;
 struct intel_encoder;
@@ -25,7 +25,7 @@ void intel_connector_attach_encoder(struct intel_connector *connector,
 bool intel_connector_get_hw_state(struct intel_connector *connector);
 enum pipe intel_connector_get_pipe(struct intel_connector *connector);
 int intel_connector_update_modes(struct drm_connector *connector,
-				 struct edid *edid);
+				 const struct drm_edid *drm_edid);
 int intel_ddc_get_modes(struct drm_connector *c, struct i2c_adapter *adapter);
 void intel_attach_force_audio_property(struct drm_connector *connector);
 void intel_attach_broadcast_rgb_property(struct drm_connector *connector);
diff --git a/drivers/gpu/drm/i915/display/intel_crt.c b/drivers/gpu/drm/i915/display/intel_crt.c
index 13519f78cf9f..c198145effd1 100644
--- a/drivers/gpu/drm/i915/display/intel_crt.c
+++ b/drivers/gpu/drm/i915/display/intel_crt.c
@@ -607,37 +607,38 @@ static bool intel_crt_detect_hotplug(struct drm_connector *connector)
 	return ret;
 }
 
-static struct edid *intel_crt_get_edid(struct drm_connector *connector,
-				struct i2c_adapter *i2c)
+static const struct drm_edid *intel_crt_get_edid(struct drm_connector *connector,
+						 struct i2c_adapter *i2c)
 {
-	struct edid *edid;
+	const struct drm_edid *drm_edid;
 
-	edid = drm_get_edid(connector, i2c);
+	drm_edid = drm_edid_read_ddc(connector, i2c);
 
-	if (!edid && !intel_gmbus_is_forced_bit(i2c)) {
+	if (!drm_edid && !intel_gmbus_is_forced_bit(i2c)) {
 		drm_dbg_kms(connector->dev,
 			    "CRT GMBUS EDID read failed, retry using GPIO bit-banging\n");
 		intel_gmbus_force_bit(i2c, true);
-		edid = drm_get_edid(connector, i2c);
+		drm_edid = drm_edid_read_ddc(connector, i2c);
 		intel_gmbus_force_bit(i2c, false);
 	}
 
-	return edid;
+	return drm_edid;
 }
 
 /* local version of intel_ddc_get_modes() to use intel_crt_get_edid() */
 static int intel_crt_ddc_get_modes(struct drm_connector *connector,
 				struct i2c_adapter *adapter)
 {
-	struct edid *edid;
+	const struct drm_edid *drm_edid;
 	int ret;
 
-	edid = intel_crt_get_edid(connector, adapter);
-	if (!edid)
+	drm_edid = intel_crt_get_edid(connector, adapter);
+	if (!drm_edid)
 		return 0;
 
-	ret = intel_connector_update_modes(connector, edid);
-	kfree(edid);
+	ret = intel_connector_update_modes(connector, drm_edid);
+
+	drm_edid_free(drm_edid);
 
 	return ret;
 }
@@ -646,14 +647,15 @@ static bool intel_crt_detect_ddc(struct drm_connector *connector)
 {
 	struct intel_crt *crt = intel_attached_crt(to_intel_connector(connector));
 	struct drm_i915_private *dev_priv = to_i915(crt->base.base.dev);
-	struct edid *edid;
+	const struct drm_edid *drm_edid;
 	struct i2c_adapter *i2c;
 	bool ret = false;
 
 	i2c = intel_gmbus_get_adapter(dev_priv, dev_priv->display.vbt.crt_ddc_pin);
-	edid = intel_crt_get_edid(connector, i2c);
+	drm_edid = intel_crt_get_edid(connector, i2c);
 
-	if (edid) {
+	if (drm_edid) {
+		const struct edid *edid = drm_edid_raw(drm_edid);
 		bool is_digital = edid->input & DRM_EDID_INPUT_DIGITAL;
 
 		/*
@@ -674,7 +676,7 @@ static bool intel_crt_detect_ddc(struct drm_connector *connector)
 			    "CRT not detected via DDC:0x50 [no valid EDID found]\n");
 	}
 
-	kfree(edid);
+	drm_edid_free(drm_edid);
 
 	return ret;
 }
diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c b/drivers/gpu/drm/i915/display/intel_dp_mst.c
index 506118a13866..deb926c2c1c7 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
@@ -837,15 +837,17 @@ static int intel_dp_mst_get_ddc_modes(struct drm_connector *connector)
 {
 	struct intel_connector *intel_connector = to_intel_connector(connector);
 	struct intel_dp *intel_dp = intel_connector->mst_port;
-	struct edid *edid;
+	const struct drm_edid *drm_edid;
 	int ret;
 
 	if (drm_connector_is_unregistered(connector))
 		return intel_connector_update_modes(connector, NULL);
 
-	edid = drm_dp_mst_get_edid(connector, &intel_dp->mst_mgr, intel_connector->port);
-	ret = intel_connector_update_modes(connector, edid);
-	kfree(edid);
+	drm_edid = drm_dp_mst_edid_read(connector, &intel_dp->mst_mgr, intel_connector->port);
+
+	ret = intel_connector_update_modes(connector, drm_edid);
+
+	drm_edid_free(drm_edid);
 
 	return ret;
 }
diff --git a/drivers/gpu/drm/i915/display/intel_sdvo.c b/drivers/gpu/drm/i915/display/intel_sdvo.c
index 0f0c1733cd0d..cdd8adbd5432 100644
--- a/drivers/gpu/drm/i915/display/intel_sdvo.c
+++ b/drivers/gpu/drm/i915/display/intel_sdvo.c
@@ -2035,22 +2035,23 @@ intel_sdvo_multifunc_encoder(struct intel_sdvo *intel_sdvo)
 	return hweight16(intel_sdvo->caps.output_flags) > 1;
 }
 
-static struct edid *
+static const struct drm_edid *
 intel_sdvo_get_edid(struct drm_connector *connector)
 {
 	struct intel_sdvo *sdvo = intel_attached_sdvo(to_intel_connector(connector));
-	return drm_get_edid(connector, &sdvo->ddc);
+	return drm_edid_read_ddc(connector, &sdvo->ddc);
 }
 
 /* Mac mini hack -- use the same DDC as the analog connector */
-static struct edid *
+static const struct drm_edid *
 intel_sdvo_get_analog_edid(struct drm_connector *connector)
 {
-	struct drm_i915_private *dev_priv = to_i915(connector->dev);
+	struct drm_i915_private *i915 = to_i915(connector->dev);
+	struct i2c_adapter *i2c;
 
-	return drm_get_edid(connector,
-			    intel_gmbus_get_adapter(dev_priv,
-						    dev_priv->display.vbt.crt_ddc_pin));
+	i2c = intel_gmbus_get_adapter(i915, i915->display.vbt.crt_ddc_pin);
+
+	return drm_edid_read_ddc(connector, i2c);
 }
 
 static enum drm_connector_status
@@ -2058,11 +2059,11 @@ intel_sdvo_tmds_sink_detect(struct drm_connector *connector)
 {
 	struct intel_sdvo *intel_sdvo = intel_attached_sdvo(to_intel_connector(connector));
 	enum drm_connector_status status;
-	struct edid *edid;
+	const struct drm_edid *drm_edid;
 
-	edid = intel_sdvo_get_edid(connector);
+	drm_edid = intel_sdvo_get_edid(connector);
 
-	if (edid == NULL && intel_sdvo_multifunc_encoder(intel_sdvo)) {
+	if (!drm_edid && intel_sdvo_multifunc_encoder(intel_sdvo)) {
 		u8 ddc, saved_ddc = intel_sdvo->ddc_bus;
 
 		/*
@@ -2071,15 +2072,15 @@ intel_sdvo_tmds_sink_detect(struct drm_connector *connector)
 		 */
 		for (ddc = intel_sdvo->ddc_bus >> 1; ddc > 1; ddc >>= 1) {
 			intel_sdvo->ddc_bus = ddc;
-			edid = intel_sdvo_get_edid(connector);
-			if (edid)
+			drm_edid = intel_sdvo_get_edid(connector);
+			if (drm_edid)
 				break;
 		}
 		/*
 		 * If we found the EDID on the other bus,
 		 * assume that is the correct DDC bus.
 		 */
-		if (edid == NULL)
+		if (!drm_edid)
 			intel_sdvo->ddc_bus = saved_ddc;
 	}
 
@@ -2087,17 +2088,19 @@ intel_sdvo_tmds_sink_detect(struct drm_connector *connector)
 	 * When there is no edid and no monitor is connected with VGA
 	 * port, try to use the CRT ddc to read the EDID for DVI-connector.
 	 */
-	if (edid == NULL)
-		edid = intel_sdvo_get_analog_edid(connector);
+	if (!drm_edid)
+		drm_edid = intel_sdvo_get_analog_edid(connector);
 
 	status = connector_status_unknown;
-	if (edid != NULL) {
+	if (drm_edid) {
+		const struct edid *edid = drm_edid_raw(drm_edid);
+
 		/* DDC bus is shared, match EDID to connector type */
 		if (edid->input & DRM_EDID_INPUT_DIGITAL)
 			status = connector_status_connected;
 		else
 			status = connector_status_disconnected;
-		kfree(edid);
+		drm_edid_free(drm_edid);
 	}
 
 	return status;
@@ -2105,8 +2108,9 @@ intel_sdvo_tmds_sink_detect(struct drm_connector *connector)
 
 static bool
 intel_sdvo_connector_matches_edid(struct intel_sdvo_connector *sdvo,
-				  struct edid *edid)
+				  const struct drm_edid *drm_edid)
 {
+	const struct edid *edid = drm_edid_raw(drm_edid);
 	bool monitor_is_digital = !!(edid->input & DRM_EDID_INPUT_DIGITAL);
 	bool connector_is_digital = !!IS_DIGITAL(sdvo);
 
@@ -2149,22 +2153,23 @@ intel_sdvo_detect(struct drm_connector *connector, bool force)
 	else if (IS_TMDS(intel_sdvo_connector))
 		ret = intel_sdvo_tmds_sink_detect(connector);
 	else {
-		struct edid *edid;
+		const struct drm_edid *drm_edid;
 
 		/* if we have an edid check it matches the connection */
-		edid = intel_sdvo_get_edid(connector);
-		if (edid == NULL)
-			edid = intel_sdvo_get_analog_edid(connector);
-		if (edid != NULL) {
+		drm_edid = intel_sdvo_get_edid(connector);
+		if (!drm_edid)
+			drm_edid = intel_sdvo_get_analog_edid(connector);
+		if (drm_edid) {
 			if (intel_sdvo_connector_matches_edid(intel_sdvo_connector,
-							      edid))
+							      drm_edid))
 				ret = connector_status_connected;
 			else
 				ret = connector_status_disconnected;
 
-			kfree(edid);
-		} else
+			drm_edid_free(drm_edid);
+		} else {
 			ret = connector_status_connected;
+		}
 	}
 
 	return ret;
@@ -2173,13 +2178,13 @@ intel_sdvo_detect(struct drm_connector *connector, bool force)
 static int intel_sdvo_get_ddc_modes(struct drm_connector *connector)
 {
 	int num_modes = 0;
-	struct edid *edid;
+	const struct drm_edid *drm_edid;
 
 	DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
 		      connector->base.id, connector->name);
 
 	/* set the bus switch and get the modes */
-	edid = intel_sdvo_get_edid(connector);
+	drm_edid = intel_sdvo_get_edid(connector);
 
 	/*
 	 * Mac mini hack.  On this device, the DVI-I connector shares one DDC
@@ -2187,17 +2192,17 @@ static int intel_sdvo_get_ddc_modes(struct drm_connector *connector)
 	 * DDC fails, check to see if the analog output is disconnected, in
 	 * which case we'll look there for the digital DDC data.
 	 */
-	if (!edid)
-		edid = intel_sdvo_get_analog_edid(connector);
+	if (!drm_edid)
+		drm_edid = intel_sdvo_get_analog_edid(connector);
 
-	if (!edid)
+	if (!drm_edid)
 		return 0;
 
 	if (intel_sdvo_connector_matches_edid(to_intel_sdvo_connector(connector),
-					      edid))
-		num_modes += intel_connector_update_modes(connector, edid);
+					      drm_edid))
+		num_modes += intel_connector_update_modes(connector, drm_edid);
 
-	kfree(edid);
+	drm_edid_free(drm_edid);
 
 	return num_modes;
 }
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [Intel-gfx] ✗ Fi.CI.SPARSE: warning for drm/display & drm/i915: more struct drm_edid conversions
  2023-04-21 11:47 [Intel-gfx] [PATCH 00/13] drm/display & drm/i915: more struct drm_edid conversions Jani Nikula
                   ` (12 preceding siblings ...)
  2023-04-21 11:47 ` [Intel-gfx] [PATCH 13/13] drm/i915/display: switch the rest of the connectors " Jani Nikula
@ 2023-04-21 14:11 ` Patchwork
  2023-04-21 14:21 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork
  2023-04-21 22:34 ` [Intel-gfx] ✗ Fi.CI.IGT: failure " Patchwork
  15 siblings, 0 replies; 31+ messages in thread
From: Patchwork @ 2023-04-21 14:11 UTC (permalink / raw)
  To: Jani Nikula; +Cc: intel-gfx

== Series Details ==

Series: drm/display & drm/i915: more struct drm_edid conversions
URL   : https://patchwork.freedesktop.org/series/116813/
State : warning

== Summary ==

Error: dim sparse failed
Sparse version: v0.6.2
Fast mode used, each commit won't be checked separately.



^ permalink raw reply	[flat|nested] 31+ messages in thread

* [Intel-gfx] ✓ Fi.CI.BAT: success for drm/display & drm/i915: more struct drm_edid conversions
  2023-04-21 11:47 [Intel-gfx] [PATCH 00/13] drm/display & drm/i915: more struct drm_edid conversions Jani Nikula
                   ` (13 preceding siblings ...)
  2023-04-21 14:11 ` [Intel-gfx] ✗ Fi.CI.SPARSE: warning for drm/display & drm/i915: more struct drm_edid conversions Patchwork
@ 2023-04-21 14:21 ` Patchwork
  2023-04-21 22:34 ` [Intel-gfx] ✗ Fi.CI.IGT: failure " Patchwork
  15 siblings, 0 replies; 31+ messages in thread
From: Patchwork @ 2023-04-21 14:21 UTC (permalink / raw)
  To: Jani Nikula; +Cc: intel-gfx

[-- Attachment #1: Type: text/plain, Size: 3992 bytes --]

== Series Details ==

Series: drm/display & drm/i915: more struct drm_edid conversions
URL   : https://patchwork.freedesktop.org/series/116813/
State : success

== Summary ==

CI Bug Log - changes from CI_DRM_13041 -> Patchwork_116813v1
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

  External URL: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_116813v1/index.html

Participating hosts (37 -> 36)
------------------------------

  Missing    (1): fi-snb-2520m 

Known issues
------------

  Here are the changes found in Patchwork_116813v1 that come from known issues:

### IGT changes ###

#### Issues hit ####

  * igt@kms_pipe_crc_basic@read-crc:
    - bat-adlp-9:         NOTRUN -> [SKIP][1] ([i915#3546]) +1 similar issue
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_116813v1/bat-adlp-9/igt@kms_pipe_crc_basic@read-crc.html

  
#### Possible fixes ####

  * igt@gem_exec_parallel@engines@basic:
    - {bat-mtlp-8}:       [FAIL][2] -> [PASS][3]
   [2]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13041/bat-mtlp-8/igt@gem_exec_parallel@engines@basic.html
   [3]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_116813v1/bat-mtlp-8/igt@gem_exec_parallel@engines@basic.html

  * igt@i915_suspend@basic-s2idle-without-i915:
    - fi-bsw-n3050:       [DMESG-WARN][4] ([i915#1982]) -> [PASS][5]
   [4]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13041/fi-bsw-n3050/igt@i915_suspend@basic-s2idle-without-i915.html
   [5]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_116813v1/fi-bsw-n3050/igt@i915_suspend@basic-s2idle-without-i915.html

  
#### Warnings ####

  * igt@i915_selftest@live@slpc:
    - bat-rpls-1:         [DMESG-FAIL][6] ([i915#6997]) -> [DMESG-FAIL][7] ([i915#6367] / [i915#7996])
   [6]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13041/bat-rpls-1/igt@i915_selftest@live@slpc.html
   [7]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_116813v1/bat-rpls-1/igt@i915_selftest@live@slpc.html

  
  {name}: This element is suppressed. This means it is ignored when computing
          the status of the difference (SUCCESS, WARNING, or FAILURE).

  [i915#1982]: https://gitlab.freedesktop.org/drm/intel/issues/1982
  [i915#3546]: https://gitlab.freedesktop.org/drm/intel/issues/3546
  [i915#6367]: https://gitlab.freedesktop.org/drm/intel/issues/6367
  [i915#6997]: https://gitlab.freedesktop.org/drm/intel/issues/6997
  [i915#7996]: https://gitlab.freedesktop.org/drm/intel/issues/7996


Build changes
-------------

  * Linux: CI_DRM_13041 -> Patchwork_116813v1

  CI-20190529: 20190529
  CI_DRM_13041: a172f81b6b3534fd9e5c1e0f25764fceabdd8343 @ git://anongit.freedesktop.org/gfx-ci/linux
  IGT_7264: 2f0a07378e58e5c7d7b589b39ace7e3a2317f6b2 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
  Patchwork_116813v1: a172f81b6b3534fd9e5c1e0f25764fceabdd8343 @ git://anongit.freedesktop.org/gfx-ci/linux


### Linux commits

06b49e8d44ec drm/i915/display: switch the rest of the connectors to struct drm_edid
7a23607a15a2 drm/display/dp_mst: convert to struct drm_edid
72c89e375955 drm/edid: make drm_edid_duplicate() safe to call with NULL parameter
a73fb9511920 drm/i915/lvds: switch to drm_edid_read_switcheroo()
965b828ff6ce drm/edid: add drm_edid_read_switcheroo()
2b018fb0546b drm/i915/sdvo: stop caching has_hdmi_audio in struct intel_sdvo
fb9b63218d7f drm/i915/sdvo: stop caching has_hdmi_monitor in struct intel_sdvo
a30cbde3e239 drm/i915/hdmi: stop caching has_hdmi_sink in struct intel_hdmi
e2747783cf4e drm/i915/hdmi: stop caching has_audio in struct intel_hdmi
36c08f927f1a drm/i915/dp: stop caching has_hdmi_sink in struct intel_dp
3bf07467679e drm/i915/dp: stop caching has_audio in struct intel_dp
5a4029334bdf drm/display/dp_mst: drop has_audio from struct drm_dp_mst_port
9f8cc0d0be0f drm/edid: parse display info has_audio similar to is_hdmi

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_116813v1/index.html

[-- Attachment #2: Type: text/html, Size: 4759 bytes --]

^ permalink raw reply	[flat|nested] 31+ messages in thread

* [Intel-gfx] ✗ Fi.CI.IGT: failure for drm/display & drm/i915: more struct drm_edid conversions
  2023-04-21 11:47 [Intel-gfx] [PATCH 00/13] drm/display & drm/i915: more struct drm_edid conversions Jani Nikula
                   ` (14 preceding siblings ...)
  2023-04-21 14:21 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork
@ 2023-04-21 22:34 ` Patchwork
  15 siblings, 0 replies; 31+ messages in thread
From: Patchwork @ 2023-04-21 22:34 UTC (permalink / raw)
  To: Jani Nikula; +Cc: intel-gfx

[-- Attachment #1: Type: text/plain, Size: 12997 bytes --]

== Series Details ==

Series: drm/display & drm/i915: more struct drm_edid conversions
URL   : https://patchwork.freedesktop.org/series/116813/
State : failure

== Summary ==

CI Bug Log - changes from CI_DRM_13041_full -> Patchwork_116813v1_full
====================================================

Summary
-------

  **FAILURE**

  Serious unknown changes coming with Patchwork_116813v1_full absolutely need to be
  verified manually.
  
  If you think the reported changes have nothing to do with the changes
  introduced in Patchwork_116813v1_full, please notify your bug team to allow them
  to document this new failure mode, which will reduce false positives in CI.

  

Participating hosts (7 -> 7)
------------------------------

  No changes in participating hosts

Possible new issues
-------------------

  Here are the unknown changes that may have been introduced in Patchwork_116813v1_full:

### IGT changes ###

#### Possible regressions ####

  * igt@kms_frontbuffer_tracking@fbc-1p-primscrn-cur-indfb-draw-blt:
    - shard-apl:          [PASS][1] -> [DMESG-WARN][2] +9 similar issues
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13041/shard-apl4/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-cur-indfb-draw-blt.html
   [2]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_116813v1/shard-apl1/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-cur-indfb-draw-blt.html

  
Known issues
------------

  Here are the changes found in Patchwork_116813v1_full that come from known issues:

### IGT changes ###

#### Issues hit ####

  * igt@gem_barrier_race@remote-request@rcs0:
    - shard-apl:          [PASS][3] -> [ABORT][4] ([i915#8211] / [i915#8234])
   [3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13041/shard-apl3/igt@gem_barrier_race@remote-request@rcs0.html
   [4]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_116813v1/shard-apl4/igt@gem_barrier_race@remote-request@rcs0.html

  * igt@i915_module_load@reload:
    - shard-apl:          [PASS][5] -> [DMESG-WARN][6] ([i915#180] / [i915#62] / [i915#7634])
   [5]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13041/shard-apl4/igt@i915_module_load@reload.html
   [6]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_116813v1/shard-apl1/igt@i915_module_load@reload.html

  * igt@kms_cursor_crc@cursor-onscreen-128x128@pipe-c-dp-1:
    - shard-apl:          [PASS][7] -> [DMESG-WARN][8] ([i915#180] / [i915#62]) +32 similar issues
   [7]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13041/shard-apl4/igt@kms_cursor_crc@cursor-onscreen-128x128@pipe-c-dp-1.html
   [8]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_116813v1/shard-apl1/igt@kms_cursor_crc@cursor-onscreen-128x128@pipe-c-dp-1.html

  * igt@kms_frontbuffer_tracking@fbc-1p-primscrn-pri-shrfb-draw-mmap-wc:
    - shard-apl:          [PASS][9] -> [DMESG-WARN][10] ([i915#180])
   [9]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13041/shard-apl4/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-pri-shrfb-draw-mmap-wc.html
   [10]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_116813v1/shard-apl1/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-pri-shrfb-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@fbc-rgb101010-draw-mmap-cpu:
    - shard-apl:          [PASS][11] -> [DMESG-WARN][12] ([i915#1982])
   [11]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13041/shard-apl4/igt@kms_frontbuffer_tracking@fbc-rgb101010-draw-mmap-cpu.html
   [12]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_116813v1/shard-apl1/igt@kms_frontbuffer_tracking@fbc-rgb101010-draw-mmap-cpu.html

  * igt@kms_plane_scaling@plane-upscale-with-modifiers-factor-0-25@pipe-b-hdmi-a-1:
    - shard-snb:          NOTRUN -> [SKIP][13] ([fdo#109271]) +27 similar issues
   [13]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_116813v1/shard-snb1/igt@kms_plane_scaling@plane-upscale-with-modifiers-factor-0-25@pipe-b-hdmi-a-1.html

  
#### Possible fixes ####

  * igt@drm_fdinfo@most-busy-idle-check-all@rcs0:
    - {shard-rkl}:        [FAIL][14] ([i915#7742]) -> [PASS][15]
   [14]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13041/shard-rkl-1/igt@drm_fdinfo@most-busy-idle-check-all@rcs0.html
   [15]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_116813v1/shard-rkl-3/igt@drm_fdinfo@most-busy-idle-check-all@rcs0.html

  * igt@gem_exec_fair@basic-deadline:
    - shard-glk:          [FAIL][16] ([i915#2846]) -> [PASS][17]
   [16]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13041/shard-glk1/igt@gem_exec_fair@basic-deadline.html
   [17]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_116813v1/shard-glk1/igt@gem_exec_fair@basic-deadline.html

  * igt@gem_exec_fair@basic-none@bcs0:
    - {shard-rkl}:        [FAIL][18] ([i915#2842]) -> [PASS][19]
   [18]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13041/shard-rkl-3/igt@gem_exec_fair@basic-none@bcs0.html
   [19]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_116813v1/shard-rkl-4/igt@gem_exec_fair@basic-none@bcs0.html

  * igt@gem_exec_fair@basic-pace-solo@rcs0:
    - shard-apl:          [FAIL][20] ([i915#2842]) -> [PASS][21] +1 similar issue
   [20]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13041/shard-apl6/igt@gem_exec_fair@basic-pace-solo@rcs0.html
   [21]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_116813v1/shard-apl4/igt@gem_exec_fair@basic-pace-solo@rcs0.html

  * igt@gem_exec_fair@basic-pace@vecs0:
    - shard-glk:          [FAIL][22] ([i915#2842]) -> [PASS][23]
   [22]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13041/shard-glk9/igt@gem_exec_fair@basic-pace@vecs0.html
   [23]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_116813v1/shard-glk2/igt@gem_exec_fair@basic-pace@vecs0.html

  * igt@i915_pm_lpsp@kms-lpsp@kms-lpsp-hdmi-a:
    - {shard-rkl}:        [SKIP][24] ([i915#1937]) -> [PASS][25]
   [24]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13041/shard-rkl-4/igt@i915_pm_lpsp@kms-lpsp@kms-lpsp-hdmi-a.html
   [25]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_116813v1/shard-rkl-7/igt@i915_pm_lpsp@kms-lpsp@kms-lpsp-hdmi-a.html

  * igt@i915_pm_rpm@dpms-non-lpsp:
    - {shard-rkl}:        [SKIP][26] ([i915#1397]) -> [PASS][27] +4 similar issues
   [26]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13041/shard-rkl-7/igt@i915_pm_rpm@dpms-non-lpsp.html
   [27]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_116813v1/shard-rkl-6/igt@i915_pm_rpm@dpms-non-lpsp.html

  * igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions-varying-size:
    - shard-apl:          [FAIL][28] ([i915#2346]) -> [PASS][29] +1 similar issue
   [28]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13041/shard-apl4/igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions-varying-size.html
   [29]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_116813v1/shard-apl2/igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions-varying-size.html

  * igt@kms_cursor_legacy@single-move@pipe-b:
    - {shard-rkl}:        [INCOMPLETE][30] ([i915#8011]) -> [PASS][31] +1 similar issue
   [30]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13041/shard-rkl-7/igt@kms_cursor_legacy@single-move@pipe-b.html
   [31]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_116813v1/shard-rkl-6/igt@kms_cursor_legacy@single-move@pipe-b.html

  * igt@kms_fbcon_fbt@fbc-suspend:
    - shard-apl:          [FAIL][32] ([i915#4767]) -> [PASS][33]
   [32]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13041/shard-apl1/igt@kms_fbcon_fbt@fbc-suspend.html
   [33]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_116813v1/shard-apl2/igt@kms_fbcon_fbt@fbc-suspend.html

  * igt@kms_plane_scaling@i915-max-src-size@pipe-a-hdmi-a-2:
    - {shard-rkl}:        [FAIL][34] ([i915#8292]) -> [PASS][35]
   [34]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13041/shard-rkl-3/igt@kms_plane_scaling@i915-max-src-size@pipe-a-hdmi-a-2.html
   [35]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_116813v1/shard-rkl-4/igt@kms_plane_scaling@i915-max-src-size@pipe-a-hdmi-a-2.html

  
  {name}: This element is suppressed. This means it is ignored when computing
          the status of the difference (SUCCESS, WARNING, or FAILURE).

  [fdo#109271]: https://bugs.freedesktop.org/show_bug.cgi?id=109271
  [fdo#109285]: https://bugs.freedesktop.org/show_bug.cgi?id=109285
  [fdo#111068]: https://bugs.freedesktop.org/show_bug.cgi?id=111068
  [fdo#111615]: https://bugs.freedesktop.org/show_bug.cgi?id=111615
  [fdo#111825]: https://bugs.freedesktop.org/show_bug.cgi?id=111825
  [i915#1072]: https://gitlab.freedesktop.org/drm/intel/issues/1072
  [i915#1397]: https://gitlab.freedesktop.org/drm/intel/issues/1397
  [i915#180]: https://gitlab.freedesktop.org/drm/intel/issues/180
  [i915#1937]: https://gitlab.freedesktop.org/drm/intel/issues/1937
  [i915#1982]: https://gitlab.freedesktop.org/drm/intel/issues/1982
  [i915#2346]: https://gitlab.freedesktop.org/drm/intel/issues/2346
  [i915#2527]: https://gitlab.freedesktop.org/drm/intel/issues/2527
  [i915#2575]: https://gitlab.freedesktop.org/drm/intel/issues/2575
  [i915#2587]: https://gitlab.freedesktop.org/drm/intel/issues/2587
  [i915#2672]: https://gitlab.freedesktop.org/drm/intel/issues/2672
  [i915#2705]: https://gitlab.freedesktop.org/drm/intel/issues/2705
  [i915#2842]: https://gitlab.freedesktop.org/drm/intel/issues/2842
  [i915#2846]: https://gitlab.freedesktop.org/drm/intel/issues/2846
  [i915#3281]: https://gitlab.freedesktop.org/drm/intel/issues/3281
  [i915#3282]: https://gitlab.freedesktop.org/drm/intel/issues/3282
  [i915#3458]: https://gitlab.freedesktop.org/drm/intel/issues/3458
  [i915#3539]: https://gitlab.freedesktop.org/drm/intel/issues/3539
  [i915#3555]: https://gitlab.freedesktop.org/drm/intel/issues/3555
  [i915#3591]: https://gitlab.freedesktop.org/drm/intel/issues/3591
  [i915#3638]: https://gitlab.freedesktop.org/drm/intel/issues/3638
  [i915#3689]: https://gitlab.freedesktop.org/drm/intel/issues/3689
  [i915#3708]: https://gitlab.freedesktop.org/drm/intel/issues/3708
  [i915#3886]: https://gitlab.freedesktop.org/drm/intel/issues/3886
  [i915#4077]: https://gitlab.freedesktop.org/drm/intel/issues/4077
  [i915#4083]: https://gitlab.freedesktop.org/drm/intel/issues/4083
  [i915#4098]: https://gitlab.freedesktop.org/drm/intel/issues/4098
  [i915#4270]: https://gitlab.freedesktop.org/drm/intel/issues/4270
  [i915#4538]: https://gitlab.freedesktop.org/drm/intel/issues/4538
  [i915#4565]: https://gitlab.freedesktop.org/drm/intel/issues/4565
  [i915#4579]: https://gitlab.freedesktop.org/drm/intel/issues/4579
  [i915#4767]: https://gitlab.freedesktop.org/drm/intel/issues/4767
  [i915#4771]: https://gitlab.freedesktop.org/drm/intel/issues/4771
  [i915#4833]: https://gitlab.freedesktop.org/drm/intel/issues/4833
  [i915#4852]: https://gitlab.freedesktop.org/drm/intel/issues/4852
  [i915#4860]: https://gitlab.freedesktop.org/drm/intel/issues/4860
  [i915#4936]: https://gitlab.freedesktop.org/drm/intel/issues/4936
  [i915#5176]: https://gitlab.freedesktop.org/drm/intel/issues/5176
  [i915#5235]: https://gitlab.freedesktop.org/drm/intel/issues/5235
  [i915#5286]: https://gitlab.freedesktop.org/drm/intel/issues/5286
  [i915#5325]: https://gitlab.freedesktop.org/drm/intel/issues/5325
  [i915#5354]: https://gitlab.freedesktop.org/drm/intel/issues/5354
  [i915#5461]: https://gitlab.freedesktop.org/drm/intel/issues/5461
  [i915#5493]: https://gitlab.freedesktop.org/drm/intel/issues/5493
  [i915#5563]: https://gitlab.freedesktop.org/drm/intel/issues/5563
  [i915#6095]: https://gitlab.freedesktop.org/drm/intel/issues/6095
  [i915#62]: https://gitlab.freedesktop.org/drm/intel/issues/62
  [i915#6301]: https://gitlab.freedesktop.org/drm/intel/issues/6301
  [i915#6334]: https://gitlab.freedesktop.org/drm/intel/issues/6334
  [i915#658]: https://gitlab.freedesktop.org/drm/intel/issues/658
  [i915#7634]: https://gitlab.freedesktop.org/drm/intel/issues/7634
  [i915#7711]: https://gitlab.freedesktop.org/drm/intel/issues/7711
  [i915#7742]: https://gitlab.freedesktop.org/drm/intel/issues/7742
  [i915#7828]: https://gitlab.freedesktop.org/drm/intel/issues/7828
  [i915#8011]: https://gitlab.freedesktop.org/drm/intel/issues/8011
  [i915#8211]: https://gitlab.freedesktop.org/drm/intel/issues/8211
  [i915#8228]: https://gitlab.freedesktop.org/drm/intel/issues/8228
  [i915#8234]: https://gitlab.freedesktop.org/drm/intel/issues/8234
  [i915#8292]: https://gitlab.freedesktop.org/drm/intel/issues/8292


Build changes
-------------

  * Linux: CI_DRM_13041 -> Patchwork_116813v1

  CI-20190529: 20190529
  CI_DRM_13041: a172f81b6b3534fd9e5c1e0f25764fceabdd8343 @ git://anongit.freedesktop.org/gfx-ci/linux
  IGT_7264: 2f0a07378e58e5c7d7b589b39ace7e3a2317f6b2 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
  Patchwork_116813v1: a172f81b6b3534fd9e5c1e0f25764fceabdd8343 @ git://anongit.freedesktop.org/gfx-ci/linux
  piglit_4509: fdc5a4ca11124ab8413c7988896eec4c97336694 @ git://anongit.freedesktop.org/piglit

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_116813v1/index.html

[-- Attachment #2: Type: text/html, Size: 11194 bytes --]

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [Intel-gfx] [PATCH 10/13] drm/i915/lvds: switch to drm_edid_read_switcheroo()
  2023-04-21 11:47 ` [Intel-gfx] [PATCH 10/13] drm/i915/lvds: switch to drm_edid_read_switcheroo() Jani Nikula
@ 2023-04-23  8:10   ` Lukas Wunner
  0 siblings, 0 replies; 31+ messages in thread
From: Lukas Wunner @ 2023-04-23  8:10 UTC (permalink / raw)
  To: Jani Nikula; +Cc: intel-gfx

On Fri, Apr 21, 2023 at 02:47:48PM +0300, Jani Nikula wrote:
> --- a/drivers/gpu/drm/i915/display/intel_lvds.c
> +++ b/drivers/gpu/drm/i915/display/intel_lvds.c
> @@ -943,17 +943,8 @@ void intel_lvds_init(struct drm_i915_private *i915)
>  	 */
>  	mutex_lock(&i915->drm.mode_config.mutex);
>  	if (vga_switcheroo_handler_flags() & VGA_SWITCHEROO_CAN_SWITCH_DDC) {
> -		const struct edid *edid;
> -
> -		/* FIXME: Make drm_get_edid_switcheroo() return drm_edid */
> -		edid = drm_get_edid_switcheroo(&connector->base,
> -					       intel_gmbus_get_adapter(i915, pin));
> -		if (edid) {
> -			drm_edid = drm_edid_alloc(edid, (edid->extensions + 1) * EDID_LENGTH);
> -			kfree(edid);
> -		} else {
> -			drm_edid = NULL;
> -		}
> +		drm_edid = drm_edid_read_switcheroo(&connector->base,
> +						    intel_gmbus_get_adapter(i915, pin));
>  	} else {
>  		drm_edid = drm_edid_read_ddc(&connector->base,
>  					     intel_gmbus_get_adapter(i915, pin));

No need for curly braces anymore, but regardless:

Reviewed-by: Lukas Wunner <lukas@wunner.de>

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [Intel-gfx] [PATCH 01/13] drm/edid: parse display info has_audio similar to is_hdmi
  2023-04-21 11:47 ` [Intel-gfx] [PATCH 01/13] drm/edid: parse display info has_audio similar to is_hdmi Jani Nikula
@ 2023-05-29  4:56   ` Nautiyal, Ankit K
  0 siblings, 0 replies; 31+ messages in thread
From: Nautiyal, Ankit K @ 2023-05-29  4:56 UTC (permalink / raw)
  To: Jani Nikula, intel-gfx

LGTM.

Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>

On 4/21/2023 5:17 PM, Jani Nikula wrote:
> Since we already iterate everything that's needed for determining audio,
> reduce the need to call drm_detect_monitor_audio() by storing has_audio
> to connector info.
>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
>   drivers/gpu/drm/drm_edid.c  | 6 ++++++
>   include/drm/drm_connector.h | 8 ++++++++
>   2 files changed, 14 insertions(+)
>
> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
> index 0454da505687..813ce00a106a 100644
> --- a/drivers/gpu/drm/drm_edid.c
> +++ b/drivers/gpu/drm/drm_edid.c
> @@ -6243,6 +6243,9 @@ static void drm_parse_cea_ext(struct drm_connector *connector,
>   			info->color_formats |= DRM_COLOR_FORMAT_YCBCR444;
>   		if (edid_ext[3] & EDID_CEA_YCRCB422)
>   			info->color_formats |= DRM_COLOR_FORMAT_YCBCR422;
> +		if (edid_ext[3] & EDID_BASIC_AUDIO)
> +			info->has_audio = true;
> +
>   	}
>   	drm_edid_iter_end(&edid_iter);
>   
> @@ -6268,6 +6271,8 @@ static void drm_parse_cea_ext(struct drm_connector *connector,
>   			drm_parse_hdr_metadata_block(connector, data);
>   		else if (cea_db_tag(db) == CTA_DB_VIDEO)
>   			parse_cta_vdb(connector, db);
> +		else if (cea_db_tag(db) == CTA_DB_AUDIO)
> +			info->has_audio = true;
>   	}
>   	cea_db_iter_end(&iter);
>   
> @@ -6424,6 +6429,7 @@ static void drm_reset_display_info(struct drm_connector *connector)
>   	info->max_tmds_clock = 0;
>   	info->dvi_dual = false;
>   	info->is_hdmi = false;
> +	info->has_audio = false;
>   	info->has_hdmi_infoframe = false;
>   	info->rgb_quant_range_selectable = false;
>   	memset(&info->hdmi, 0, sizeof(info->hdmi));
> diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h
> index 7b5048516185..c8be6a343589 100644
> --- a/include/drm/drm_connector.h
> +++ b/include/drm/drm_connector.h
> @@ -653,6 +653,14 @@ struct drm_display_info {
>   	 */
>   	bool is_hdmi;
>   
> +	/**
> +	 * @has_audio: True if the sink supports audio.
> +	 *
> +	 * This field shall be used instead of calling
> +	 * drm_detect_monitor_audio() when possible.
> +	 */
> +	bool has_audio;
> +
>   	/**
>   	 * @has_hdmi_infoframe: Does the sink support the HDMI infoframe?
>   	 */

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [Intel-gfx] [PATCH 02/13] drm/display/dp_mst: drop has_audio from struct drm_dp_mst_port
  2023-04-21 11:47 ` [Intel-gfx] [PATCH 02/13] drm/display/dp_mst: drop has_audio from struct drm_dp_mst_port Jani Nikula
@ 2023-05-29  5:10   ` Nautiyal, Ankit K
  0 siblings, 0 replies; 31+ messages in thread
From: Nautiyal, Ankit K @ 2023-05-29  5:10 UTC (permalink / raw)
  To: Jani Nikula, intel-gfx

LGTM.

Only minor difference I can see, is an extra message log for CEA audio 
formats, while using drm_detect_monitor_audio.

I am wondering, whether drm_detect_monitor_audio can be removed.

Anyways the change looks good to me.

Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>

On 4/21/2023 5:17 PM, Jani Nikula wrote:
> Caching the has_audio in struct drm_dp_mst_port seems odd, and oddly
> placed. Defer audio handling to drivers, and use the info from the
> connector display info. i915 was the only one using it anyway.
>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
>   drivers/gpu/drm/display/drm_dp_mst_topology.c        | 2 +-
>   drivers/gpu/drm/i915/display/intel_display_debugfs.c | 4 ++--
>   drivers/gpu/drm/i915/display/intel_dp_mst.c          | 2 +-
>   include/drm/display/drm_dp_mst_helper.h              | 5 -----
>   4 files changed, 4 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/gpu/drm/display/drm_dp_mst_topology.c b/drivers/gpu/drm/display/drm_dp_mst_topology.c
> index 38dab76ae69e..a2b8732db0c8 100644
> --- a/drivers/gpu/drm/display/drm_dp_mst_topology.c
> +++ b/drivers/gpu/drm/display/drm_dp_mst_topology.c
> @@ -4170,7 +4170,7 @@ struct edid *drm_dp_mst_get_edid(struct drm_connector *connector, struct drm_dp_
>   	else {
>   		edid = drm_get_edid(connector, &port->aux.ddc);
>   	}
> -	port->has_audio = drm_detect_monitor_audio(edid);
> +
>   	drm_dp_mst_topology_put_port(port);
>   	return edid;
>   }
> diff --git a/drivers/gpu/drm/i915/display/intel_display_debugfs.c b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
> index e72288662f02..77caed2552d0 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_debugfs.c
> +++ b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
> @@ -244,9 +244,9 @@ static void intel_dp_info(struct seq_file *m,
>   }
>   
>   static void intel_dp_mst_info(struct seq_file *m,
> -			      struct intel_connector *intel_connector)
> +			      struct intel_connector *connector)
>   {
> -	bool has_audio = intel_connector->port->has_audio;
> +	bool has_audio = connector->base.display_info.has_audio;
>   
>   	seq_printf(m, "\taudio support: %s\n", str_yes_no(has_audio));
>   }
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> index 2c49d9ab86a2..506118a13866 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> @@ -298,7 +298,7 @@ static bool intel_dp_mst_has_audio(const struct drm_connector_state *conn_state)
>   		to_intel_connector(conn_state->connector);
>   
>   	if (intel_conn_state->force_audio == HDMI_AUDIO_AUTO)
> -		return connector->port->has_audio;
> +		return connector->base.display_info.has_audio;
>   	else
>   		return intel_conn_state->force_audio == HDMI_AUDIO_ON;
>   }
> diff --git a/include/drm/display/drm_dp_mst_helper.h b/include/drm/display/drm_dp_mst_helper.h
> index 32c764fb9cb5..5be96a158ab2 100644
> --- a/include/drm/display/drm_dp_mst_helper.h
> +++ b/include/drm/display/drm_dp_mst_helper.h
> @@ -139,11 +139,6 @@ struct drm_dp_mst_port {
>   	 * that the EDID for all connectors is read immediately.
>   	 */
>   	struct edid *cached_edid;
> -	/**
> -	 * @has_audio: Tracks whether the sink connector to this port is
> -	 * audio-capable.
> -	 */
> -	bool has_audio;
>   
>   	/**
>   	 * @fec_capable: bool indicating if FEC can be supported up to that

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [Intel-gfx] [PATCH 03/13] drm/i915/dp: stop caching has_audio in struct intel_dp
  2023-04-21 11:47 ` [Intel-gfx] [PATCH 03/13] drm/i915/dp: stop caching has_audio in struct intel_dp Jani Nikula
@ 2023-05-29  5:15   ` Nautiyal, Ankit K
  0 siblings, 0 replies; 31+ messages in thread
From: Nautiyal, Ankit K @ 2023-05-29  5:15 UTC (permalink / raw)
  To: Jani Nikula, intel-gfx

LGTM.

Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>

On 4/21/2023 5:17 PM, Jani Nikula wrote:
> Use the information stored in display info.
>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
>   drivers/gpu/drm/i915/display/intel_display_debugfs.c | 2 +-
>   drivers/gpu/drm/i915/display/intel_display_types.h   | 1 -
>   drivers/gpu/drm/i915/display/intel_dp.c              | 5 ++---
>   3 files changed, 3 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_display_debugfs.c b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
> index 77caed2552d0..1416b82fc8a3 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_debugfs.c
> +++ b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
> @@ -237,7 +237,7 @@ static void intel_dp_info(struct seq_file *m,
>   
>   	seq_printf(m, "\tDPCD rev: %x\n", intel_dp->dpcd[DP_DPCD_REV]);
>   	seq_printf(m, "\taudio support: %s\n",
> -		   str_yes_no(intel_dp->has_audio));
> +		   str_yes_no(intel_connector->base.display_info.has_audio));
>   
>   	drm_dp_downstream_debug(m, intel_dp->dpcd, intel_dp->downstream_ports,
>   				edid ? edid->data : NULL, &intel_dp->aux);
> diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
> index 35c260bd1461..9c9b771cbcbd 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_types.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_types.h
> @@ -1670,7 +1670,6 @@ struct intel_dp {
>   	u8 sink_count;
>   	bool link_trained;
>   	bool has_hdmi_sink;
> -	bool has_audio;
>   	bool reset_link_params;
>   	bool use_max_params;
>   	u8 dpcd[DP_RECEIVER_CAP_SIZE];
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
> index 1d28a2560ae0..cda69861b00a 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> @@ -2077,6 +2077,7 @@ static bool intel_dp_has_audio(struct intel_encoder *encoder,
>   {
>   	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
>   	struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
> +	struct intel_connector *connector = intel_dp->attached_connector;
>   	const struct intel_digital_connector_state *intel_conn_state =
>   		to_intel_digital_connector_state(conn_state);
>   
> @@ -2084,7 +2085,7 @@ static bool intel_dp_has_audio(struct intel_encoder *encoder,
>   		return false;
>   
>   	if (intel_conn_state->force_audio == HDMI_AUDIO_AUTO)
> -		return intel_dp->has_audio;
> +		return connector->base.display_info.has_audio;
>   	else
>   		return intel_conn_state->force_audio == HDMI_AUDIO_ON;
>   }
> @@ -4712,7 +4713,6 @@ intel_dp_set_edid(struct intel_dp *intel_dp)
>   	edid = drm_edid_raw(drm_edid);
>   	if (edid && edid->input & DRM_EDID_INPUT_DIGITAL) {
>   		intel_dp->has_hdmi_sink = drm_detect_hdmi_monitor(edid);
> -		intel_dp->has_audio = drm_detect_monitor_audio(edid);
>   	}
>   
>   	drm_dp_cec_set_edid(&intel_dp->aux, edid);
> @@ -4728,7 +4728,6 @@ intel_dp_unset_edid(struct intel_dp *intel_dp)
>   	connector->detect_edid = NULL;
>   
>   	intel_dp->has_hdmi_sink = false;
> -	intel_dp->has_audio = false;
>   
>   	intel_dp->dfp.max_bpc = 0;
>   	intel_dp->dfp.max_dotclock = 0;

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [Intel-gfx] [PATCH 04/13] drm/i915/dp: stop caching has_hdmi_sink in struct intel_dp
  2023-04-21 11:47 ` [Intel-gfx] [PATCH 04/13] drm/i915/dp: stop caching has_hdmi_sink " Jani Nikula
@ 2023-05-29  5:22   ` Nautiyal, Ankit K
  2023-05-29  5:32     ` Nautiyal, Ankit K
  0 siblings, 1 reply; 31+ messages in thread
From: Nautiyal, Ankit K @ 2023-05-29  5:22 UTC (permalink / raw)
  To: Jani Nikula, intel-gfx

LGTM.

Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>

On 4/21/2023 5:17 PM, Jani Nikula wrote:
> Use the information stored in display info. Add intel_dp_has_hdmi_sink()
> helper to access it.
>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
>   drivers/gpu/drm/i915/display/intel_ddi.c      |  6 +++---
>   .../drm/i915/display/intel_display_types.h    |  1 -
>   drivers/gpu/drm/i915/display/intel_dp.c       | 21 ++++++++++---------
>   drivers/gpu/drm/i915/display/intel_dp.h       |  1 +
>   4 files changed, 15 insertions(+), 14 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c
> index 29e4bfab4635..9b462dd8bb14 100644
> --- a/drivers/gpu/drm/i915/display/intel_ddi.c
> +++ b/drivers/gpu/drm/i915/display/intel_ddi.c
> @@ -2800,7 +2800,7 @@ static void intel_ddi_pre_enable(struct intel_atomic_state *state,
>   
>   		/* FIXME precompute everything properly */
>   		/* FIXME how do we turn infoframes off again? */
> -		if (dig_port->lspcon.active && dig_port->dp.has_hdmi_sink)
> +		if (dig_port->lspcon.active && intel_dp_has_hdmi_sink(&dig_port->dp))
>   			dig_port->set_infoframes(encoder,
>   						 crtc_state->has_infoframe,
>   						 crtc_state, conn_state);
> @@ -3109,7 +3109,7 @@ static void intel_enable_ddi_dp(struct intel_atomic_state *state,
>   	drm_connector_update_privacy_screen(conn_state);
>   	intel_edp_backlight_on(crtc_state, conn_state);
>   
> -	if (!dig_port->lspcon.active || dig_port->dp.has_hdmi_sink)
> +	if (!dig_port->lspcon.active || intel_dp_has_hdmi_sink(&dig_port->dp))
>   		intel_dp_set_infoframes(encoder, true, crtc_state, conn_state);
>   
>   	intel_audio_codec_enable(encoder, crtc_state, conn_state);
> @@ -3736,7 +3736,7 @@ static void intel_ddi_read_func_ctl(struct intel_encoder *encoder,
>   				    pipe_config->fec_enable);
>   		}
>   
> -		if (dig_port->lspcon.active && dig_port->dp.has_hdmi_sink)
> +		if (dig_port->lspcon.active && intel_dp_has_hdmi_sink(&dig_port->dp))
>   			pipe_config->infoframes.enable |=
>   				intel_lspcon_infoframes_enabled(encoder, pipe_config);
>   		else
> diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
> index 9c9b771cbcbd..17681a8e745c 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_types.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_types.h
> @@ -1669,7 +1669,6 @@ struct intel_dp {
>   	u8 lane_count;
>   	u8 sink_count;
>   	bool link_trained;
> -	bool has_hdmi_sink;
>   	bool reset_link_params;
>   	bool use_max_params;
>   	u8 dpcd[DP_RECEIVER_CAP_SIZE];
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
> index cda69861b00a..1708277547f3 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> @@ -1201,6 +1201,13 @@ void intel_dp_compute_rate(struct intel_dp *intel_dp, int port_clock,
>   	}
>   }
>   
> +bool intel_dp_has_hdmi_sink(struct intel_dp *intel_dp)
> +{
> +	struct intel_connector *connector = intel_dp->attached_connector;
> +
> +	return connector->base.display_info.is_hdmi;
> +}
> +
>   static bool intel_dp_source_supports_fec(struct intel_dp *intel_dp,
>   					 const struct intel_crtc_state *pipe_config)
>   {
> @@ -1265,7 +1272,7 @@ static int intel_dp_hdmi_compute_bpc(struct intel_dp *intel_dp,
>   
>   	for (; bpc >= 8; bpc -= 2) {
>   		if (intel_hdmi_bpc_possible(crtc_state, bpc,
> -					    intel_dp->has_hdmi_sink, ycbcr420_output) &&
> +					    intel_dp_has_hdmi_sink(intel_dp), ycbcr420_output) &&
>   		    intel_dp_tmds_clock_valid(intel_dp, clock, bpc, ycbcr420_output,
>   					      respect_downstream_limits) == MODE_OK)
>   			return bpc;
> @@ -2646,7 +2653,7 @@ static int intel_dp_pcon_start_frl_training(struct intel_dp *intel_dp)
>   static bool intel_dp_is_hdmi_2_1_sink(struct intel_dp *intel_dp)
>   {
>   	if (drm_dp_is_branch(intel_dp->dpcd) &&
> -	    intel_dp->has_hdmi_sink &&
> +	    intel_dp_has_hdmi_sink(intel_dp) &&
>   	    intel_dp_hdmi_sink_max_frl(intel_dp) > 0)
>   		return true;
>   
> @@ -2812,13 +2819,12 @@ void intel_dp_configure_protocol_converter(struct intel_dp *intel_dp,
>   	if (!drm_dp_is_branch(intel_dp->dpcd))
>   		return;
>   
> -	tmp = intel_dp->has_hdmi_sink ?
> -		DP_HDMI_DVI_OUTPUT_CONFIG : 0;
> +	tmp = intel_dp_has_hdmi_sink(intel_dp) ? DP_HDMI_DVI_OUTPUT_CONFIG : 0;
>   
>   	if (drm_dp_dpcd_writeb(&intel_dp->aux,
>   			       DP_PROTOCOL_CONVERTER_CONTROL_0, tmp) != 1)
>   		drm_dbg_kms(&i915->drm, "Failed to %s protocol converter HDMI mode\n",
> -			    str_enable_disable(intel_dp->has_hdmi_sink));
> +			    str_enable_disable(intel_dp_has_hdmi_sink(intel_dp)));
>   
>   	tmp = crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR444 &&
>   		intel_dp->dfp.ycbcr_444_to_420 ? DP_CONVERSION_TO_YCBCR420_ENABLE : 0;
> @@ -4711,9 +4717,6 @@ intel_dp_set_edid(struct intel_dp *intel_dp)
>   
>   	/* FIXME: Get rid of drm_edid_raw() */
>   	edid = drm_edid_raw(drm_edid);
> -	if (edid && edid->input & DRM_EDID_INPUT_DIGITAL) {
> -		intel_dp->has_hdmi_sink = drm_detect_hdmi_monitor(edid);
> -	}
>   
>   	drm_dp_cec_set_edid(&intel_dp->aux, edid);
>   }
> @@ -4727,8 +4730,6 @@ intel_dp_unset_edid(struct intel_dp *intel_dp)
>   	drm_edid_free(connector->detect_edid);
>   	connector->detect_edid = NULL;
>   
> -	intel_dp->has_hdmi_sink = false;
> -
>   	intel_dp->dfp.max_bpc = 0;
>   	intel_dp->dfp.max_dotclock = 0;
>   	intel_dp->dfp.min_tmds_clock = 0;
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.h b/drivers/gpu/drm/i915/display/intel_dp.h
> index ef39e4f7a329..803b0822c661 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.h
> +++ b/drivers/gpu/drm/i915/display/intel_dp.h
> @@ -62,6 +62,7 @@ int intel_dp_dsc_compute_config(struct intel_dp *intel_dp,
>   				struct link_config_limits *limits,
>   				int timeslots,
>   				bool recompute_pipe_bpp);
> +bool intel_dp_has_hdmi_sink(struct intel_dp *intel_dp);
>   bool intel_dp_is_edp(struct intel_dp *intel_dp);
>   bool intel_dp_is_uhbr(const struct intel_crtc_state *crtc_state);
>   bool intel_dp_is_port_edp(struct drm_i915_private *dev_priv, enum port port);

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [Intel-gfx] [PATCH 04/13] drm/i915/dp: stop caching has_hdmi_sink in struct intel_dp
  2023-05-29  5:22   ` Nautiyal, Ankit K
@ 2023-05-29  5:32     ` Nautiyal, Ankit K
  0 siblings, 0 replies; 31+ messages in thread
From: Nautiyal, Ankit K @ 2023-05-29  5:32 UTC (permalink / raw)
  To: Jani Nikula, intel-gfx


On 5/29/2023 10:52 AM, Nautiyal, Ankit K wrote:
> LGTM.
>
> Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>

(This patch would require a rebas.e)

Regards,

Ankit

>
> On 4/21/2023 5:17 PM, Jani Nikula wrote:
>> Use the information stored in display info. Add intel_dp_has_hdmi_sink()
>> helper to access it.
>>
>> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
>> ---
>>   drivers/gpu/drm/i915/display/intel_ddi.c      |  6 +++---
>>   .../drm/i915/display/intel_display_types.h    |  1 -
>>   drivers/gpu/drm/i915/display/intel_dp.c       | 21 ++++++++++---------
>>   drivers/gpu/drm/i915/display/intel_dp.h       |  1 +
>>   4 files changed, 15 insertions(+), 14 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c 
>> b/drivers/gpu/drm/i915/display/intel_ddi.c
>> index 29e4bfab4635..9b462dd8bb14 100644
>> --- a/drivers/gpu/drm/i915/display/intel_ddi.c
>> +++ b/drivers/gpu/drm/i915/display/intel_ddi.c
>> @@ -2800,7 +2800,7 @@ static void intel_ddi_pre_enable(struct 
>> intel_atomic_state *state,
>>             /* FIXME precompute everything properly */
>>           /* FIXME how do we turn infoframes off again? */
>> -        if (dig_port->lspcon.active && dig_port->dp.has_hdmi_sink)
>> +        if (dig_port->lspcon.active && 
>> intel_dp_has_hdmi_sink(&dig_port->dp))
>>               dig_port->set_infoframes(encoder,
>>                            crtc_state->has_infoframe,
>>                            crtc_state, conn_state);
>> @@ -3109,7 +3109,7 @@ static void intel_enable_ddi_dp(struct 
>> intel_atomic_state *state,
>>       drm_connector_update_privacy_screen(conn_state);
>>       intel_edp_backlight_on(crtc_state, conn_state);
>>   -    if (!dig_port->lspcon.active || dig_port->dp.has_hdmi_sink)
>> +    if (!dig_port->lspcon.active || 
>> intel_dp_has_hdmi_sink(&dig_port->dp))
>>           intel_dp_set_infoframes(encoder, true, crtc_state, 
>> conn_state);
>>         intel_audio_codec_enable(encoder, crtc_state, conn_state);
>> @@ -3736,7 +3736,7 @@ static void intel_ddi_read_func_ctl(struct 
>> intel_encoder *encoder,
>>                       pipe_config->fec_enable);
>>           }
>>   -        if (dig_port->lspcon.active && dig_port->dp.has_hdmi_sink)
>> +        if (dig_port->lspcon.active && 
>> intel_dp_has_hdmi_sink(&dig_port->dp))
>>               pipe_config->infoframes.enable |=
>>                   intel_lspcon_infoframes_enabled(encoder, pipe_config);
>>           else
>> diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h 
>> b/drivers/gpu/drm/i915/display/intel_display_types.h
>> index 9c9b771cbcbd..17681a8e745c 100644
>> --- a/drivers/gpu/drm/i915/display/intel_display_types.h
>> +++ b/drivers/gpu/drm/i915/display/intel_display_types.h
>> @@ -1669,7 +1669,6 @@ struct intel_dp {
>>       u8 lane_count;
>>       u8 sink_count;
>>       bool link_trained;
>> -    bool has_hdmi_sink;
>>       bool reset_link_params;
>>       bool use_max_params;
>>       u8 dpcd[DP_RECEIVER_CAP_SIZE];
>> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c 
>> b/drivers/gpu/drm/i915/display/intel_dp.c
>> index cda69861b00a..1708277547f3 100644
>> --- a/drivers/gpu/drm/i915/display/intel_dp.c
>> +++ b/drivers/gpu/drm/i915/display/intel_dp.c
>> @@ -1201,6 +1201,13 @@ void intel_dp_compute_rate(struct intel_dp 
>> *intel_dp, int port_clock,
>>       }
>>   }
>>   +bool intel_dp_has_hdmi_sink(struct intel_dp *intel_dp)
>> +{
>> +    struct intel_connector *connector = intel_dp->attached_connector;
>> +
>> +    return connector->base.display_info.is_hdmi;
>> +}
>> +
>>   static bool intel_dp_source_supports_fec(struct intel_dp *intel_dp,
>>                        const struct intel_crtc_state *pipe_config)
>>   {
>> @@ -1265,7 +1272,7 @@ static int intel_dp_hdmi_compute_bpc(struct 
>> intel_dp *intel_dp,
>>         for (; bpc >= 8; bpc -= 2) {
>>           if (intel_hdmi_bpc_possible(crtc_state, bpc,
>> -                        intel_dp->has_hdmi_sink, ycbcr420_output) &&
>> +                        intel_dp_has_hdmi_sink(intel_dp), 
>> ycbcr420_output) &&
>>               intel_dp_tmds_clock_valid(intel_dp, clock, bpc, 
>> ycbcr420_output,
>>                             respect_downstream_limits) == MODE_OK)
>>               return bpc;
>> @@ -2646,7 +2653,7 @@ static int 
>> intel_dp_pcon_start_frl_training(struct intel_dp *intel_dp)
>>   static bool intel_dp_is_hdmi_2_1_sink(struct intel_dp *intel_dp)
>>   {
>>       if (drm_dp_is_branch(intel_dp->dpcd) &&
>> -        intel_dp->has_hdmi_sink &&
>> +        intel_dp_has_hdmi_sink(intel_dp) &&
>>           intel_dp_hdmi_sink_max_frl(intel_dp) > 0)
>>           return true;
>>   @@ -2812,13 +2819,12 @@ void 
>> intel_dp_configure_protocol_converter(struct intel_dp *intel_dp,
>>       if (!drm_dp_is_branch(intel_dp->dpcd))
>>           return;
>>   -    tmp = intel_dp->has_hdmi_sink ?
>> -        DP_HDMI_DVI_OUTPUT_CONFIG : 0;
>> +    tmp = intel_dp_has_hdmi_sink(intel_dp) ? 
>> DP_HDMI_DVI_OUTPUT_CONFIG : 0;
>>         if (drm_dp_dpcd_writeb(&intel_dp->aux,
>>                      DP_PROTOCOL_CONVERTER_CONTROL_0, tmp) != 1)
>>           drm_dbg_kms(&i915->drm, "Failed to %s protocol converter 
>> HDMI mode\n",
>> - str_enable_disable(intel_dp->has_hdmi_sink));
>> + str_enable_disable(intel_dp_has_hdmi_sink(intel_dp)));
>>         tmp = crtc_state->output_format == 
>> INTEL_OUTPUT_FORMAT_YCBCR444 &&
>>           intel_dp->dfp.ycbcr_444_to_420 ? 
>> DP_CONVERSION_TO_YCBCR420_ENABLE : 0;
>> @@ -4711,9 +4717,6 @@ intel_dp_set_edid(struct intel_dp *intel_dp)
>>         /* FIXME: Get rid of drm_edid_raw() */
>>       edid = drm_edid_raw(drm_edid);
>> -    if (edid && edid->input & DRM_EDID_INPUT_DIGITAL) {
>> -        intel_dp->has_hdmi_sink = drm_detect_hdmi_monitor(edid);
>> -    }
>>         drm_dp_cec_set_edid(&intel_dp->aux, edid);
>>   }
>> @@ -4727,8 +4730,6 @@ intel_dp_unset_edid(struct intel_dp *intel_dp)
>>       drm_edid_free(connector->detect_edid);
>>       connector->detect_edid = NULL;
>>   -    intel_dp->has_hdmi_sink = false;
>> -
>>       intel_dp->dfp.max_bpc = 0;
>>       intel_dp->dfp.max_dotclock = 0;
>>       intel_dp->dfp.min_tmds_clock = 0;
>> diff --git a/drivers/gpu/drm/i915/display/intel_dp.h 
>> b/drivers/gpu/drm/i915/display/intel_dp.h
>> index ef39e4f7a329..803b0822c661 100644
>> --- a/drivers/gpu/drm/i915/display/intel_dp.h
>> +++ b/drivers/gpu/drm/i915/display/intel_dp.h
>> @@ -62,6 +62,7 @@ int intel_dp_dsc_compute_config(struct intel_dp 
>> *intel_dp,
>>                   struct link_config_limits *limits,
>>                   int timeslots,
>>                   bool recompute_pipe_bpp);
>> +bool intel_dp_has_hdmi_sink(struct intel_dp *intel_dp);
>>   bool intel_dp_is_edp(struct intel_dp *intel_dp);
>>   bool intel_dp_is_uhbr(const struct intel_crtc_state *crtc_state);
>>   bool intel_dp_is_port_edp(struct drm_i915_private *dev_priv, enum 
>> port port);

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [Intel-gfx] [PATCH 05/13] drm/i915/hdmi: stop caching has_audio in struct intel_hdmi
  2023-04-21 11:47 ` [Intel-gfx] [PATCH 05/13] drm/i915/hdmi: stop caching has_audio in struct intel_hdmi Jani Nikula
@ 2023-05-29  5:43   ` Nautiyal, Ankit K
  0 siblings, 0 replies; 31+ messages in thread
From: Nautiyal, Ankit K @ 2023-05-29  5:43 UTC (permalink / raw)
  To: Jani Nikula, intel-gfx


On 4/21/2023 5:17 PM, Jani Nikula wrote:
> Use the information stored in display info.
>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
>   drivers/gpu/drm/i915/display/intel_display_debugfs.c | 8 +++-----
>   drivers/gpu/drm/i915/display/intel_display_types.h   | 1 -
>   drivers/gpu/drm/i915/display/intel_hdmi.c            | 6 ++----
>   3 files changed, 5 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_display_debugfs.c b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
> index 1416b82fc8a3..2a4df62692a6 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_debugfs.c
> +++ b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
> @@ -252,13 +252,11 @@ static void intel_dp_mst_info(struct seq_file *m,
>   }
>   
>   static void intel_hdmi_info(struct seq_file *m,
> -			    struct intel_connector *intel_connector)
> +			    struct intel_connector *connector)
>   {
> -	struct intel_encoder *intel_encoder = intel_attached_encoder(intel_connector);
> -	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(intel_encoder);
> +	bool has_audio = connector->base.display_info.has_audio;
>   
> -	seq_printf(m, "\taudio support: %s\n",
> -		   str_yes_no(intel_hdmi->has_audio));
> +	seq_printf(m, "\taudio support: %s\n", str_yes_no(has_audio));
>   }
>   
>   static void intel_connector_info(struct seq_file *m,
> diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
> index 17681a8e745c..d7ff75167f1f 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_types.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_types.h
> @@ -1549,7 +1549,6 @@ struct intel_hdmi {
>   		int max_tmds_clock;
>   	} dp_dual_mode;
>   	bool has_hdmi_sink;
> -	bool has_audio;
>   	struct intel_connector *attached_connector;
>   	struct cec_notifier *cec_notifier;
>   };
> diff --git a/drivers/gpu/drm/i915/display/intel_hdmi.c b/drivers/gpu/drm/i915/display/intel_hdmi.c
> index 8141d5184856..3045bf21ba8f 100644
> --- a/drivers/gpu/drm/i915/display/intel_hdmi.c
> +++ b/drivers/gpu/drm/i915/display/intel_hdmi.c
> @@ -2158,7 +2158,7 @@ static bool intel_hdmi_has_audio(struct intel_encoder *encoder,
>   				 const struct intel_crtc_state *crtc_state,
>   				 const struct drm_connector_state *conn_state)
>   {
> -	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
> +	struct drm_connector *connector = conn_state->connector;
>   	const struct intel_digital_connector_state *intel_conn_state =
>   		to_intel_digital_connector_state(conn_state);
>   
> @@ -2166,7 +2166,7 @@ static bool intel_hdmi_has_audio(struct intel_encoder *encoder,
>   		return false;
>   
>   	if (intel_conn_state->force_audio == HDMI_AUDIO_AUTO)
> -		return intel_hdmi->has_audio;
> +		return connector->display_info.has_audio;
>   	else
>   		return intel_conn_state->force_audio == HDMI_AUDIO_ON;

This now looks similar to DP intel_dp_has_audio, perhaps can be re-used 
in DP as a separate patch.

In any case, the change looks good to me.

Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>


Regards,

Ankit

>   }
> @@ -2360,7 +2360,6 @@ intel_hdmi_unset_edid(struct drm_connector *connector)
>   	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(to_intel_connector(connector));
>   
>   	intel_hdmi->has_hdmi_sink = false;
> -	intel_hdmi->has_audio = false;
>   
>   	intel_hdmi->dp_dual_mode.type = DRM_DP_DUAL_MODE_NONE;
>   	intel_hdmi->dp_dual_mode.max_tmds_clock = 0;
> @@ -2453,7 +2452,6 @@ intel_hdmi_set_edid(struct drm_connector *connector)
>   	/* FIXME: Get rid of drm_edid_raw() */
>   	edid = drm_edid_raw(drm_edid);
>   	if (edid && edid->input & DRM_EDID_INPUT_DIGITAL) {
> -		intel_hdmi->has_audio = drm_detect_monitor_audio(edid);
>   		intel_hdmi->has_hdmi_sink = drm_detect_hdmi_monitor(edid);
>   
>   		intel_hdmi_dp_dual_mode_detect(connector);

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [Intel-gfx] [PATCH 06/13] drm/i915/hdmi: stop caching has_hdmi_sink in struct intel_hdmi
  2023-04-21 11:47 ` [Intel-gfx] [PATCH 06/13] drm/i915/hdmi: stop caching has_hdmi_sink " Jani Nikula
@ 2023-05-29  5:49   ` Nautiyal, Ankit K
  0 siblings, 0 replies; 31+ messages in thread
From: Nautiyal, Ankit K @ 2023-05-29  5:49 UTC (permalink / raw)
  To: Jani Nikula, intel-gfx

LGTM.

Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>

On 4/21/2023 5:17 PM, Jani Nikula wrote:
> Use the information stored in display info.
>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
>   drivers/gpu/drm/i915/display/intel_display_types.h | 1 -
>   drivers/gpu/drm/i915/display/intel_hdmi.c          | 8 +++-----
>   2 files changed, 3 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
> index d7ff75167f1f..dc7f3bf731cd 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_types.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_types.h
> @@ -1548,7 +1548,6 @@ struct intel_hdmi {
>   		enum drm_dp_dual_mode_type type;
>   		int max_tmds_clock;
>   	} dp_dual_mode;
> -	bool has_hdmi_sink;
>   	struct intel_connector *attached_connector;
>   	struct cec_notifier *cec_notifier;
>   };
> diff --git a/drivers/gpu/drm/i915/display/intel_hdmi.c b/drivers/gpu/drm/i915/display/intel_hdmi.c
> index 3045bf21ba8f..aa0c726cb525 100644
> --- a/drivers/gpu/drm/i915/display/intel_hdmi.c
> +++ b/drivers/gpu/drm/i915/display/intel_hdmi.c
> @@ -1789,7 +1789,9 @@ static int intel_hdmi_source_max_tmds_clock(struct intel_encoder *encoder)
>   static bool intel_has_hdmi_sink(struct intel_hdmi *hdmi,
>   				const struct drm_connector_state *conn_state)
>   {
> -	return hdmi->has_hdmi_sink &&
> +	struct intel_connector *connector = hdmi->attached_connector;
> +
> +	return connector->base.display_info.is_hdmi &&
>   		READ_ONCE(to_intel_digital_connector_state(conn_state)->force_audio) != HDMI_AUDIO_OFF_DVI;
>   }
>   
> @@ -2359,8 +2361,6 @@ intel_hdmi_unset_edid(struct drm_connector *connector)
>   {
>   	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(to_intel_connector(connector));
>   
> -	intel_hdmi->has_hdmi_sink = false;
> -
>   	intel_hdmi->dp_dual_mode.type = DRM_DP_DUAL_MODE_NONE;
>   	intel_hdmi->dp_dual_mode.max_tmds_clock = 0;
>   
> @@ -2452,8 +2452,6 @@ intel_hdmi_set_edid(struct drm_connector *connector)
>   	/* FIXME: Get rid of drm_edid_raw() */
>   	edid = drm_edid_raw(drm_edid);
>   	if (edid && edid->input & DRM_EDID_INPUT_DIGITAL) {
> -		intel_hdmi->has_hdmi_sink = drm_detect_hdmi_monitor(edid);
> -
>   		intel_hdmi_dp_dual_mode_detect(connector);
>   
>   		connected = true;

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [Intel-gfx] [PATCH 07/13] drm/i915/sdvo: stop caching has_hdmi_monitor in struct intel_sdvo
  2023-04-21 11:47 ` [Intel-gfx] [PATCH 07/13] drm/i915/sdvo: stop caching has_hdmi_monitor in struct intel_sdvo Jani Nikula
@ 2023-05-29  6:05   ` Nautiyal, Ankit K
  0 siblings, 0 replies; 31+ messages in thread
From: Nautiyal, Ankit K @ 2023-05-29  6:05 UTC (permalink / raw)
  To: Jani Nikula, intel-gfx

LGTM.

Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>

On 4/21/2023 5:17 PM, Jani Nikula wrote:
> Use the information stored in display info.
>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
>   drivers/gpu/drm/i915/display/intel_sdvo.c | 14 +++++++-------
>   1 file changed, 7 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_sdvo.c b/drivers/gpu/drm/i915/display/intel_sdvo.c
> index e12ba458636c..0bbfab95ca37 100644
> --- a/drivers/gpu/drm/i915/display/intel_sdvo.c
> +++ b/drivers/gpu/drm/i915/display/intel_sdvo.c
> @@ -117,7 +117,6 @@ struct intel_sdvo {
>   
>   	enum port port;
>   
> -	bool has_hdmi_monitor;
>   	bool has_hdmi_audio;
>   
>   	/* DDC bus used by this SDVO encoder */
> @@ -1303,10 +1302,13 @@ static void i9xx_adjust_sdvo_tv_clock(struct intel_crtc_state *pipe_config)
>   	pipe_config->clock_set = true;
>   }
>   
> -static bool intel_has_hdmi_sink(struct intel_sdvo *sdvo,
> +static bool intel_has_hdmi_sink(struct intel_sdvo_connector *intel_sdvo_connector,
>   				const struct drm_connector_state *conn_state)
>   {
> -	return sdvo->has_hdmi_monitor &&
> +	struct drm_connector *connector = conn_state->connector;
> +
> +	return intel_sdvo_connector->is_hdmi &&
> +		connector->display_info.is_hdmi &&
>   		READ_ONCE(to_intel_digital_connector_state(conn_state)->force_audio) != HDMI_AUDIO_OFF_DVI;
>   }
>   
> @@ -1400,7 +1402,7 @@ static int intel_sdvo_compute_config(struct intel_encoder *encoder,
>   	pipe_config->pixel_multiplier =
>   		intel_sdvo_get_pixel_multiplier(adjusted_mode);
>   
> -	pipe_config->has_hdmi_sink = intel_has_hdmi_sink(intel_sdvo, conn_state);
> +	pipe_config->has_hdmi_sink = intel_has_hdmi_sink(intel_sdvo_connector, conn_state);
>   
>   	pipe_config->has_audio =
>   		intel_sdvo_has_audio(encoder, pipe_config, conn_state) &&
> @@ -1906,7 +1908,7 @@ intel_sdvo_mode_valid(struct drm_connector *connector,
>   	struct intel_sdvo_connector *intel_sdvo_connector =
>   		to_intel_sdvo_connector(connector);
>   	int max_dotclk = to_i915(connector->dev)->max_dotclk_freq;
> -	bool has_hdmi_sink = intel_has_hdmi_sink(intel_sdvo, connector->state);
> +	bool has_hdmi_sink = intel_has_hdmi_sink(intel_sdvo_connector, connector->state);
>   	int clock = mode->clock;
>   
>   	if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
> @@ -2095,7 +2097,6 @@ intel_sdvo_tmds_sink_detect(struct drm_connector *connector)
>   		if (edid->input & DRM_EDID_INPUT_DIGITAL) {
>   			status = connector_status_connected;
>   			if (intel_sdvo_connector->is_hdmi) {
> -				intel_sdvo->has_hdmi_monitor = drm_detect_hdmi_monitor(edid);
>   				intel_sdvo->has_hdmi_audio = drm_detect_monitor_audio(edid);
>   			}
>   		} else
> @@ -2147,7 +2148,6 @@ intel_sdvo_detect(struct drm_connector *connector, bool force)
>   
>   	intel_sdvo->attached_output = response;
>   
> -	intel_sdvo->has_hdmi_monitor = false;
>   	intel_sdvo->has_hdmi_audio = false;
>   
>   	if ((intel_sdvo_connector->output_flag & response) == 0)

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [Intel-gfx] [PATCH 08/13] drm/i915/sdvo: stop caching has_hdmi_audio in struct intel_sdvo
  2023-04-21 11:47 ` [Intel-gfx] [PATCH 08/13] drm/i915/sdvo: stop caching has_hdmi_audio " Jani Nikula
@ 2023-05-29  6:06   ` Nautiyal, Ankit K
  0 siblings, 0 replies; 31+ messages in thread
From: Nautiyal, Ankit K @ 2023-05-29  6:06 UTC (permalink / raw)
  To: Jani Nikula, intel-gfx

LGTM.

Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>

On 4/21/2023 5:17 PM, Jani Nikula wrote:
> Use the information stored in display info.
>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
>   drivers/gpu/drm/i915/display/intel_sdvo.c | 20 +++++++-------------
>   1 file changed, 7 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_sdvo.c b/drivers/gpu/drm/i915/display/intel_sdvo.c
> index 0bbfab95ca37..0f0c1733cd0d 100644
> --- a/drivers/gpu/drm/i915/display/intel_sdvo.c
> +++ b/drivers/gpu/drm/i915/display/intel_sdvo.c
> @@ -117,8 +117,6 @@ struct intel_sdvo {
>   
>   	enum port port;
>   
> -	bool has_hdmi_audio;
> -
>   	/* DDC bus used by this SDVO encoder */
>   	u8 ddc_bus;
>   
> @@ -1328,7 +1326,9 @@ static bool intel_sdvo_has_audio(struct intel_encoder *encoder,
>   				 const struct intel_crtc_state *crtc_state,
>   				 const struct drm_connector_state *conn_state)
>   {
> -	struct intel_sdvo *intel_sdvo = to_sdvo(encoder);
> +	struct drm_connector *connector = conn_state->connector;
> +	struct intel_sdvo_connector *intel_sdvo_connector =
> +		to_intel_sdvo_connector(connector);
>   	const struct intel_digital_connector_state *intel_conn_state =
>   		to_intel_digital_connector_state(conn_state);
>   
> @@ -1336,7 +1336,8 @@ static bool intel_sdvo_has_audio(struct intel_encoder *encoder,
>   		return false;
>   
>   	if (intel_conn_state->force_audio == HDMI_AUDIO_AUTO)
> -		return intel_sdvo->has_hdmi_audio;
> +		return intel_sdvo_connector->is_hdmi &&
> +			connector->display_info.has_audio;
>   	else
>   		return intel_conn_state->force_audio == HDMI_AUDIO_ON;
>   }
> @@ -2056,8 +2057,6 @@ static enum drm_connector_status
>   intel_sdvo_tmds_sink_detect(struct drm_connector *connector)
>   {
>   	struct intel_sdvo *intel_sdvo = intel_attached_sdvo(to_intel_connector(connector));
> -	struct intel_sdvo_connector *intel_sdvo_connector =
> -		to_intel_sdvo_connector(connector);
>   	enum drm_connector_status status;
>   	struct edid *edid;
>   
> @@ -2094,12 +2093,9 @@ intel_sdvo_tmds_sink_detect(struct drm_connector *connector)
>   	status = connector_status_unknown;
>   	if (edid != NULL) {
>   		/* DDC bus is shared, match EDID to connector type */
> -		if (edid->input & DRM_EDID_INPUT_DIGITAL) {
> +		if (edid->input & DRM_EDID_INPUT_DIGITAL)
>   			status = connector_status_connected;
> -			if (intel_sdvo_connector->is_hdmi) {
> -				intel_sdvo->has_hdmi_audio = drm_detect_monitor_audio(edid);
> -			}
> -		} else
> +		else
>   			status = connector_status_disconnected;
>   		kfree(edid);
>   	}
> @@ -2148,8 +2144,6 @@ intel_sdvo_detect(struct drm_connector *connector, bool force)
>   
>   	intel_sdvo->attached_output = response;
>   
> -	intel_sdvo->has_hdmi_audio = false;
> -
>   	if ((intel_sdvo_connector->output_flag & response) == 0)
>   		ret = connector_status_disconnected;
>   	else if (IS_TMDS(intel_sdvo_connector))

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [Intel-gfx] [PATCH 12/13] drm/display/dp_mst: convert to struct drm_edid
  2023-04-21 11:47 ` [Intel-gfx] [PATCH 12/13] drm/display/dp_mst: convert to struct drm_edid Jani Nikula
@ 2023-05-29 13:08   ` Nautiyal, Ankit K
  0 siblings, 0 replies; 31+ messages in thread
From: Nautiyal, Ankit K @ 2023-05-29 13:08 UTC (permalink / raw)
  To: Jani Nikula, intel-gfx


On 4/21/2023 5:17 PM, Jani Nikula wrote:
> Convert the topology manager to use struct drm_edid, add
> drm_dp_mst_edid_read() that returns drm_edid, and rewrite the old
> drm_dp_mst_get_edid() to use it.
>
> Note that the old drm_get_edid() ended up calling
> drm_connector_update_edid_property(). This responsibility is now
> deferred to drivers, which all do it anyway after calling
> drm_dp_mst_edid_read() or drm_dp_mst_get_edid().
>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
>   drivers/gpu/drm/display/drm_dp_mst_topology.c | 53 +++++++++++++++----
>   include/drm/display/drm_dp_mst_helper.h       |  9 +++-
>   2 files changed, 49 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/gpu/drm/display/drm_dp_mst_topology.c b/drivers/gpu/drm/display/drm_dp_mst_topology.c
> index a2b8732db0c8..be71be95b706 100644
> --- a/drivers/gpu/drm/display/drm_dp_mst_topology.c
> +++ b/drivers/gpu/drm/display/drm_dp_mst_topology.c
> @@ -1823,7 +1823,7 @@ static void drm_dp_destroy_port(struct kref *kref)
>   		return;
>   	}
>   
> -	kfree(port->cached_edid);
> +	drm_edid_free(port->cached_edid);
>   
>   	/*
>   	 * we can't destroy the connector here, as we might be holding the
> @@ -2272,8 +2272,8 @@ drm_dp_mst_port_add_connector(struct drm_dp_mst_branch *mstb,
>   	if (port->pdt != DP_PEER_DEVICE_NONE &&
>   	    drm_dp_mst_is_end_device(port->pdt, port->mcs) &&
>   	    port->port_num >= DP_MST_LOGICAL_PORT_0)
> -		port->cached_edid = drm_get_edid(port->connector,
> -						 &port->aux.ddc);
> +		port->cached_edid = drm_edid_read_ddc(port->connector,
> +						      &port->aux.ddc);
>   
>   	drm_connector_register(port->connector);
>   	return;
> @@ -4133,7 +4133,7 @@ drm_dp_mst_detect_port(struct drm_connector *connector,
>   		ret = connector_status_connected;
>   		/* for logical ports - cache the EDID */
>   		if (port->port_num >= DP_MST_LOGICAL_PORT_0 && !port->cached_edid)
> -			port->cached_edid = drm_get_edid(connector, &port->aux.ddc);
> +			port->cached_edid = drm_edid_read_ddc(connector, &port->aux.ddc);
>   		break;
>   	case DP_PEER_DEVICE_DP_LEGACY_CONV:
>   		if (port->ldps)
> @@ -4147,7 +4147,7 @@ drm_dp_mst_detect_port(struct drm_connector *connector,
>   EXPORT_SYMBOL(drm_dp_mst_detect_port);
>   
>   /**
> - * drm_dp_mst_get_edid() - get EDID for an MST port
> + * drm_dp_mst_edid_read() - get EDID for an MST port

Perhaps mention drm_edid container here and also in return documentation?

In any case the change looks good to me.

Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>

>    * @connector: toplevel connector to get EDID for
>    * @mgr: manager for this port
>    * @port: unverified pointer to a port.
> @@ -4156,9 +4156,11 @@ EXPORT_SYMBOL(drm_dp_mst_detect_port);
>    * It validates the pointer still exists so the caller doesn't require a
>    * reference.
>    */
> -struct edid *drm_dp_mst_get_edid(struct drm_connector *connector, struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port)
> +const struct drm_edid *drm_dp_mst_edid_read(struct drm_connector *connector,
> +					    struct drm_dp_mst_topology_mgr *mgr,
> +					    struct drm_dp_mst_port *port)
>   {
> -	struct edid *edid = NULL;
> +	const struct drm_edid *drm_edid;
>   
>   	/* we need to search for the port in the mgr in case it's gone */
>   	port = drm_dp_mst_topology_get_port_validated(mgr, port);
> @@ -4166,12 +4168,41 @@ struct edid *drm_dp_mst_get_edid(struct drm_connector *connector, struct drm_dp_
>   		return NULL;
>   
>   	if (port->cached_edid)
> -		edid = drm_edid_duplicate(port->cached_edid);
> -	else {
> -		edid = drm_get_edid(connector, &port->aux.ddc);
> -	}
> +		drm_edid = drm_edid_dup(port->cached_edid);
> +	else
> +		drm_edid = drm_edid_read_ddc(connector, &port->aux.ddc);
>   
>   	drm_dp_mst_topology_put_port(port);
> +
> +	return drm_edid;
> +}
> +EXPORT_SYMBOL(drm_dp_mst_edid_read);
> +
> +/**
> + * drm_dp_mst_get_edid() - get EDID for an MST port
> + * @connector: toplevel connector to get EDID for
> + * @mgr: manager for this port
> + * @port: unverified pointer to a port.
> + *
> + * This function is deprecated; please use drm_dp_mst_edid_read() instead.
> + *
> + * This returns an EDID for the port connected to a connector,
> + * It validates the pointer still exists so the caller doesn't require a
> + * reference.
> + */
> +struct edid *drm_dp_mst_get_edid(struct drm_connector *connector,
> +				 struct drm_dp_mst_topology_mgr *mgr,
> +				 struct drm_dp_mst_port *port)
> +{
> +	const struct drm_edid *drm_edid;
> +	struct edid *edid;
> +
> +	drm_edid = drm_dp_mst_edid_read(connector, mgr, port);
> +
> +	edid = drm_edid_duplicate(drm_edid_raw(drm_edid));
> +
> +	drm_edid_free(drm_edid);
> +
>   	return edid;
>   }
>   EXPORT_SYMBOL(drm_dp_mst_get_edid);
> diff --git a/include/drm/display/drm_dp_mst_helper.h b/include/drm/display/drm_dp_mst_helper.h
> index 5be96a158ab2..f962e97880b4 100644
> --- a/include/drm/display/drm_dp_mst_helper.h
> +++ b/include/drm/display/drm_dp_mst_helper.h
> @@ -138,7 +138,7 @@ struct drm_dp_mst_port {
>   	 * @cached_edid: for DP logical ports - make tiling work by ensuring
>   	 * that the EDID for all connectors is read immediately.
>   	 */
> -	struct edid *cached_edid;
> +	const struct drm_edid *cached_edid;
>   
>   	/**
>   	 * @fec_capable: bool indicating if FEC can be supported up to that
> @@ -819,7 +819,12 @@ drm_dp_mst_detect_port(struct drm_connector *connector,
>   		       struct drm_dp_mst_topology_mgr *mgr,
>   		       struct drm_dp_mst_port *port);
>   
> -struct edid *drm_dp_mst_get_edid(struct drm_connector *connector, struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port);
> +const struct drm_edid *drm_dp_mst_edid_read(struct drm_connector *connector,
> +					    struct drm_dp_mst_topology_mgr *mgr,
> +					    struct drm_dp_mst_port *port);
> +struct edid *drm_dp_mst_get_edid(struct drm_connector *connector,
> +				 struct drm_dp_mst_topology_mgr *mgr,
> +				 struct drm_dp_mst_port *port);
>   
>   int drm_dp_get_vc_payload_bw(const struct drm_dp_mst_topology_mgr *mgr,
>   			     int link_rate, int link_lane_count);

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [Intel-gfx] [PATCH 11/13] drm/edid: make drm_edid_duplicate() safe to call with NULL parameter
  2023-04-21 11:47 ` [Intel-gfx] [PATCH 11/13] drm/edid: make drm_edid_duplicate() safe to call with NULL parameter Jani Nikula
@ 2023-05-29 13:11   ` Nautiyal, Ankit K
  0 siblings, 0 replies; 31+ messages in thread
From: Nautiyal, Ankit K @ 2023-05-29 13:11 UTC (permalink / raw)
  To: Jani Nikula, intel-gfx

LGTM.

Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>

On 4/21/2023 5:17 PM, Jani Nikula wrote:
> It's a bit tedious to check for NULL before calling
> drm_edid_duplicate(). Make it handle NULL parameter graciously.
>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
>   drivers/gpu/drm/drm_edid.c | 3 +++
>   1 file changed, 3 insertions(+)
>
> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
> index 941f3d53a701..e0dbd9140726 100644
> --- a/drivers/gpu/drm/drm_edid.c
> +++ b/drivers/gpu/drm/drm_edid.c
> @@ -2881,6 +2881,9 @@ EXPORT_SYMBOL(drm_edid_read_switcheroo);
>    */
>   struct edid *drm_edid_duplicate(const struct edid *edid)
>   {
> +	if (!edid)
> +		return NULL;
> +
>   	return kmemdup(edid, edid_size(edid), GFP_KERNEL);
>   }
>   EXPORT_SYMBOL(drm_edid_duplicate);

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [Intel-gfx] [PATCH 09/13] drm/edid: add drm_edid_read_switcheroo()
  2023-04-21 11:47 ` [Intel-gfx] [PATCH 09/13] drm/edid: add drm_edid_read_switcheroo() Jani Nikula
@ 2023-05-30  4:09   ` Nautiyal, Ankit K
  0 siblings, 0 replies; 31+ messages in thread
From: Nautiyal, Ankit K @ 2023-05-30  4:09 UTC (permalink / raw)
  To: Jani Nikula, intel-gfx

LGTM.

Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>

On 4/21/2023 5:17 PM, Jani Nikula wrote:
> Add a switcheroo variant to the struct drm_edid based EDID read
> functions.
>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
>   drivers/gpu/drm/drm_edid.c | 29 +++++++++++++++++++++++++++++
>   include/drm/drm_edid.h     |  2 ++
>   2 files changed, 31 insertions(+)
>
> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
> index 813ce00a106a..941f3d53a701 100644
> --- a/drivers/gpu/drm/drm_edid.c
> +++ b/drivers/gpu/drm/drm_edid.c
> @@ -2844,6 +2844,35 @@ struct edid *drm_get_edid_switcheroo(struct drm_connector *connector,
>   }
>   EXPORT_SYMBOL(drm_get_edid_switcheroo);
>   
> +/**
> + * drm_edid_read_switcheroo - get EDID data for a vga_switcheroo output
> + * @connector: connector we're probing
> + * @adapter: I2C adapter to use for DDC
> + *
> + * Wrapper around drm_edid_read_ddc() for laptops with dual GPUs using one set
> + * of outputs. The wrapper adds the requisite vga_switcheroo calls to
> + * temporarily switch DDC to the GPU which is retrieving EDID.
> + *
> + * Return: Pointer to valid EDID or %NULL if we couldn't find any.
> + */
> +const struct drm_edid *drm_edid_read_switcheroo(struct drm_connector *connector,
> +						struct i2c_adapter *adapter)
> +{
> +	struct drm_device *dev = connector->dev;
> +	struct pci_dev *pdev = to_pci_dev(dev->dev);
> +	const struct drm_edid *drm_edid;
> +
> +	if (drm_WARN_ON_ONCE(dev, !dev_is_pci(dev->dev)))
> +		return NULL;
> +
> +	vga_switcheroo_lock_ddc(pdev);
> +	drm_edid = drm_edid_read_ddc(connector, adapter);
> +	vga_switcheroo_unlock_ddc(pdev);
> +
> +	return drm_edid;
> +}
> +EXPORT_SYMBOL(drm_edid_read_switcheroo);
> +
>   /**
>    * drm_edid_duplicate - duplicate an EDID and the extensions
>    * @edid: EDID to duplicate
> diff --git a/include/drm/drm_edid.h b/include/drm/drm_edid.h
> index 571885d32907..169755d3de19 100644
> --- a/include/drm/drm_edid.h
> +++ b/include/drm/drm_edid.h
> @@ -613,6 +613,8 @@ const struct drm_edid *drm_edid_read_ddc(struct drm_connector *connector,
>   const struct drm_edid *drm_edid_read_custom(struct drm_connector *connector,
>   					    int (*read_block)(void *context, u8 *buf, unsigned int block, size_t len),
>   					    void *context);
> +const struct drm_edid *drm_edid_read_switcheroo(struct drm_connector *connector,
> +						struct i2c_adapter *adapter);
>   int drm_edid_connector_update(struct drm_connector *connector,
>   			      const struct drm_edid *edid);
>   int drm_edid_connector_add_modes(struct drm_connector *connector);

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [Intel-gfx] [PATCH 13/13] drm/i915/display: switch the rest of the connectors to struct drm_edid
  2023-04-21 11:47 ` [Intel-gfx] [PATCH 13/13] drm/i915/display: switch the rest of the connectors " Jani Nikula
@ 2023-05-30  4:38   ` Nautiyal, Ankit K
  0 siblings, 0 replies; 31+ messages in thread
From: Nautiyal, Ankit K @ 2023-05-30  4:38 UTC (permalink / raw)
  To: Jani Nikula, intel-gfx

LGTM.

Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>

On 4/21/2023 5:17 PM, Jani Nikula wrote:
> Convert the remaining uses of struct edid based drm_get_edid(),
> drm_connector_update_edid_property() and drm_add_edid_modes() calls to
> the struct drm_edid based drm_edid_read_ddc(),
> drm_edid_connector_update() and drm_edid_connector_add_modes().
>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
>   .../gpu/drm/i915/display/intel_connector.c    | 18 ++---
>   .../gpu/drm/i915/display/intel_connector.h    |  4 +-
>   drivers/gpu/drm/i915/display/intel_crt.c      | 34 +++++----
>   drivers/gpu/drm/i915/display/intel_dp_mst.c   | 10 ++-
>   drivers/gpu/drm/i915/display/intel_sdvo.c     | 73 ++++++++++---------
>   5 files changed, 74 insertions(+), 65 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_connector.c b/drivers/gpu/drm/i915/display/intel_connector.c
> index 257afac34839..00ea71b03ec7 100644
> --- a/drivers/gpu/drm/i915/display/intel_connector.c
> +++ b/drivers/gpu/drm/i915/display/intel_connector.c
> @@ -176,15 +176,15 @@ enum pipe intel_connector_get_pipe(struct intel_connector *connector)
>   /**
>    * intel_connector_update_modes - update connector from edid
>    * @connector: DRM connector device to use
> - * @edid: previously read EDID information
> + * @drm_edid: previously read EDID information
>    */
>   int intel_connector_update_modes(struct drm_connector *connector,
> -				struct edid *edid)
> +				 const struct drm_edid *drm_edid)
>   {
>   	int ret;
>   
> -	drm_connector_update_edid_property(connector, edid);
> -	ret = drm_add_edid_modes(connector, edid);
> +	drm_edid_connector_update(connector, drm_edid);
> +	ret = drm_edid_connector_add_modes(connector);
>   
>   	return ret;
>   }
> @@ -199,15 +199,15 @@ int intel_connector_update_modes(struct drm_connector *connector,
>   int intel_ddc_get_modes(struct drm_connector *connector,
>   			struct i2c_adapter *adapter)
>   {
> -	struct edid *edid;
> +	const struct drm_edid *drm_edid;
>   	int ret;
>   
> -	edid = drm_get_edid(connector, adapter);
> -	if (!edid)
> +	drm_edid = drm_edid_read_ddc(connector, adapter);
> +	if (!drm_edid)
>   		return 0;
>   
> -	ret = intel_connector_update_modes(connector, edid);
> -	kfree(edid);
> +	ret = intel_connector_update_modes(connector, drm_edid);
> +	drm_edid_free(drm_edid);
>   
>   	return ret;
>   }
> diff --git a/drivers/gpu/drm/i915/display/intel_connector.h b/drivers/gpu/drm/i915/display/intel_connector.h
> index 9d2bc261b204..aaf7281462dc 100644
> --- a/drivers/gpu/drm/i915/display/intel_connector.h
> +++ b/drivers/gpu/drm/i915/display/intel_connector.h
> @@ -9,7 +9,7 @@
>   #include <linux/types.h>
>   
>   struct drm_connector;
> -struct edid;
> +struct drm_edid;
>   struct i2c_adapter;
>   struct intel_connector;
>   struct intel_encoder;
> @@ -25,7 +25,7 @@ void intel_connector_attach_encoder(struct intel_connector *connector,
>   bool intel_connector_get_hw_state(struct intel_connector *connector);
>   enum pipe intel_connector_get_pipe(struct intel_connector *connector);
>   int intel_connector_update_modes(struct drm_connector *connector,
> -				 struct edid *edid);
> +				 const struct drm_edid *drm_edid);
>   int intel_ddc_get_modes(struct drm_connector *c, struct i2c_adapter *adapter);
>   void intel_attach_force_audio_property(struct drm_connector *connector);
>   void intel_attach_broadcast_rgb_property(struct drm_connector *connector);
> diff --git a/drivers/gpu/drm/i915/display/intel_crt.c b/drivers/gpu/drm/i915/display/intel_crt.c
> index 13519f78cf9f..c198145effd1 100644
> --- a/drivers/gpu/drm/i915/display/intel_crt.c
> +++ b/drivers/gpu/drm/i915/display/intel_crt.c
> @@ -607,37 +607,38 @@ static bool intel_crt_detect_hotplug(struct drm_connector *connector)
>   	return ret;
>   }
>   
> -static struct edid *intel_crt_get_edid(struct drm_connector *connector,
> -				struct i2c_adapter *i2c)
> +static const struct drm_edid *intel_crt_get_edid(struct drm_connector *connector,
> +						 struct i2c_adapter *i2c)
>   {
> -	struct edid *edid;
> +	const struct drm_edid *drm_edid;
>   
> -	edid = drm_get_edid(connector, i2c);
> +	drm_edid = drm_edid_read_ddc(connector, i2c);
>   
> -	if (!edid && !intel_gmbus_is_forced_bit(i2c)) {
> +	if (!drm_edid && !intel_gmbus_is_forced_bit(i2c)) {
>   		drm_dbg_kms(connector->dev,
>   			    "CRT GMBUS EDID read failed, retry using GPIO bit-banging\n");
>   		intel_gmbus_force_bit(i2c, true);
> -		edid = drm_get_edid(connector, i2c);
> +		drm_edid = drm_edid_read_ddc(connector, i2c);
>   		intel_gmbus_force_bit(i2c, false);
>   	}
>   
> -	return edid;
> +	return drm_edid;
>   }
>   
>   /* local version of intel_ddc_get_modes() to use intel_crt_get_edid() */
>   static int intel_crt_ddc_get_modes(struct drm_connector *connector,
>   				struct i2c_adapter *adapter)
>   {
> -	struct edid *edid;
> +	const struct drm_edid *drm_edid;
>   	int ret;
>   
> -	edid = intel_crt_get_edid(connector, adapter);
> -	if (!edid)
> +	drm_edid = intel_crt_get_edid(connector, adapter);
> +	if (!drm_edid)
>   		return 0;
>   
> -	ret = intel_connector_update_modes(connector, edid);
> -	kfree(edid);
> +	ret = intel_connector_update_modes(connector, drm_edid);
> +
> +	drm_edid_free(drm_edid);
>   
>   	return ret;
>   }
> @@ -646,14 +647,15 @@ static bool intel_crt_detect_ddc(struct drm_connector *connector)
>   {
>   	struct intel_crt *crt = intel_attached_crt(to_intel_connector(connector));
>   	struct drm_i915_private *dev_priv = to_i915(crt->base.base.dev);
> -	struct edid *edid;
> +	const struct drm_edid *drm_edid;
>   	struct i2c_adapter *i2c;
>   	bool ret = false;
>   
>   	i2c = intel_gmbus_get_adapter(dev_priv, dev_priv->display.vbt.crt_ddc_pin);
> -	edid = intel_crt_get_edid(connector, i2c);
> +	drm_edid = intel_crt_get_edid(connector, i2c);
>   
> -	if (edid) {
> +	if (drm_edid) {
> +		const struct edid *edid = drm_edid_raw(drm_edid);
>   		bool is_digital = edid->input & DRM_EDID_INPUT_DIGITAL;
>   
>   		/*
> @@ -674,7 +676,7 @@ static bool intel_crt_detect_ddc(struct drm_connector *connector)
>   			    "CRT not detected via DDC:0x50 [no valid EDID found]\n");
>   	}
>   
> -	kfree(edid);
> +	drm_edid_free(drm_edid);
>   
>   	return ret;
>   }
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> index 506118a13866..deb926c2c1c7 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> @@ -837,15 +837,17 @@ static int intel_dp_mst_get_ddc_modes(struct drm_connector *connector)
>   {
>   	struct intel_connector *intel_connector = to_intel_connector(connector);
>   	struct intel_dp *intel_dp = intel_connector->mst_port;
> -	struct edid *edid;
> +	const struct drm_edid *drm_edid;
>   	int ret;
>   
>   	if (drm_connector_is_unregistered(connector))
>   		return intel_connector_update_modes(connector, NULL);
>   
> -	edid = drm_dp_mst_get_edid(connector, &intel_dp->mst_mgr, intel_connector->port);
> -	ret = intel_connector_update_modes(connector, edid);
> -	kfree(edid);
> +	drm_edid = drm_dp_mst_edid_read(connector, &intel_dp->mst_mgr, intel_connector->port);
> +
> +	ret = intel_connector_update_modes(connector, drm_edid);
> +
> +	drm_edid_free(drm_edid);
>   
>   	return ret;
>   }
> diff --git a/drivers/gpu/drm/i915/display/intel_sdvo.c b/drivers/gpu/drm/i915/display/intel_sdvo.c
> index 0f0c1733cd0d..cdd8adbd5432 100644
> --- a/drivers/gpu/drm/i915/display/intel_sdvo.c
> +++ b/drivers/gpu/drm/i915/display/intel_sdvo.c
> @@ -2035,22 +2035,23 @@ intel_sdvo_multifunc_encoder(struct intel_sdvo *intel_sdvo)
>   	return hweight16(intel_sdvo->caps.output_flags) > 1;
>   }
>   
> -static struct edid *
> +static const struct drm_edid *
>   intel_sdvo_get_edid(struct drm_connector *connector)
>   {
>   	struct intel_sdvo *sdvo = intel_attached_sdvo(to_intel_connector(connector));
> -	return drm_get_edid(connector, &sdvo->ddc);
> +	return drm_edid_read_ddc(connector, &sdvo->ddc);
>   }
>   
>   /* Mac mini hack -- use the same DDC as the analog connector */
> -static struct edid *
> +static const struct drm_edid *
>   intel_sdvo_get_analog_edid(struct drm_connector *connector)
>   {
> -	struct drm_i915_private *dev_priv = to_i915(connector->dev);
> +	struct drm_i915_private *i915 = to_i915(connector->dev);
> +	struct i2c_adapter *i2c;
>   
> -	return drm_get_edid(connector,
> -			    intel_gmbus_get_adapter(dev_priv,
> -						    dev_priv->display.vbt.crt_ddc_pin));
> +	i2c = intel_gmbus_get_adapter(i915, i915->display.vbt.crt_ddc_pin);
> +
> +	return drm_edid_read_ddc(connector, i2c);
>   }
>   
>   static enum drm_connector_status
> @@ -2058,11 +2059,11 @@ intel_sdvo_tmds_sink_detect(struct drm_connector *connector)
>   {
>   	struct intel_sdvo *intel_sdvo = intel_attached_sdvo(to_intel_connector(connector));
>   	enum drm_connector_status status;
> -	struct edid *edid;
> +	const struct drm_edid *drm_edid;
>   
> -	edid = intel_sdvo_get_edid(connector);
> +	drm_edid = intel_sdvo_get_edid(connector);
>   
> -	if (edid == NULL && intel_sdvo_multifunc_encoder(intel_sdvo)) {
> +	if (!drm_edid && intel_sdvo_multifunc_encoder(intel_sdvo)) {
>   		u8 ddc, saved_ddc = intel_sdvo->ddc_bus;
>   
>   		/*
> @@ -2071,15 +2072,15 @@ intel_sdvo_tmds_sink_detect(struct drm_connector *connector)
>   		 */
>   		for (ddc = intel_sdvo->ddc_bus >> 1; ddc > 1; ddc >>= 1) {
>   			intel_sdvo->ddc_bus = ddc;
> -			edid = intel_sdvo_get_edid(connector);
> -			if (edid)
> +			drm_edid = intel_sdvo_get_edid(connector);
> +			if (drm_edid)
>   				break;
>   		}
>   		/*
>   		 * If we found the EDID on the other bus,
>   		 * assume that is the correct DDC bus.
>   		 */
> -		if (edid == NULL)
> +		if (!drm_edid)
>   			intel_sdvo->ddc_bus = saved_ddc;
>   	}
>   
> @@ -2087,17 +2088,19 @@ intel_sdvo_tmds_sink_detect(struct drm_connector *connector)
>   	 * When there is no edid and no monitor is connected with VGA
>   	 * port, try to use the CRT ddc to read the EDID for DVI-connector.
>   	 */
> -	if (edid == NULL)
> -		edid = intel_sdvo_get_analog_edid(connector);
> +	if (!drm_edid)
> +		drm_edid = intel_sdvo_get_analog_edid(connector);
>   
>   	status = connector_status_unknown;
> -	if (edid != NULL) {
> +	if (drm_edid) {
> +		const struct edid *edid = drm_edid_raw(drm_edid);
> +
>   		/* DDC bus is shared, match EDID to connector type */
>   		if (edid->input & DRM_EDID_INPUT_DIGITAL)
>   			status = connector_status_connected;
>   		else
>   			status = connector_status_disconnected;
> -		kfree(edid);
> +		drm_edid_free(drm_edid);
>   	}
>   
>   	return status;
> @@ -2105,8 +2108,9 @@ intel_sdvo_tmds_sink_detect(struct drm_connector *connector)
>   
>   static bool
>   intel_sdvo_connector_matches_edid(struct intel_sdvo_connector *sdvo,
> -				  struct edid *edid)
> +				  const struct drm_edid *drm_edid)
>   {
> +	const struct edid *edid = drm_edid_raw(drm_edid);
>   	bool monitor_is_digital = !!(edid->input & DRM_EDID_INPUT_DIGITAL);
>   	bool connector_is_digital = !!IS_DIGITAL(sdvo);
>   
> @@ -2149,22 +2153,23 @@ intel_sdvo_detect(struct drm_connector *connector, bool force)
>   	else if (IS_TMDS(intel_sdvo_connector))
>   		ret = intel_sdvo_tmds_sink_detect(connector);
>   	else {
> -		struct edid *edid;
> +		const struct drm_edid *drm_edid;
>   
>   		/* if we have an edid check it matches the connection */
> -		edid = intel_sdvo_get_edid(connector);
> -		if (edid == NULL)
> -			edid = intel_sdvo_get_analog_edid(connector);
> -		if (edid != NULL) {
> +		drm_edid = intel_sdvo_get_edid(connector);
> +		if (!drm_edid)
> +			drm_edid = intel_sdvo_get_analog_edid(connector);
> +		if (drm_edid) {
>   			if (intel_sdvo_connector_matches_edid(intel_sdvo_connector,
> -							      edid))
> +							      drm_edid))
>   				ret = connector_status_connected;
>   			else
>   				ret = connector_status_disconnected;
>   
> -			kfree(edid);
> -		} else
> +			drm_edid_free(drm_edid);
> +		} else {
>   			ret = connector_status_connected;
> +		}
>   	}
>   
>   	return ret;
> @@ -2173,13 +2178,13 @@ intel_sdvo_detect(struct drm_connector *connector, bool force)
>   static int intel_sdvo_get_ddc_modes(struct drm_connector *connector)
>   {
>   	int num_modes = 0;
> -	struct edid *edid;
> +	const struct drm_edid *drm_edid;
>   
>   	DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
>   		      connector->base.id, connector->name);
>   
>   	/* set the bus switch and get the modes */
> -	edid = intel_sdvo_get_edid(connector);
> +	drm_edid = intel_sdvo_get_edid(connector);
>   
>   	/*
>   	 * Mac mini hack.  On this device, the DVI-I connector shares one DDC
> @@ -2187,17 +2192,17 @@ static int intel_sdvo_get_ddc_modes(struct drm_connector *connector)
>   	 * DDC fails, check to see if the analog output is disconnected, in
>   	 * which case we'll look there for the digital DDC data.
>   	 */
> -	if (!edid)
> -		edid = intel_sdvo_get_analog_edid(connector);
> +	if (!drm_edid)
> +		drm_edid = intel_sdvo_get_analog_edid(connector);
>   
> -	if (!edid)
> +	if (!drm_edid)
>   		return 0;
>   
>   	if (intel_sdvo_connector_matches_edid(to_intel_sdvo_connector(connector),
> -					      edid))
> -		num_modes += intel_connector_update_modes(connector, edid);
> +					      drm_edid))
> +		num_modes += intel_connector_update_modes(connector, drm_edid);
>   
> -	kfree(edid);
> +	drm_edid_free(drm_edid);
>   
>   	return num_modes;
>   }

^ permalink raw reply	[flat|nested] 31+ messages in thread

end of thread, other threads:[~2023-05-30  4:38 UTC | newest]

Thread overview: 31+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-04-21 11:47 [Intel-gfx] [PATCH 00/13] drm/display & drm/i915: more struct drm_edid conversions Jani Nikula
2023-04-21 11:47 ` [Intel-gfx] [PATCH 01/13] drm/edid: parse display info has_audio similar to is_hdmi Jani Nikula
2023-05-29  4:56   ` Nautiyal, Ankit K
2023-04-21 11:47 ` [Intel-gfx] [PATCH 02/13] drm/display/dp_mst: drop has_audio from struct drm_dp_mst_port Jani Nikula
2023-05-29  5:10   ` Nautiyal, Ankit K
2023-04-21 11:47 ` [Intel-gfx] [PATCH 03/13] drm/i915/dp: stop caching has_audio in struct intel_dp Jani Nikula
2023-05-29  5:15   ` Nautiyal, Ankit K
2023-04-21 11:47 ` [Intel-gfx] [PATCH 04/13] drm/i915/dp: stop caching has_hdmi_sink " Jani Nikula
2023-05-29  5:22   ` Nautiyal, Ankit K
2023-05-29  5:32     ` Nautiyal, Ankit K
2023-04-21 11:47 ` [Intel-gfx] [PATCH 05/13] drm/i915/hdmi: stop caching has_audio in struct intel_hdmi Jani Nikula
2023-05-29  5:43   ` Nautiyal, Ankit K
2023-04-21 11:47 ` [Intel-gfx] [PATCH 06/13] drm/i915/hdmi: stop caching has_hdmi_sink " Jani Nikula
2023-05-29  5:49   ` Nautiyal, Ankit K
2023-04-21 11:47 ` [Intel-gfx] [PATCH 07/13] drm/i915/sdvo: stop caching has_hdmi_monitor in struct intel_sdvo Jani Nikula
2023-05-29  6:05   ` Nautiyal, Ankit K
2023-04-21 11:47 ` [Intel-gfx] [PATCH 08/13] drm/i915/sdvo: stop caching has_hdmi_audio " Jani Nikula
2023-05-29  6:06   ` Nautiyal, Ankit K
2023-04-21 11:47 ` [Intel-gfx] [PATCH 09/13] drm/edid: add drm_edid_read_switcheroo() Jani Nikula
2023-05-30  4:09   ` Nautiyal, Ankit K
2023-04-21 11:47 ` [Intel-gfx] [PATCH 10/13] drm/i915/lvds: switch to drm_edid_read_switcheroo() Jani Nikula
2023-04-23  8:10   ` Lukas Wunner
2023-04-21 11:47 ` [Intel-gfx] [PATCH 11/13] drm/edid: make drm_edid_duplicate() safe to call with NULL parameter Jani Nikula
2023-05-29 13:11   ` Nautiyal, Ankit K
2023-04-21 11:47 ` [Intel-gfx] [PATCH 12/13] drm/display/dp_mst: convert to struct drm_edid Jani Nikula
2023-05-29 13:08   ` Nautiyal, Ankit K
2023-04-21 11:47 ` [Intel-gfx] [PATCH 13/13] drm/i915/display: switch the rest of the connectors " Jani Nikula
2023-05-30  4:38   ` Nautiyal, Ankit K
2023-04-21 14:11 ` [Intel-gfx] ✗ Fi.CI.SPARSE: warning for drm/display & drm/i915: more struct drm_edid conversions Patchwork
2023-04-21 14:21 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork
2023-04-21 22:34 ` [Intel-gfx] ✗ Fi.CI.IGT: failure " Patchwork

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox