* [Intel-gfx] [PATCH v2 0/5] drm/i915: Init DDI ports in VBT order
@ 2023-06-20 17:32 Ville Syrjala
2023-06-20 17:32 ` [Intel-gfx] [PATCH v2 1/5] drm/i915: Initialize dig_port->aux_ch to NONE to be sure Ville Syrjala
` (8 more replies)
0 siblings, 9 replies; 19+ messages in thread
From: Ville Syrjala @ 2023-06-20 17:32 UTC (permalink / raw)
To: intel-gfx
From: Ville Syrjälä <ville.syrjala@linux.intel.com>
The remaining parts of the big VBT based DDI port initialization
series.
The main goal being to get the HDMI port working on many
ADL-P machines where the VBT declares both eDP and HDMI
for the same DDI port (B).
Ville Syrjälä (5):
drm/i915: Initialize dig_port->aux_ch to NONE to be sure
drm/i915: Only populate aux_ch is really needed
drm/i915: Remove DDC pin sanitation
drm/i915: Remove AUX CH sanitation
drm/i915: Try to initialize DDI/ICL+ DSI ports for every VBT child
device
drivers/gpu/drm/i915/display/g4x_dp.c | 5 +
drivers/gpu/drm/i915/display/g4x_hdmi.c | 3 +-
drivers/gpu/drm/i915/display/icl_dsi.c | 11 +-
drivers/gpu/drm/i915/display/icl_dsi.h | 6 +-
drivers/gpu/drm/i915/display/intel_bios.c | 187 +++++-------------
drivers/gpu/drm/i915/display/intel_bios.h | 6 +
drivers/gpu/drm/i915/display/intel_ddi.c | 66 +++++--
drivers/gpu/drm/i915/display/intel_ddi.h | 5 +-
drivers/gpu/drm/i915/display/intel_display.c | 11 +-
.../gpu/drm/i915/display/intel_display_core.h | 2 -
drivers/gpu/drm/i915/display/intel_dp_aux.c | 51 ++++-
drivers/gpu/drm/i915/display/intel_hdmi.c | 72 +++++--
12 files changed, 232 insertions(+), 193 deletions(-)
--
2.39.3
^ permalink raw reply [flat|nested] 19+ messages in thread
* [Intel-gfx] [PATCH v2 1/5] drm/i915: Initialize dig_port->aux_ch to NONE to be sure
2023-06-20 17:32 [Intel-gfx] [PATCH v2 0/5] drm/i915: Init DDI ports in VBT order Ville Syrjala
@ 2023-06-20 17:32 ` Ville Syrjala
2023-06-21 7:44 ` Jani Nikula
2023-06-20 17:32 ` [Intel-gfx] [PATCH v2 2/5] drm/i915: Only populate aux_ch is really needed Ville Syrjala
` (7 subsequent siblings)
8 siblings, 1 reply; 19+ messages in thread
From: Ville Syrjala @ 2023-06-20 17:32 UTC (permalink / raw)
To: intel-gfx
From: Ville Syrjälä <ville.syrjala@linux.intel.com>
Make sure dig_port->aux_ch is trustworthy by initializing it
to NONE (-1) at the start. The encoder init will later fill in
the actual value, if appropriate.
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
drivers/gpu/drm/i915/display/g4x_dp.c | 2 ++
drivers/gpu/drm/i915/display/g4x_hdmi.c | 2 ++
drivers/gpu/drm/i915/display/intel_ddi.c | 2 ++
3 files changed, 6 insertions(+)
diff --git a/drivers/gpu/drm/i915/display/g4x_dp.c b/drivers/gpu/drm/i915/display/g4x_dp.c
index c58a3f249a01..0cab5992e3da 100644
--- a/drivers/gpu/drm/i915/display/g4x_dp.c
+++ b/drivers/gpu/drm/i915/display/g4x_dp.c
@@ -1273,6 +1273,8 @@ bool g4x_dp_init(struct drm_i915_private *dev_priv,
if (!dig_port)
return false;
+ dig_port->aux_ch = AUX_CH_NONE;
+
intel_connector = intel_connector_alloc();
if (!intel_connector)
goto err_connector_alloc;
diff --git a/drivers/gpu/drm/i915/display/g4x_hdmi.c b/drivers/gpu/drm/i915/display/g4x_hdmi.c
index 8c71e3ede680..c1fd13bdc9d2 100644
--- a/drivers/gpu/drm/i915/display/g4x_hdmi.c
+++ b/drivers/gpu/drm/i915/display/g4x_hdmi.c
@@ -698,6 +698,8 @@ void g4x_hdmi_init(struct drm_i915_private *dev_priv,
if (!dig_port)
return;
+ dig_port->aux_ch = AUX_CH_NONE;
+
intel_connector = intel_connector_alloc();
if (!intel_connector) {
kfree(dig_port);
diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c
index 61722556bb47..6cb24a472a9b 100644
--- a/drivers/gpu/drm/i915/display/intel_ddi.c
+++ b/drivers/gpu/drm/i915/display/intel_ddi.c
@@ -4747,6 +4747,8 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)
if (!dig_port)
return;
+ dig_port->aux_ch = AUX_CH_NONE;
+
encoder = &dig_port->base;
encoder->devdata = devdata;
--
2.39.3
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [Intel-gfx] [PATCH v2 2/5] drm/i915: Only populate aux_ch is really needed
2023-06-20 17:32 [Intel-gfx] [PATCH v2 0/5] drm/i915: Init DDI ports in VBT order Ville Syrjala
2023-06-20 17:32 ` [Intel-gfx] [PATCH v2 1/5] drm/i915: Initialize dig_port->aux_ch to NONE to be sure Ville Syrjala
@ 2023-06-20 17:32 ` Ville Syrjala
2023-06-21 7:46 ` Jani Nikula
2023-06-20 17:32 ` [Intel-gfx] [PATCH v2 3/5] drm/i915: Remove DDC pin sanitation Ville Syrjala
` (6 subsequent siblings)
8 siblings, 1 reply; 19+ messages in thread
From: Ville Syrjala @ 2023-06-20 17:32 UTC (permalink / raw)
To: intel-gfx
From: Ville Syrjälä <ville.syrjala@linux.intel.com>
Mixing VBT based AUX CH with platform defaults seems like
a recipe for conflicts. Let's only populate AUX CH if we
absolutely need it, that is only if we are dealing with
a DP output or a TC port (which need it due to some power
well shenanigans).
TODO: double check that real VBTs do in fact populate
the AUX CH for HDMI TC legacy ports...
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
drivers/gpu/drm/i915/display/g4x_hdmi.c | 1 -
drivers/gpu/drm/i915/display/intel_ddi.c | 12 +++++++++++-
2 files changed, 11 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/g4x_hdmi.c b/drivers/gpu/drm/i915/display/g4x_hdmi.c
index c1fd13bdc9d2..634b14116d9d 100644
--- a/drivers/gpu/drm/i915/display/g4x_hdmi.c
+++ b/drivers/gpu/drm/i915/display/g4x_hdmi.c
@@ -775,6 +775,5 @@ void g4x_hdmi_init(struct drm_i915_private *dev_priv,
intel_infoframe_init(dig_port);
- dig_port->aux_ch = intel_dp_aux_ch(intel_encoder);
intel_hdmi_init_connector(dig_port, intel_connector);
}
diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c
index 6cb24a472a9b..662b5ceef3c8 100644
--- a/drivers/gpu/drm/i915/display/intel_ddi.c
+++ b/drivers/gpu/drm/i915/display/intel_ddi.c
@@ -4676,6 +4676,14 @@ static bool port_strap_detected(struct drm_i915_private *i915, enum port port)
}
}
+static bool need_aux_ch(struct intel_encoder *encoder, bool init_dp)
+{
+ struct drm_i915_private *i915 = to_i915(encoder->base.dev);
+ enum phy phy = intel_port_to_phy(i915, encoder->port);
+
+ return init_dp || intel_phy_is_tc(i915, phy);
+}
+
void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)
{
struct intel_digital_port *dig_port;
@@ -4929,7 +4937,9 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)
dig_port->dp.output_reg = INVALID_MMIO_REG;
dig_port->max_lanes = intel_ddi_max_lanes(dig_port);
- dig_port->aux_ch = intel_dp_aux_ch(encoder);
+
+ if (need_aux_ch(encoder, init_dp))
+ dig_port->aux_ch = intel_dp_aux_ch(encoder);
if (intel_phy_is_tc(dev_priv, phy)) {
bool is_legacy =
--
2.39.3
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [Intel-gfx] [PATCH v2 3/5] drm/i915: Remove DDC pin sanitation
2023-06-20 17:32 [Intel-gfx] [PATCH v2 0/5] drm/i915: Init DDI ports in VBT order Ville Syrjala
2023-06-20 17:32 ` [Intel-gfx] [PATCH v2 1/5] drm/i915: Initialize dig_port->aux_ch to NONE to be sure Ville Syrjala
2023-06-20 17:32 ` [Intel-gfx] [PATCH v2 2/5] drm/i915: Only populate aux_ch is really needed Ville Syrjala
@ 2023-06-20 17:32 ` Ville Syrjala
2023-06-21 7:56 ` Jani Nikula
2023-06-20 17:32 ` [Intel-gfx] [PATCH v2 4/5] drm/i915: Remove AUX CH sanitation Ville Syrjala
` (5 subsequent siblings)
8 siblings, 1 reply; 19+ messages in thread
From: Ville Syrjala @ 2023-06-20 17:32 UTC (permalink / raw)
To: intel-gfx
From: Ville Syrjälä <ville.syrjala@linux.intel.com>
Stop with the VBT DDC pin sanitation, and instead just check
that the appropriate DDC pin is still available when initializing
a HDMI connector.
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
drivers/gpu/drm/i915/display/intel_bios.c | 69 ----------------------
drivers/gpu/drm/i915/display/intel_hdmi.c | 72 +++++++++++++++++++----
2 files changed, 59 insertions(+), 82 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/intel_bios.c b/drivers/gpu/drm/i915/display/intel_bios.c
index 34a397adbd6b..439ab5b3cbe5 100644
--- a/drivers/gpu/drm/i915/display/intel_bios.c
+++ b/drivers/gpu/drm/i915/display/intel_bios.c
@@ -2230,72 +2230,6 @@ static u8 map_ddc_pin(struct drm_i915_private *i915, u8 vbt_pin)
return 0;
}
-static enum port get_port_by_ddc_pin(struct drm_i915_private *i915, u8 ddc_pin)
-{
- enum port port;
-
- if (!ddc_pin)
- return PORT_NONE;
-
- for_each_port(port) {
- const struct intel_bios_encoder_data *devdata =
- i915->display.vbt.ports[port];
-
- if (devdata && ddc_pin == devdata->child.ddc_pin)
- return port;
- }
-
- return PORT_NONE;
-}
-
-static void sanitize_ddc_pin(struct intel_bios_encoder_data *devdata,
- enum port port)
-{
- struct drm_i915_private *i915 = devdata->i915;
- struct child_device_config *child;
- u8 mapped_ddc_pin;
- enum port p;
-
- if (!devdata->child.ddc_pin)
- return;
-
- mapped_ddc_pin = map_ddc_pin(i915, devdata->child.ddc_pin);
- if (!intel_gmbus_is_valid_pin(i915, mapped_ddc_pin)) {
- drm_dbg_kms(&i915->drm,
- "Port %c has invalid DDC pin %d, "
- "sticking to defaults\n",
- port_name(port), mapped_ddc_pin);
- devdata->child.ddc_pin = 0;
- return;
- }
-
- p = get_port_by_ddc_pin(i915, devdata->child.ddc_pin);
- if (p == PORT_NONE)
- return;
-
- drm_dbg_kms(&i915->drm,
- "port %c trying to use the same DDC pin (0x%x) as port %c, "
- "disabling port %c DVI/HDMI support\n",
- port_name(port), mapped_ddc_pin,
- port_name(p), port_name(p));
-
- /*
- * If we have multiple ports supposedly sharing the pin, then dvi/hdmi
- * couldn't exist on the shared port. Otherwise they share the same ddc
- * pin and system couldn't communicate with them separately.
- *
- * Give inverse child device order the priority, last one wins. Yes,
- * there are real machines (eg. Asrock B250M-HDV) where VBT has both
- * port A and port E with the same AUX ch and we must pick port E :(
- */
- child = &i915->display.vbt.ports[p]->child;
-
- child->device_type &= ~DEVICE_TYPE_TMDS_DVI_SIGNALING;
- child->device_type |= DEVICE_TYPE_NOT_HDMI_OUTPUT;
-
- child->ddc_pin = 0;
-}
-
static enum port get_port_by_aux_ch(struct drm_i915_private *i915, u8 aux_ch)
{
enum port port;
@@ -2753,9 +2687,6 @@ static void parse_ddi_port(struct intel_bios_encoder_data *devdata)
sanitize_device_type(devdata, port);
- if (intel_bios_encoder_supports_dvi(devdata))
- sanitize_ddc_pin(devdata, port);
-
if (intel_bios_encoder_supports_dp(devdata))
sanitize_aux_ch(devdata, port);
diff --git a/drivers/gpu/drm/i915/display/intel_hdmi.c b/drivers/gpu/drm/i915/display/intel_hdmi.c
index 7ac5e6c5e00d..8d1c8abfcffa 100644
--- a/drivers/gpu/drm/i915/display/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/display/intel_hdmi.c
@@ -2880,21 +2880,12 @@ static u8 g4x_port_to_ddc_pin(struct drm_i915_private *dev_priv,
return ddc_pin;
}
-static u8 intel_hdmi_ddc_pin(struct intel_encoder *encoder)
+static u8 intel_hdmi_default_ddc_pin(struct intel_encoder *encoder)
{
struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
enum port port = encoder->port;
u8 ddc_pin;
- ddc_pin = intel_bios_hdmi_ddc_pin(encoder->devdata);
- if (ddc_pin) {
- drm_dbg_kms(&dev_priv->drm,
- "[ENCODER:%d:%s] Using DDC pin 0x%x (VBT)\n",
- encoder->base.base.id, encoder->base.name,
- ddc_pin);
- return ddc_pin;
- }
-
if (IS_ALDERLAKE_S(dev_priv))
ddc_pin = adls_port_to_ddc_pin(dev_priv, port);
else if (INTEL_PCH_TYPE(dev_priv) >= PCH_DG1)
@@ -2916,10 +2907,62 @@ static u8 intel_hdmi_ddc_pin(struct intel_encoder *encoder)
else
ddc_pin = g4x_port_to_ddc_pin(dev_priv, port);
- drm_dbg_kms(&dev_priv->drm,
- "[ENCODER:%d:%s] Using DDC pin 0x%x (platform default)\n",
+ return ddc_pin;
+}
+
+static struct intel_encoder *
+get_encoder_by_ddc_pin(struct intel_encoder *encoder, u8 ddc_pin)
+{
+ struct drm_i915_private *i915 = to_i915(encoder->base.dev);
+ struct intel_encoder *other;
+
+ for_each_intel_encoder(&i915->drm, other) {
+ if (other == encoder)
+ continue;
+
+ if (!intel_encoder_is_dig_port(other))
+ continue;
+
+ if (enc_to_dig_port(other)->hdmi.ddc_bus == ddc_pin)
+ return other;
+ }
+
+ return NULL;
+}
+
+static u8 intel_hdmi_ddc_pin(struct intel_encoder *encoder)
+{
+ struct drm_i915_private *i915 = to_i915(encoder->base.dev);
+ struct intel_encoder *other;
+ const char *source;
+ u8 ddc_pin;
+
+ ddc_pin = intel_bios_hdmi_ddc_pin(encoder->devdata);
+ source = "VBT";
+
+ if (!ddc_pin) {
+ ddc_pin = intel_hdmi_default_ddc_pin(encoder);
+ source = "platform default";
+ }
+
+ if (!intel_gmbus_is_valid_pin(i915, ddc_pin)) {
+ drm_dbg_kms(&i915->drm, "[ENCODER:%d:%s] Invalid DDC pin %d\n",
+ encoder->base.base.id, encoder->base.name, ddc_pin);
+ return 0;
+ }
+
+ other = get_encoder_by_ddc_pin(encoder, ddc_pin);
+ if (other) {
+ drm_dbg_kms(&i915->drm, "[ENCODER:%d:%s] DDC pin %d already claimed by [ENCODER:%d:%s]\n",
+ encoder->base.base.id, encoder->base.name, ddc_pin,
+ other->base.base.id, other->base.name);
+ return 0;
+ }
+
+ drm_dbg_kms(&i915->drm,
+ "[ENCODER:%d:%s] Using DDC pin 0x%x (%s)\n",
encoder->base.base.id, encoder->base.name,
- ddc_pin);
+ ddc_pin, source);
return ddc_pin;
}
@@ -2990,6 +3033,9 @@ void intel_hdmi_init_connector(struct intel_digital_port *dig_port,
return;
intel_hdmi->ddc_bus = intel_hdmi_ddc_pin(intel_encoder);
+ if (!intel_hdmi->ddc_bus)
+ return;
+
ddc = intel_gmbus_get_adapter(dev_priv, intel_hdmi->ddc_bus);
drm_connector_init_with_ddc(dev, connector,
--
2.39.3
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [Intel-gfx] [PATCH v2 4/5] drm/i915: Remove AUX CH sanitation
2023-06-20 17:32 [Intel-gfx] [PATCH v2 0/5] drm/i915: Init DDI ports in VBT order Ville Syrjala
` (2 preceding siblings ...)
2023-06-20 17:32 ` [Intel-gfx] [PATCH v2 3/5] drm/i915: Remove DDC pin sanitation Ville Syrjala
@ 2023-06-20 17:32 ` Ville Syrjala
2023-06-21 8:00 ` Jani Nikula
2023-06-20 17:32 ` [Intel-gfx] [PATCH v2 5/5] drm/i915: Try to initialize DDI/ICL+ DSI ports for every VBT child device Ville Syrjala
` (4 subsequent siblings)
8 siblings, 1 reply; 19+ messages in thread
From: Ville Syrjala @ 2023-06-20 17:32 UTC (permalink / raw)
To: intel-gfx
From: Ville Syrjälä <ville.syrjala@linux.intel.com>
Stop with the VBT AUX CH sanitation, and instead just check
that the appropriate AUX CH is still available when initializing
a DP/TC port.
Note that the old way of sanitizing gave priority to the last
port declared in the VBT, but now we sort of do the opposite by
favoring the first encoder to succesfully initialize. The reason
for the old "last port wins" preference was eg. Asrock B250M-HDV
where port A (eDP) and port E (DP->VGA) have an AUX CH conflict
and we need to prefer port E. However with the new way port A (eDP)
will be probed first, but will fail to probe due to HPD and thus
port E will still win in the end.
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
drivers/gpu/drm/i915/display/g4x_dp.c | 3 ++
drivers/gpu/drm/i915/display/intel_bios.c | 53 ---------------------
drivers/gpu/drm/i915/display/intel_ddi.c | 5 +-
drivers/gpu/drm/i915/display/intel_dp_aux.c | 51 ++++++++++++++++----
4 files changed, 50 insertions(+), 62 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/g4x_dp.c b/drivers/gpu/drm/i915/display/g4x_dp.c
index 0cab5992e3da..4c7187f7913e 100644
--- a/drivers/gpu/drm/i915/display/g4x_dp.c
+++ b/drivers/gpu/drm/i915/display/g4x_dp.c
@@ -1378,6 +1378,9 @@ bool g4x_dp_init(struct drm_i915_private *dev_priv,
intel_infoframe_init(dig_port);
dig_port->aux_ch = intel_dp_aux_ch(intel_encoder);
+ if (dig_port->aux_ch == AUX_CH_NONE)
+ goto err_init_connector;
+
if (!intel_dp_init_connector(dig_port, intel_connector))
goto err_init_connector;
diff --git a/drivers/gpu/drm/i915/display/intel_bios.c b/drivers/gpu/drm/i915/display/intel_bios.c
index 439ab5b3cbe5..d1bf725ee9b3 100644
--- a/drivers/gpu/drm/i915/display/intel_bios.c
+++ b/drivers/gpu/drm/i915/display/intel_bios.c
@@ -2230,56 +2230,6 @@ static u8 map_ddc_pin(struct drm_i915_private *i915, u8 vbt_pin)
return 0;
}
-static enum port get_port_by_aux_ch(struct drm_i915_private *i915, u8 aux_ch)
-{
- enum port port;
-
- if (!aux_ch)
- return PORT_NONE;
-
- for_each_port(port) {
- const struct intel_bios_encoder_data *devdata =
- i915->display.vbt.ports[port];
-
- if (devdata && aux_ch == devdata->child.aux_channel)
- return port;
- }
-
- return PORT_NONE;
-}
-
-static void sanitize_aux_ch(struct intel_bios_encoder_data *devdata,
- enum port port)
-{
- struct drm_i915_private *i915 = devdata->i915;
- struct child_device_config *child;
- enum port p;
-
- p = get_port_by_aux_ch(i915, devdata->child.aux_channel);
- if (p == PORT_NONE)
- return;
-
- drm_dbg_kms(&i915->drm,
- "port %c trying to use the same AUX CH (0x%x) as port %c, "
- "disabling port %c DP support\n",
- port_name(port), devdata->child.aux_channel,
- port_name(p), port_name(p));
-
- /*
- * If we have multiple ports supposedly sharing the aux channel, then DP
- * couldn't exist on the shared port. Otherwise they share the same aux
- * channel and system couldn't communicate with them separately.
- *
- * Give inverse child device order the priority, last one wins. Yes,
- * there are real machines (eg. Asrock B250M-HDV) where VBT has both
- * port A and port E with the same AUX ch and we must pick port E :(
- */
- child = &i915->display.vbt.ports[p]->child;
-
- child->device_type &= ~DEVICE_TYPE_DISPLAYPORT_OUTPUT;
- child->aux_channel = 0;
-}
-
static u8 dvo_port_type(u8 dvo_port)
{
switch (dvo_port) {
@@ -2687,9 +2637,6 @@ static void parse_ddi_port(struct intel_bios_encoder_data *devdata)
sanitize_device_type(devdata, port);
- if (intel_bios_encoder_supports_dp(devdata))
- sanitize_aux_ch(devdata, port);
-
i915->display.vbt.ports[port] = devdata;
}
diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c
index 662b5ceef3c8..9e4e6482aa26 100644
--- a/drivers/gpu/drm/i915/display/intel_ddi.c
+++ b/drivers/gpu/drm/i915/display/intel_ddi.c
@@ -4938,8 +4938,11 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)
dig_port->dp.output_reg = INVALID_MMIO_REG;
dig_port->max_lanes = intel_ddi_max_lanes(dig_port);
- if (need_aux_ch(encoder, init_dp))
+ if (need_aux_ch(encoder, init_dp)) {
dig_port->aux_ch = intel_dp_aux_ch(encoder);
+ if (dig_port->aux_ch == AUX_CH_NONE)
+ goto err;
+ }
if (intel_phy_is_tc(dev_priv, phy)) {
bool is_legacy =
diff --git a/drivers/gpu/drm/i915/display/intel_dp_aux.c b/drivers/gpu/drm/i915/display/intel_dp_aux.c
index 21b50a5c8a85..2d173bd495a3 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_aux.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_aux.c
@@ -792,25 +792,60 @@ static enum aux_ch default_aux_ch(struct intel_encoder *encoder)
return (enum aux_ch)encoder->port;
}
+static struct intel_encoder *
+get_encoder_by_aux_ch(struct intel_encoder *encoder,
+ enum aux_ch aux_ch)
+{
+ struct drm_i915_private *i915 = to_i915(encoder->base.dev);
+ struct intel_encoder *other;
+
+ for_each_intel_encoder(&i915->drm, other) {
+ if (other == encoder)
+ continue;
+
+ if (!intel_encoder_is_dig_port(other))
+ continue;
+
+ if (enc_to_dig_port(other)->aux_ch == aux_ch)
+ return other;
+ }
+
+ return NULL;
+}
+
enum aux_ch intel_dp_aux_ch(struct intel_encoder *encoder)
{
struct drm_i915_private *i915 = to_i915(encoder->base.dev);
+ struct intel_encoder *other;
+ const char *source;
enum aux_ch aux_ch;
aux_ch = intel_bios_dp_aux_ch(encoder->devdata);
- if (aux_ch != AUX_CH_NONE) {
- drm_dbg_kms(&i915->drm, "[ENCODER:%d:%s] using AUX %c (VBT)\n",
- encoder->base.base.id, encoder->base.name,
- aux_ch_name(aux_ch));
- return aux_ch;
+ source = "VBT";
+
+ if (aux_ch == AUX_CH_NONE) {
+ aux_ch = default_aux_ch(encoder);
+ source = "platform default";
}
- aux_ch = default_aux_ch(encoder);
+ if (aux_ch == AUX_CH_NONE)
+ return AUX_CH_NONE;
+
+ /* FIXME validate aux_ch against platform caps */
+
+ other = get_encoder_by_aux_ch(encoder, aux_ch);
+ if (other) {
+ drm_dbg_kms(&i915->drm,
+ "[ENCODER:%d:%s] AUX CH %c already claimed by [ENCODER:%d:%s]\n",
+ encoder->base.base.id, encoder->base.name, aux_ch_name(aux_ch),
+ other->base.base.id, other->base.name);
+ return AUX_CH_NONE;
+ }
drm_dbg_kms(&i915->drm,
- "[ENCODER:%d:%s] using AUX %c (platform default)\n",
+ "[ENCODER:%d:%s] Using AUX CH %c (%s)\n",
encoder->base.base.id, encoder->base.name,
- aux_ch_name(aux_ch));
+ aux_ch_name(aux_ch), source);
return aux_ch;
}
--
2.39.3
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [Intel-gfx] [PATCH v2 5/5] drm/i915: Try to initialize DDI/ICL+ DSI ports for every VBT child device
2023-06-20 17:32 [Intel-gfx] [PATCH v2 0/5] drm/i915: Init DDI ports in VBT order Ville Syrjala
` (3 preceding siblings ...)
2023-06-20 17:32 ` [Intel-gfx] [PATCH v2 4/5] drm/i915: Remove AUX CH sanitation Ville Syrjala
@ 2023-06-20 17:32 ` Ville Syrjala
2023-06-26 13:06 ` Jani Nikula
2023-06-20 21:30 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for drm/i915: Init DDI ports in VBT order (rev4) Patchwork
` (3 subsequent siblings)
8 siblings, 1 reply; 19+ messages in thread
From: Ville Syrjala @ 2023-06-20 17:32 UTC (permalink / raw)
To: intel-gfx
From: Ville Syrjälä <ville.syrjala@linux.intel.com>
Try to deal with duplicate child devices for the same DDI port
by attempting to initialize them in VBT defined order The first
on to succeed for a specific DDI port will be the one we use.
We'll also get rid of i915->display.vbt.ports[] here as any conflicts
will now be handled at encoder registration time rather than during
VBT parsing. Note that intel_bios_encoder_data_lookup() still remaims
for pre-DDI DP/HDMI ports as those don't (at least yet) use VBT
driven initialization.
TODO: DSI dual link handling is sketchy at best
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
drivers/gpu/drm/i915/display/icl_dsi.c | 11 ++--
drivers/gpu/drm/i915/display/icl_dsi.h | 6 +-
drivers/gpu/drm/i915/display/intel_bios.c | 65 ++++++++++++++-----
drivers/gpu/drm/i915/display/intel_bios.h | 6 ++
drivers/gpu/drm/i915/display/intel_ddi.c | 49 +++++++++++---
drivers/gpu/drm/i915/display/intel_ddi.h | 5 +-
drivers/gpu/drm/i915/display/intel_display.c | 11 +---
.../gpu/drm/i915/display/intel_display_core.h | 2 -
8 files changed, 107 insertions(+), 48 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/icl_dsi.c b/drivers/gpu/drm/i915/display/icl_dsi.c
index 59a2a289d9be..475f4f587c79 100644
--- a/drivers/gpu/drm/i915/display/icl_dsi.c
+++ b/drivers/gpu/drm/i915/display/icl_dsi.c
@@ -1933,16 +1933,14 @@ static void icl_dsi_add_properties(struct intel_connector *connector)
fixed_mode->vdisplay);
}
-void icl_dsi_init(struct drm_i915_private *dev_priv)
+void icl_dsi_init(struct drm_i915_private *dev_priv,
+ const struct intel_bios_encoder_data *devdata,
+ enum port port)
{
struct intel_dsi *intel_dsi;
struct intel_encoder *encoder;
struct intel_connector *intel_connector;
struct drm_connector *connector;
- enum port port;
-
- if (!intel_bios_is_dsi_present(dev_priv, &port))
- return;
intel_dsi = kzalloc(sizeof(*intel_dsi), GFP_KERNEL);
if (!intel_dsi)
@@ -1958,6 +1956,8 @@ void icl_dsi_init(struct drm_i915_private *dev_priv)
intel_dsi->attached_connector = intel_connector;
connector = &intel_connector->base;
+ encoder->devdata = devdata;
+
/* register DSI encoder with DRM subsystem */
drm_encoder_init(&dev_priv->drm, &encoder->base, &gen11_dsi_encoder_funcs,
DRM_MODE_ENCODER_DSI, "DSI %c", port_name(port));
@@ -1995,7 +1995,6 @@ void icl_dsi_init(struct drm_i915_private *dev_priv)
intel_dsi->panel_power_off_time = ktime_get_boottime();
- encoder->devdata = intel_bios_encoder_data_lookup(dev_priv, port);
intel_bios_init_panel_late(dev_priv, &intel_connector->panel, encoder->devdata, NULL);
mutex_lock(&dev_priv->drm.mode_config.mutex);
diff --git a/drivers/gpu/drm/i915/display/icl_dsi.h b/drivers/gpu/drm/i915/display/icl_dsi.h
index b4861b56b5b2..ac42f2dc21ec 100644
--- a/drivers/gpu/drm/i915/display/icl_dsi.h
+++ b/drivers/gpu/drm/i915/display/icl_dsi.h
@@ -6,10 +6,14 @@
#ifndef __ICL_DSI_H__
#define __ICL_DSI_H__
+enum port;
struct drm_i915_private;
+struct intel_bios_encoder_data;
struct intel_crtc_state;
-void icl_dsi_init(struct drm_i915_private *i915);
+void icl_dsi_init(struct drm_i915_private *i915,
+ const struct intel_bios_encoder_data *devdata,
+ enum port port);
void icl_dsi_frame_update(struct intel_crtc_state *crtc_state);
#endif /* __ICL_DSI_H__ */
diff --git a/drivers/gpu/drm/i915/display/intel_bios.c b/drivers/gpu/drm/i915/display/intel_bios.c
index d1bf725ee9b3..7d2e843681f3 100644
--- a/drivers/gpu/drm/i915/display/intel_bios.c
+++ b/drivers/gpu/drm/i915/display/intel_bios.c
@@ -2484,7 +2484,7 @@ intel_bios_encoder_supports_edp(const struct intel_bios_encoder_data *devdata)
devdata->child.device_type & DEVICE_TYPE_INTERNAL_CONNECTOR;
}
-static bool
+bool
intel_bios_encoder_supports_dsi(const struct intel_bios_encoder_data *devdata)
{
return devdata->child.device_type & DEVICE_TYPE_MIPI_OUTPUT;
@@ -2542,13 +2542,19 @@ static bool is_port_valid(struct drm_i915_private *i915, enum port port)
return true;
}
-static void print_ddi_port(const struct intel_bios_encoder_data *devdata,
- enum port port)
+static void print_ddi_port(const struct intel_bios_encoder_data *devdata)
{
struct drm_i915_private *i915 = devdata->i915;
const struct child_device_config *child = &devdata->child;
bool is_dvi, is_hdmi, is_dp, is_edp, is_dsi, is_crt, supports_typec_usb, supports_tbt;
int dp_boost_level, dp_max_link_rate, hdmi_boost_level, hdmi_level_shift, max_tmds_clock;
+ enum port port;
+
+ port = dvo_port_to_port(i915, child->dvo_port);
+ if (port == PORT_NONE && DISPLAY_VER(i915) >= 11)
+ port = dsi_dvo_port_to_port(i915, child->dvo_port);
+ if (port == PORT_NONE)
+ return;
is_dvi = intel_bios_encoder_supports_dvi(devdata);
is_dp = intel_bios_encoder_supports_dp(devdata);
@@ -2628,16 +2634,7 @@ static void parse_ddi_port(struct intel_bios_encoder_data *devdata)
return;
}
- if (i915->display.vbt.ports[port]) {
- drm_dbg_kms(&i915->drm,
- "More than one child device for port %c in VBT, using the first.\n",
- port_name(port));
- return;
- }
-
sanitize_device_type(devdata, port);
-
- i915->display.vbt.ports[port] = devdata;
}
static bool has_ddi_port_info(struct drm_i915_private *i915)
@@ -2648,7 +2645,6 @@ static bool has_ddi_port_info(struct drm_i915_private *i915)
static void parse_ddi_ports(struct drm_i915_private *i915)
{
struct intel_bios_encoder_data *devdata;
- enum port port;
if (!has_ddi_port_info(i915))
return;
@@ -2656,10 +2652,8 @@ static void parse_ddi_ports(struct drm_i915_private *i915)
list_for_each_entry(devdata, &i915->display.vbt.display_devices, node)
parse_ddi_port(devdata);
- for_each_port(port) {
- if (i915->display.vbt.ports[port])
- print_ddi_port(i915->display.vbt.ports[port], port);
- }
+ list_for_each_entry(devdata, &i915->display.vbt.display_devices, node)
+ print_ddi_port(devdata);
}
static void
@@ -3584,5 +3578,40 @@ bool intel_bios_encoder_hpd_invert(const struct intel_bios_encoder_data *devdata
const struct intel_bios_encoder_data *
intel_bios_encoder_data_lookup(struct drm_i915_private *i915, enum port port)
{
- return i915->display.vbt.ports[port];
+ struct intel_bios_encoder_data *devdata;
+
+ list_for_each_entry(devdata, &i915->display.vbt.display_devices, node) {
+ const struct child_device_config *child = &devdata->child;
+ enum port p;
+
+ p = dvo_port_to_port(i915, child->dvo_port);
+ if (p == PORT_NONE && DISPLAY_VER(i915) >= 11)
+ p = dsi_dvo_port_to_port(i915, child->dvo_port);
+
+ if (p == port)
+ return devdata;
+ }
+
+ return NULL;
+}
+
+void intel_bios_for_each_encoder(struct drm_i915_private *i915,
+ void (*func)(struct drm_i915_private *i915,
+ const struct intel_bios_encoder_data *devdata,
+ enum port port))
+{
+ struct intel_bios_encoder_data *devdata;
+
+ list_for_each_entry(devdata, &i915->display.vbt.display_devices, node) {
+ const struct child_device_config *child = &devdata->child;
+ enum port port;
+
+ port = dvo_port_to_port(i915, child->dvo_port);
+ if (port == PORT_NONE && DISPLAY_VER(i915) >= 11)
+ port = dsi_dvo_port_to_port(i915, child->dvo_port);
+ if (port == PORT_NONE)
+ continue;
+
+ func(i915, devdata, port);
+ }
}
diff --git a/drivers/gpu/drm/i915/display/intel_bios.h b/drivers/gpu/drm/i915/display/intel_bios.h
index 45fae97d9719..fdc847211a84 100644
--- a/drivers/gpu/drm/i915/display/intel_bios.h
+++ b/drivers/gpu/drm/i915/display/intel_bios.h
@@ -263,6 +263,7 @@ bool intel_bios_encoder_supports_dp(const struct intel_bios_encoder_data *devdat
bool intel_bios_encoder_supports_edp(const struct intel_bios_encoder_data *devdata);
bool intel_bios_encoder_supports_typec_usb(const struct intel_bios_encoder_data *devdata);
bool intel_bios_encoder_supports_tbt(const struct intel_bios_encoder_data *devdata);
+bool intel_bios_encoder_supports_dsi(const struct intel_bios_encoder_data *devdata);
bool intel_bios_encoder_supports_dp_dual_mode(const struct intel_bios_encoder_data *devdata);
bool intel_bios_encoder_is_lspcon(const struct intel_bios_encoder_data *devdata);
bool intel_bios_encoder_lane_reversal(const struct intel_bios_encoder_data *devdata);
@@ -276,4 +277,9 @@ int intel_bios_hdmi_ddc_pin(const struct intel_bios_encoder_data *devdata);
int intel_bios_hdmi_level_shift(const struct intel_bios_encoder_data *devdata);
int intel_bios_hdmi_max_tmds_clock(const struct intel_bios_encoder_data *devdata);
+void intel_bios_for_each_encoder(struct drm_i915_private *i915,
+ void (*func)(struct drm_i915_private *i915,
+ const struct intel_bios_encoder_data *devdata,
+ enum port port));
+
#endif /* _INTEL_BIOS_H_ */
diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c
index 9e4e6482aa26..7bfcd52e4645 100644
--- a/drivers/gpu/drm/i915/display/intel_ddi.c
+++ b/drivers/gpu/drm/i915/display/intel_ddi.c
@@ -32,6 +32,7 @@
#include "i915_drv.h"
#include "i915_reg.h"
+#include "icl_dsi.h"
#include "intel_audio.h"
#include "intel_audio_regs.h"
#include "intel_backlight.h"
@@ -4684,11 +4685,32 @@ static bool need_aux_ch(struct intel_encoder *encoder, bool init_dp)
return init_dp || intel_phy_is_tc(i915, phy);
}
-void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)
+static bool assert_has_icl_dsi(struct drm_i915_private *i915)
+{
+ return !drm_WARN(&i915->drm, !IS_ALDERLAKE_P(i915) &&
+ !IS_TIGERLAKE(i915) && DISPLAY_VER(i915) != 11,
+ "Platform does not support DSI\n");
+}
+
+static bool port_in_use(struct drm_i915_private *i915, enum port port)
+{
+ struct intel_encoder *encoder;
+
+ for_each_intel_encoder(&i915->drm, encoder) {
+ /* FIXME what about second port for dual link DSI? */
+ if (encoder->port == port)
+ return true;
+ }
+
+ return false;
+}
+
+void intel_ddi_init(struct drm_i915_private *dev_priv,
+ const struct intel_bios_encoder_data *devdata,
+ enum port port)
{
struct intel_digital_port *dig_port;
struct intel_encoder *encoder;
- const struct intel_bios_encoder_data *devdata;
bool init_hdmi, init_dp;
enum phy phy = intel_port_to_phy(dev_priv, port);
@@ -4701,6 +4723,21 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)
if (!assert_port_valid(dev_priv, port))
return;
+ if (port_in_use(dev_priv, port)) {
+ drm_dbg_kms(&dev_priv->drm,
+ "Port %c already claimed\n", port_name(port));
+ return;
+ }
+
+ if (intel_bios_encoder_supports_dsi(devdata)) {
+ /* BXT/GLK handled elsewhere, for now at least */
+ if (!assert_has_icl_dsi(dev_priv))
+ return;
+
+ icl_dsi_init(dev_priv, devdata, port);
+ return;
+ }
+
/*
* On platforms with HTI (aka HDPORT), if it's enabled at boot it may
* have taken over some of the PHYs and made them unavailable to the
@@ -4713,14 +4750,6 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)
return;
}
- devdata = intel_bios_encoder_data_lookup(dev_priv, port);
- if (!devdata) {
- drm_dbg_kms(&dev_priv->drm,
- "VBT says port %c is not present\n",
- port_name(port));
- return;
- }
-
init_hdmi = intel_bios_encoder_supports_dvi(devdata) ||
intel_bios_encoder_supports_hdmi(devdata);
init_dp = intel_bios_encoder_supports_dp(devdata);
diff --git a/drivers/gpu/drm/i915/display/intel_ddi.h b/drivers/gpu/drm/i915/display/intel_ddi.h
index 2bc034042a93..10d586b0a9c0 100644
--- a/drivers/gpu/drm/i915/display/intel_ddi.h
+++ b/drivers/gpu/drm/i915/display/intel_ddi.h
@@ -11,6 +11,7 @@
struct drm_connector_state;
struct drm_i915_private;
struct intel_atomic_state;
+struct intel_bios_encoder_data;
struct intel_connector;
struct intel_crtc;
struct intel_crtc_state;
@@ -50,7 +51,9 @@ void hsw_prepare_dp_ddi_buffers(struct intel_encoder *encoder,
const struct intel_crtc_state *crtc_state);
void intel_wait_ddi_buf_idle(struct drm_i915_private *dev_priv,
enum port port);
-void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port);
+void intel_ddi_init(struct drm_i915_private *dev_priv,
+ const struct intel_bios_encoder_data *devdata,
+ enum port port);
bool intel_ddi_get_hw_state(struct intel_encoder *encoder, enum pipe *pipe);
void intel_ddi_enable_transcoder_func(struct intel_encoder *encoder,
const struct intel_crtc_state *crtc_state);
diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
index 43d6ba980780..836d3a1c797a 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -53,7 +53,6 @@
#include "i915_utils.h"
#include "i9xx_plane.h"
#include "i9xx_wm.h"
-#include "icl_dsi.h"
#include "intel_atomic.h"
#include "intel_atomic_plane.h"
#include "intel_audio.h"
@@ -7409,18 +7408,10 @@ void intel_setup_outputs(struct drm_i915_private *dev_priv)
return;
if (HAS_DDI(dev_priv)) {
- enum port port;
-
if (intel_ddi_crt_present(dev_priv))
intel_crt_init(dev_priv);
- for_each_port_masked(port, DISPLAY_RUNTIME_INFO(dev_priv)->port_mask)
- intel_ddi_init(dev_priv, port);
-
- /* FIXME do something about DSI */
- if (IS_ALDERLAKE_P(dev_priv) || IS_TIGERLAKE(dev_priv) ||
- DISPLAY_VER(dev_priv) == 11)
- icl_dsi_init(dev_priv);
+ intel_bios_for_each_encoder(dev_priv, intel_ddi_init);
if (IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv))
vlv_dsi_init(dev_priv);
diff --git a/drivers/gpu/drm/i915/display/intel_display_core.h b/drivers/gpu/drm/i915/display/intel_display_core.h
index 8d2243c71dd8..56c596ca7cbf 100644
--- a/drivers/gpu/drm/i915/display/intel_display_core.h
+++ b/drivers/gpu/drm/i915/display/intel_display_core.h
@@ -33,7 +33,6 @@ struct i915_audio_component;
struct i915_hdcp_arbiter;
struct intel_atomic_state;
struct intel_audio_funcs;
-struct intel_bios_encoder_data;
struct intel_cdclk_funcs;
struct intel_cdclk_vals;
struct intel_color_funcs;
@@ -218,7 +217,6 @@ struct intel_vbt_data {
struct list_head display_devices;
struct list_head bdb_blocks;
- struct intel_bios_encoder_data *ports[I915_MAX_PORTS]; /* Non-NULL if port present. */
struct sdvo_device_mapping {
u8 initialized;
u8 dvo_port;
--
2.39.3
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for drm/i915: Init DDI ports in VBT order (rev4)
2023-06-20 17:32 [Intel-gfx] [PATCH v2 0/5] drm/i915: Init DDI ports in VBT order Ville Syrjala
` (4 preceding siblings ...)
2023-06-20 17:32 ` [Intel-gfx] [PATCH v2 5/5] drm/i915: Try to initialize DDI/ICL+ DSI ports for every VBT child device Ville Syrjala
@ 2023-06-20 21:30 ` Patchwork
2023-06-20 21:30 ` [Intel-gfx] ✗ Fi.CI.SPARSE: " Patchwork
` (2 subsequent siblings)
8 siblings, 0 replies; 19+ messages in thread
From: Patchwork @ 2023-06-20 21:30 UTC (permalink / raw)
To: Ville Syrjala; +Cc: intel-gfx
== Series Details ==
Series: drm/i915: Init DDI ports in VBT order (rev4)
URL : https://patchwork.freedesktop.org/series/114200/
State : warning
== Summary ==
Error: dim checkpatch failed
1cfecb74803d drm/i915: Initialize dig_port->aux_ch to NONE to be sure
2a35c4073b30 drm/i915: Only populate aux_ch is really needed
bbada56642e0 drm/i915: Remove DDC pin sanitation
e5c2e8d5ad51 drm/i915: Remove AUX CH sanitation
-:15: WARNING:TYPO_SPELLING: 'succesfully' may be misspelled - perhaps 'successfully'?
#15:
favoring the first encoder to succesfully initialize. The reason
^^^^^^^^^^^
total: 0 errors, 1 warnings, 0 checks, 154 lines checked
c3eb8b0537b2 drm/i915: Try to initialize DDI/ICL+ DSI ports for every VBT child device
-:180: ERROR:OPEN_BRACE: that open brace { should be on the previous line
#180: FILE: drivers/gpu/drm/i915/display/intel_bios.c:3598:
+void intel_bios_for_each_encoder(struct drm_i915_private *i915,
+ void (*func)(struct drm_i915_private *i915,
+ const struct intel_bios_encoder_data *devdata,
+ enum port port))
+{
total: 1 errors, 0 warnings, 0 checks, 303 lines checked
^ permalink raw reply [flat|nested] 19+ messages in thread
* [Intel-gfx] ✗ Fi.CI.SPARSE: warning for drm/i915: Init DDI ports in VBT order (rev4)
2023-06-20 17:32 [Intel-gfx] [PATCH v2 0/5] drm/i915: Init DDI ports in VBT order Ville Syrjala
` (5 preceding siblings ...)
2023-06-20 21:30 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for drm/i915: Init DDI ports in VBT order (rev4) Patchwork
@ 2023-06-20 21:30 ` Patchwork
2023-06-20 21:44 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork
2023-06-21 5:42 ` [Intel-gfx] ✓ Fi.CI.IGT: " Patchwork
8 siblings, 0 replies; 19+ messages in thread
From: Patchwork @ 2023-06-20 21:30 UTC (permalink / raw)
To: Ville Syrjala; +Cc: intel-gfx
== Series Details ==
Series: drm/i915: Init DDI ports in VBT order (rev4)
URL : https://patchwork.freedesktop.org/series/114200/
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] 19+ messages in thread
* [Intel-gfx] ✓ Fi.CI.BAT: success for drm/i915: Init DDI ports in VBT order (rev4)
2023-06-20 17:32 [Intel-gfx] [PATCH v2 0/5] drm/i915: Init DDI ports in VBT order Ville Syrjala
` (6 preceding siblings ...)
2023-06-20 21:30 ` [Intel-gfx] ✗ Fi.CI.SPARSE: " Patchwork
@ 2023-06-20 21:44 ` Patchwork
2023-06-21 5:42 ` [Intel-gfx] ✓ Fi.CI.IGT: " Patchwork
8 siblings, 0 replies; 19+ messages in thread
From: Patchwork @ 2023-06-20 21:44 UTC (permalink / raw)
To: Ville Syrjala; +Cc: intel-gfx
[-- Attachment #1: Type: text/plain, Size: 8657 bytes --]
== Series Details ==
Series: drm/i915: Init DDI ports in VBT order (rev4)
URL : https://patchwork.freedesktop.org/series/114200/
State : success
== Summary ==
CI Bug Log - changes from CI_DRM_13296 -> Patchwork_114200v4
====================================================
Summary
-------
**SUCCESS**
No regressions found.
External URL: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/index.html
Participating hosts (43 -> 42)
------------------------------
Missing (1): fi-snb-2520m
Known issues
------------
Here are the changes found in Patchwork_114200v4 that come from known issues:
### IGT changes ###
#### Issues hit ####
* igt@debugfs_test@basic-hwmon:
- bat-adlp-11: NOTRUN -> [SKIP][1] ([i915#7456])
[1]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/bat-adlp-11/igt@debugfs_test@basic-hwmon.html
* igt@gem_exec_parallel@engines@basic:
- bat-mtlp-8: [PASS][2] -> [FAIL][3] ([i915#8386])
[2]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13296/bat-mtlp-8/igt@gem_exec_parallel@engines@basic.html
[3]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/bat-mtlp-8/igt@gem_exec_parallel@engines@basic.html
* igt@gem_tiled_pread_basic:
- bat-adlp-11: NOTRUN -> [SKIP][4] ([i915#3282])
[4]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/bat-adlp-11/igt@gem_tiled_pread_basic.html
* igt@i915_selftest@live@execlists:
- fi-kbl-soraka: [PASS][5] -> [INCOMPLETE][6] ([i915#7156] / [i915#7913])
[5]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13296/fi-kbl-soraka/igt@i915_selftest@live@execlists.html
[6]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/fi-kbl-soraka/igt@i915_selftest@live@execlists.html
* igt@i915_selftest@live@gt_heartbeat:
- fi-kbl-soraka: [PASS][7] -> [DMESG-FAIL][8] ([i915#5334] / [i915#7872])
[7]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13296/fi-kbl-soraka/igt@i915_selftest@live@gt_heartbeat.html
[8]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/fi-kbl-soraka/igt@i915_selftest@live@gt_heartbeat.html
* igt@i915_selftest@live@gt_mocs:
- bat-mtlp-8: [PASS][9] -> [DMESG-FAIL][10] ([i915#7059])
[9]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13296/bat-mtlp-8/igt@i915_selftest@live@gt_mocs.html
[10]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/bat-mtlp-8/igt@i915_selftest@live@gt_mocs.html
- bat-mtlp-6: [PASS][11] -> [DMESG-FAIL][12] ([i915#7059])
[11]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13296/bat-mtlp-6/igt@i915_selftest@live@gt_mocs.html
[12]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/bat-mtlp-6/igt@i915_selftest@live@gt_mocs.html
* igt@i915_selftest@live@gt_pm:
- bat-rpls-2: [PASS][13] -> [DMESG-FAIL][14] ([i915#4258] / [i915#7913])
[13]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13296/bat-rpls-2/igt@i915_selftest@live@gt_pm.html
[14]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/bat-rpls-2/igt@i915_selftest@live@gt_pm.html
* igt@i915_selftest@live@slpc:
- bat-mtlp-6: [PASS][15] -> [DMESG-WARN][16] ([i915#6367])
[15]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13296/bat-mtlp-6/igt@i915_selftest@live@slpc.html
[16]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/bat-mtlp-6/igt@i915_selftest@live@slpc.html
* igt@i915_suspend@basic-s3-without-i915:
- bat-dg2-8: NOTRUN -> [SKIP][17] ([i915#6645])
[17]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/bat-dg2-8/igt@i915_suspend@basic-s3-without-i915.html
* igt@kms_busy@basic@modeset:
- bat-adlp-11: NOTRUN -> [ABORT][18] ([i915#4423])
[18]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/bat-adlp-11/igt@kms_busy@basic@modeset.html
* igt@kms_chamelium_hpd@common-hpd-after-suspend:
- bat-dg2-8: NOTRUN -> [SKIP][19] ([i915#7828])
[19]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/bat-dg2-8/igt@kms_chamelium_hpd@common-hpd-after-suspend.html
* igt@kms_pipe_crc_basic@nonblocking-crc-frame-sequence@pipe-d-dp-1:
- bat-dg2-8: [PASS][20] -> [FAIL][21] ([i915#7932])
[20]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13296/bat-dg2-8/igt@kms_pipe_crc_basic@nonblocking-crc-frame-sequence@pipe-d-dp-1.html
[21]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/bat-dg2-8/igt@kms_pipe_crc_basic@nonblocking-crc-frame-sequence@pipe-d-dp-1.html
#### Possible fixes ####
* igt@core_auth@basic-auth:
- bat-adlp-11: [ABORT][22] ([i915#8011]) -> [PASS][23]
[22]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13296/bat-adlp-11/igt@core_auth@basic-auth.html
[23]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/bat-adlp-11/igt@core_auth@basic-auth.html
* igt@dmabuf@all-tests@dma_fence:
- bat-dg2-8: [DMESG-FAIL][24] ([i915#8189]) -> [PASS][25]
[24]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13296/bat-dg2-8/igt@dmabuf@all-tests@dma_fence.html
[25]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/bat-dg2-8/igt@dmabuf@all-tests@dma_fence.html
* igt@dmabuf@all-tests@sanitycheck:
- bat-dg2-8: [ABORT][26] ([i915#7699] / [i915#8144]) -> [PASS][27]
[26]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13296/bat-dg2-8/igt@dmabuf@all-tests@sanitycheck.html
[27]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/bat-dg2-8/igt@dmabuf@all-tests@sanitycheck.html
* igt@i915_module_load@load:
- bat-adlp-11: [DMESG-WARN][28] ([i915#4423]) -> [PASS][29]
[28]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13296/bat-adlp-11/igt@i915_module_load@load.html
[29]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/bat-adlp-11/igt@i915_module_load@load.html
* igt@i915_selftest@live@gt_heartbeat:
- fi-apl-guc: [DMESG-FAIL][30] ([i915#5334]) -> [PASS][31]
[30]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13296/fi-apl-guc/igt@i915_selftest@live@gt_heartbeat.html
[31]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/fi-apl-guc/igt@i915_selftest@live@gt_heartbeat.html
* igt@i915_selftest@live@slpc:
- bat-rpls-2: [DMESG-WARN][32] ([i915#6367]) -> [PASS][33]
[32]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13296/bat-rpls-2/igt@i915_selftest@live@slpc.html
[33]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/bat-rpls-2/igt@i915_selftest@live@slpc.html
[i915#3282]: https://gitlab.freedesktop.org/drm/intel/issues/3282
[i915#4258]: https://gitlab.freedesktop.org/drm/intel/issues/4258
[i915#4423]: https://gitlab.freedesktop.org/drm/intel/issues/4423
[i915#5334]: https://gitlab.freedesktop.org/drm/intel/issues/5334
[i915#6367]: https://gitlab.freedesktop.org/drm/intel/issues/6367
[i915#6645]: https://gitlab.freedesktop.org/drm/intel/issues/6645
[i915#7059]: https://gitlab.freedesktop.org/drm/intel/issues/7059
[i915#7156]: https://gitlab.freedesktop.org/drm/intel/issues/7156
[i915#7456]: https://gitlab.freedesktop.org/drm/intel/issues/7456
[i915#7699]: https://gitlab.freedesktop.org/drm/intel/issues/7699
[i915#7828]: https://gitlab.freedesktop.org/drm/intel/issues/7828
[i915#7872]: https://gitlab.freedesktop.org/drm/intel/issues/7872
[i915#7913]: https://gitlab.freedesktop.org/drm/intel/issues/7913
[i915#7932]: https://gitlab.freedesktop.org/drm/intel/issues/7932
[i915#8011]: https://gitlab.freedesktop.org/drm/intel/issues/8011
[i915#8144]: https://gitlab.freedesktop.org/drm/intel/issues/8144
[i915#8189]: https://gitlab.freedesktop.org/drm/intel/issues/8189
[i915#8386]: https://gitlab.freedesktop.org/drm/intel/issues/8386
Build changes
-------------
* Linux: CI_DRM_13296 -> Patchwork_114200v4
CI-20190529: 20190529
CI_DRM_13296: 6582018c9b880e8d671c59395e34d599b9edfc59 @ git://anongit.freedesktop.org/gfx-ci/linux
IGT_7340: e975155e9167f0fed8f3da9c5b61de71d082b5c7 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
Patchwork_114200v4: 6582018c9b880e8d671c59395e34d599b9edfc59 @ git://anongit.freedesktop.org/gfx-ci/linux
### Linux commits
50f3fb761514 drm/i915: Try to initialize DDI/ICL+ DSI ports for every VBT child device
970b4393bfe2 drm/i915: Remove AUX CH sanitation
5c7579d61b9d drm/i915: Remove DDC pin sanitation
874a245af0b4 drm/i915: Only populate aux_ch is really needed
448a2277473f drm/i915: Initialize dig_port->aux_ch to NONE to be sure
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/index.html
[-- Attachment #2: Type: text/html, Size: 10085 bytes --]
^ permalink raw reply [flat|nested] 19+ messages in thread
* [Intel-gfx] ✓ Fi.CI.IGT: success for drm/i915: Init DDI ports in VBT order (rev4)
2023-06-20 17:32 [Intel-gfx] [PATCH v2 0/5] drm/i915: Init DDI ports in VBT order Ville Syrjala
` (7 preceding siblings ...)
2023-06-20 21:44 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork
@ 2023-06-21 5:42 ` Patchwork
8 siblings, 0 replies; 19+ messages in thread
From: Patchwork @ 2023-06-21 5:42 UTC (permalink / raw)
To: Ville Syrjala; +Cc: intel-gfx
[-- Attachment #1: Type: text/plain, Size: 29921 bytes --]
== Series Details ==
Series: drm/i915: Init DDI ports in VBT order (rev4)
URL : https://patchwork.freedesktop.org/series/114200/
State : success
== Summary ==
CI Bug Log - changes from CI_DRM_13296_full -> Patchwork_114200v4_full
====================================================
Summary
-------
**SUCCESS**
No regressions found.
Participating hosts (8 -> 7)
------------------------------
Missing (1): shard-rkl0
Possible new issues
-------------------
Here are the unknown changes that may have been introduced in Patchwork_114200v4_full:
### IGT changes ###
#### Suppressed ####
The following results come from untrusted machines, tests, or statuses.
They do not affect the overall result.
* igt@kms_plane_lowres@tiling-x@pipe-d-hdmi-a-3:
- {shard-dg1}: NOTRUN -> [FAIL][1] +2 similar issues
[1]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-dg1-12/igt@kms_plane_lowres@tiling-x@pipe-d-hdmi-a-3.html
Known issues
------------
Here are the changes found in Patchwork_114200v4_full that come from known issues:
### IGT changes ###
#### Issues hit ####
* igt@gem_ctx_sseu@invalid-sseu:
- shard-rkl: NOTRUN -> [SKIP][2] ([i915#280])
[2]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-rkl-1/igt@gem_ctx_sseu@invalid-sseu.html
* igt@gem_exec_fair@basic-deadline:
- shard-glk: [PASS][3] -> [FAIL][4] ([i915#2846])
[3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13296/shard-glk1/igt@gem_exec_fair@basic-deadline.html
[4]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-glk5/igt@gem_exec_fair@basic-deadline.html
* igt@gem_exec_fair@basic-pace@bcs0:
- shard-rkl: [PASS][5] -> [FAIL][6] ([i915#2842])
[5]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13296/shard-rkl-6/igt@gem_exec_fair@basic-pace@bcs0.html
[6]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-rkl-1/igt@gem_exec_fair@basic-pace@bcs0.html
* igt@gem_exec_params@secure-non-master:
- shard-rkl: NOTRUN -> [SKIP][7] ([fdo#112283])
[7]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-rkl-1/igt@gem_exec_params@secure-non-master.html
* igt@gem_exec_suspend@basic-s4-devices@smem:
- shard-rkl: NOTRUN -> [ABORT][8] ([i915#7975] / [i915#8213]) +1 similar issue
[8]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-rkl-6/igt@gem_exec_suspend@basic-s4-devices@smem.html
* igt@gem_lmem_swapping@heavy-random:
- shard-rkl: NOTRUN -> [SKIP][9] ([i915#4613])
[9]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-rkl-6/igt@gem_lmem_swapping@heavy-random.html
* igt@gem_ppgtt@blt-vs-render-ctxn:
- shard-snb: [PASS][10] -> [FAIL][11] ([i915#4998] / [i915#8295])
[10]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13296/shard-snb6/igt@gem_ppgtt@blt-vs-render-ctxn.html
[11]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-snb1/igt@gem_ppgtt@blt-vs-render-ctxn.html
* igt@gem_pread@self:
- shard-rkl: NOTRUN -> [SKIP][12] ([i915#3282])
[12]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-rkl-1/igt@gem_pread@self.html
* igt@gem_set_tiling_vs_blt@tiled-to-untiled:
- shard-rkl: NOTRUN -> [SKIP][13] ([i915#8411])
[13]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-rkl-6/igt@gem_set_tiling_vs_blt@tiled-to-untiled.html
* igt@gem_userptr_blits@readonly-pwrite-unsync:
- shard-tglu: NOTRUN -> [SKIP][14] ([i915#3297])
[14]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-tglu-7/igt@gem_userptr_blits@readonly-pwrite-unsync.html
* igt@gem_userptr_blits@unsync-overlap:
- shard-rkl: NOTRUN -> [SKIP][15] ([i915#3297])
[15]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-rkl-6/igt@gem_userptr_blits@unsync-overlap.html
* igt@gem_userptr_blits@vma-merge:
- shard-rkl: NOTRUN -> [FAIL][16] ([i915#3318])
[16]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-rkl-6/igt@gem_userptr_blits@vma-merge.html
* igt@gen9_exec_parse@allowed-all:
- shard-rkl: NOTRUN -> [SKIP][17] ([i915#2527]) +1 similar issue
[17]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-rkl-6/igt@gen9_exec_parse@allowed-all.html
* igt@gen9_exec_parse@batch-invalid-length:
- shard-tglu: NOTRUN -> [SKIP][18] ([i915#2527] / [i915#2856])
[18]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-tglu-7/igt@gen9_exec_parse@batch-invalid-length.html
* igt@i915_pm_backlight@basic-brightness:
- shard-rkl: NOTRUN -> [SKIP][19] ([i915#7561])
[19]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-rkl-6/igt@i915_pm_backlight@basic-brightness.html
* igt@i915_pm_dc@dc5-psr:
- shard-rkl: NOTRUN -> [SKIP][20] ([i915#658])
[20]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-rkl-1/igt@i915_pm_dc@dc5-psr.html
* igt@i915_pm_rpm@modeset-lpsp-stress-no-wait:
- shard-rkl: NOTRUN -> [SKIP][21] ([i915#1397])
[21]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-rkl-1/igt@i915_pm_rpm@modeset-lpsp-stress-no-wait.html
* igt@i915_query@query-topology-known-pci-ids:
- shard-rkl: NOTRUN -> [SKIP][22] ([fdo#109303])
[22]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-rkl-1/igt@i915_query@query-topology-known-pci-ids.html
* igt@i915_suspend@basic-s3-without-i915:
- shard-rkl: [PASS][23] -> [FAIL][24] ([fdo#103375])
[23]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13296/shard-rkl-3/igt@i915_suspend@basic-s3-without-i915.html
[24]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-rkl-4/igt@i915_suspend@basic-s3-without-i915.html
* igt@kms_atomic_transition@plane-all-modeset-transition-fencing-internal-panels:
- shard-rkl: NOTRUN -> [SKIP][25] ([i915#1769] / [i915#3555] / [i915#4579])
[25]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-rkl-1/igt@kms_atomic_transition@plane-all-modeset-transition-fencing-internal-panels.html
* igt@kms_big_fb@4-tiled-16bpp-rotate-0:
- shard-rkl: NOTRUN -> [SKIP][26] ([i915#5286])
[26]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-rkl-1/igt@kms_big_fb@4-tiled-16bpp-rotate-0.html
* igt@kms_big_fb@4-tiled-max-hw-stride-32bpp-rotate-180-async-flip:
- shard-tglu: NOTRUN -> [SKIP][27] ([fdo#111615] / [i915#5286]) +1 similar issue
[27]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-tglu-7/igt@kms_big_fb@4-tiled-max-hw-stride-32bpp-rotate-180-async-flip.html
* igt@kms_big_fb@linear-16bpp-rotate-270:
- shard-rkl: NOTRUN -> [SKIP][28] ([fdo#111614] / [i915#3638]) +1 similar issue
[28]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-rkl-1/igt@kms_big_fb@linear-16bpp-rotate-270.html
* igt@kms_big_fb@yf-tiled-max-hw-stride-32bpp-rotate-0-hflip:
- shard-rkl: NOTRUN -> [SKIP][29] ([fdo#110723]) +2 similar issues
[29]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-rkl-6/igt@kms_big_fb@yf-tiled-max-hw-stride-32bpp-rotate-0-hflip.html
* igt@kms_ccs@pipe-a-crc-sprite-planes-basic-y_tiled_ccs:
- shard-rkl: NOTRUN -> [SKIP][30] ([i915#3734] / [i915#5354] / [i915#6095]) +1 similar issue
[30]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-rkl-1/igt@kms_ccs@pipe-a-crc-sprite-planes-basic-y_tiled_ccs.html
* igt@kms_ccs@pipe-b-random-ccs-data-4_tiled_dg2_rc_ccs_cc:
- shard-rkl: NOTRUN -> [SKIP][31] ([i915#5354] / [i915#6095]) +6 similar issues
[31]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-rkl-1/igt@kms_ccs@pipe-b-random-ccs-data-4_tiled_dg2_rc_ccs_cc.html
* igt@kms_ccs@pipe-b-random-ccs-data-y_tiled_gen12_mc_ccs:
- shard-rkl: NOTRUN -> [SKIP][32] ([i915#3886] / [i915#5354] / [i915#6095]) +2 similar issues
[32]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-rkl-6/igt@kms_ccs@pipe-b-random-ccs-data-y_tiled_gen12_mc_ccs.html
* igt@kms_ccs@pipe-c-random-ccs-data-yf_tiled_ccs:
- shard-tglu: NOTRUN -> [SKIP][33] ([fdo#111615] / [i915#3689] / [i915#5354] / [i915#6095]) +1 similar issue
[33]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-tglu-7/igt@kms_ccs@pipe-c-random-ccs-data-yf_tiled_ccs.html
* igt@kms_ccs@pipe-d-missing-ccs-buffer-y_tiled_gen12_mc_ccs:
- shard-rkl: NOTRUN -> [SKIP][34] ([i915#5354]) +8 similar issues
[34]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-rkl-1/igt@kms_ccs@pipe-d-missing-ccs-buffer-y_tiled_gen12_mc_ccs.html
* igt@kms_chamelium_edid@hdmi-edid-stress-resolution-non-4k:
- shard-tglu: NOTRUN -> [SKIP][35] ([i915#7828])
[35]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-tglu-7/igt@kms_chamelium_edid@hdmi-edid-stress-resolution-non-4k.html
* igt@kms_chamelium_hpd@dp-hpd-enable-disable-mode:
- shard-rkl: NOTRUN -> [SKIP][36] ([i915#7828]) +4 similar issues
[36]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-rkl-6/igt@kms_chamelium_hpd@dp-hpd-enable-disable-mode.html
* igt@kms_content_protection@dp-mst-type-0:
- shard-rkl: NOTRUN -> [SKIP][37] ([i915#3116])
[37]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-rkl-1/igt@kms_content_protection@dp-mst-type-0.html
* igt@kms_cursor_crc@cursor-offscreen-512x512:
- shard-rkl: NOTRUN -> [SKIP][38] ([i915#3359])
[38]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-rkl-6/igt@kms_cursor_crc@cursor-offscreen-512x512.html
* igt@kms_cursor_crc@cursor-rapid-movement-32x10:
- shard-rkl: NOTRUN -> [SKIP][39] ([i915#3555] / [i915#4579]) +3 similar issues
[39]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-rkl-1/igt@kms_cursor_crc@cursor-rapid-movement-32x10.html
* igt@kms_cursor_legacy@cursorb-vs-flipb-atomic-transitions:
- shard-rkl: NOTRUN -> [SKIP][40] ([fdo#111767] / [fdo#111825])
[40]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-rkl-6/igt@kms_cursor_legacy@cursorb-vs-flipb-atomic-transitions.html
* igt@kms_cursor_legacy@single-move@pipe-b:
- shard-rkl: [PASS][41] -> [INCOMPLETE][42] ([i915#8011])
[41]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13296/shard-rkl-6/igt@kms_cursor_legacy@single-move@pipe-b.html
[42]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-rkl-7/igt@kms_cursor_legacy@single-move@pipe-b.html
* igt@kms_display_modes@extended-mode-basic:
- shard-tglu: NOTRUN -> [SKIP][43] ([i915#4579])
[43]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-tglu-7/igt@kms_display_modes@extended-mode-basic.html
* igt@kms_flip@2x-flip-vs-rmfb-interruptible:
- shard-snb: NOTRUN -> [SKIP][44] ([fdo#109271] / [fdo#111767])
[44]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-snb2/igt@kms_flip@2x-flip-vs-rmfb-interruptible.html
* igt@kms_flip@2x-modeset-vs-vblank-race:
- shard-rkl: NOTRUN -> [SKIP][45] ([fdo#111825]) +3 similar issues
[45]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-rkl-6/igt@kms_flip@2x-modeset-vs-vblank-race.html
* igt@kms_flip@2x-nonexisting-fb:
- shard-snb: NOTRUN -> [SKIP][46] ([fdo#109271]) +16 similar issues
[46]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-snb5/igt@kms_flip@2x-nonexisting-fb.html
* igt@kms_flip@flip-vs-expired-vblank@c-hdmi-a2:
- shard-glk: [PASS][47] -> [FAIL][48] ([i915#79])
[47]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13296/shard-glk6/igt@kms_flip@flip-vs-expired-vblank@c-hdmi-a2.html
[48]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-glk2/igt@kms_flip@flip-vs-expired-vblank@c-hdmi-a2.html
* igt@kms_flip_scaled_crc@flip-32bpp-ytileccs-to-64bpp-ytile-upscaling@pipe-a-valid-mode:
- shard-rkl: NOTRUN -> [SKIP][49] ([i915#2672] / [i915#4579]) +1 similar issue
[49]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-rkl-1/igt@kms_flip_scaled_crc@flip-32bpp-ytileccs-to-64bpp-ytile-upscaling@pipe-a-valid-mode.html
* igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-shrfb-msflip-blt:
- shard-rkl: NOTRUN -> [SKIP][50] ([fdo#111825] / [i915#1825]) +16 similar issues
[50]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-rkl-6/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-shrfb-msflip-blt.html
* igt@kms_frontbuffer_tracking@psr-2p-primscrn-cur-indfb-move:
- shard-tglu: NOTRUN -> [SKIP][51] ([fdo#109280])
[51]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-tglu-7/igt@kms_frontbuffer_tracking@psr-2p-primscrn-cur-indfb-move.html
* igt@kms_frontbuffer_tracking@psr-rgb565-draw-render:
- shard-rkl: NOTRUN -> [SKIP][52] ([i915#3023]) +9 similar issues
[52]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-rkl-1/igt@kms_frontbuffer_tracking@psr-rgb565-draw-render.html
* igt@kms_plane_scaling@plane-downscale-with-rotation-factor-0-25@pipe-a-hdmi-a-2:
- shard-rkl: NOTRUN -> [SKIP][53] ([i915#5176])
[53]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-rkl-4/igt@kms_plane_scaling@plane-downscale-with-rotation-factor-0-25@pipe-a-hdmi-a-2.html
* igt@kms_plane_scaling@plane-downscale-with-rotation-factor-0-25@pipe-b-hdmi-a-2:
- shard-rkl: NOTRUN -> [SKIP][54] ([i915#4579] / [i915#5176])
[54]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-rkl-4/igt@kms_plane_scaling@plane-downscale-with-rotation-factor-0-25@pipe-b-hdmi-a-2.html
* igt@kms_plane_scaling@plane-upscale-with-modifiers-factor-0-25@pipe-b-hdmi-a-1:
- shard-snb: NOTRUN -> [SKIP][55] ([fdo#109271] / [i915#4579]) +10 similar issues
[55]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-snb1/igt@kms_plane_scaling@plane-upscale-with-modifiers-factor-0-25@pipe-b-hdmi-a-1.html
* igt@kms_plane_scaling@planes-unity-scaling-downscale-factor-0-25@pipe-a-hdmi-a-1:
- shard-rkl: NOTRUN -> [SKIP][56] ([i915#5235]) +3 similar issues
[56]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-rkl-7/igt@kms_plane_scaling@planes-unity-scaling-downscale-factor-0-25@pipe-a-hdmi-a-1.html
* igt@kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-25@pipe-b-hdmi-a-2:
- shard-rkl: NOTRUN -> [SKIP][57] ([i915#4579] / [i915#5235]) +3 similar issues
[57]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-rkl-2/igt@kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-25@pipe-b-hdmi-a-2.html
* igt@kms_psr2_sf@overlay-plane-update-continuous-sf:
- shard-rkl: NOTRUN -> [SKIP][58] ([fdo#111068] / [i915#658])
[58]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-rkl-6/igt@kms_psr2_sf@overlay-plane-update-continuous-sf.html
* igt@kms_psr@psr2_primary_mmap_gtt:
- shard-rkl: NOTRUN -> [SKIP][59] ([i915#1072]) +2 similar issues
[59]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-rkl-6/igt@kms_psr@psr2_primary_mmap_gtt.html
* igt@kms_setmode@basic@pipe-a-hdmi-a-1:
- shard-snb: NOTRUN -> [FAIL][60] ([i915#5465]) +1 similar issue
[60]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-snb1/igt@kms_setmode@basic@pipe-a-hdmi-a-1.html
* igt@kms_tiled_display@basic-test-pattern:
- shard-rkl: NOTRUN -> [SKIP][61] ([i915#8623])
[61]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-rkl-6/igt@kms_tiled_display@basic-test-pattern.html
* igt@kms_vblank@pipe-c-accuracy-idle:
- shard-rkl: NOTRUN -> [SKIP][62] ([i915#4070] / [i915#6768])
[62]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-rkl-6/igt@kms_vblank@pipe-c-accuracy-idle.html
* igt@kms_vblank@pipe-d-wait-idle-hang:
- shard-rkl: NOTRUN -> [SKIP][63] ([i915#4070] / [i915#533] / [i915#6768]) +1 similar issue
[63]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-rkl-1/igt@kms_vblank@pipe-d-wait-idle-hang.html
* igt@perf@per-context-mode-unprivileged:
- shard-rkl: NOTRUN -> [SKIP][64] ([i915#2435])
[64]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-rkl-1/igt@perf@per-context-mode-unprivileged.html
* igt@v3d/v3d_submit_cl@single-in-sync:
- shard-rkl: NOTRUN -> [SKIP][65] ([fdo#109315]) +4 similar issues
[65]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-rkl-1/igt@v3d/v3d_submit_cl@single-in-sync.html
* igt@vc4/vc4_purgeable_bo@mark-unpurgeable-check-retained:
- shard-rkl: NOTRUN -> [SKIP][66] ([i915#7711]) +3 similar issues
[66]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-rkl-6/igt@vc4/vc4_purgeable_bo@mark-unpurgeable-check-retained.html
#### Possible fixes ####
* igt@drm_fdinfo@most-busy-idle-check-all@rcs0:
- shard-rkl: [FAIL][67] ([i915#7742]) -> [PASS][68]
[67]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13296/shard-rkl-3/igt@drm_fdinfo@most-busy-idle-check-all@rcs0.html
[68]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-rkl-4/igt@drm_fdinfo@most-busy-idle-check-all@rcs0.html
* igt@gem_ctx_exec@basic-nohangcheck:
- shard-rkl: [FAIL][69] ([i915#6268]) -> [PASS][70]
[69]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13296/shard-rkl-3/igt@gem_ctx_exec@basic-nohangcheck.html
[70]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-rkl-4/igt@gem_ctx_exec@basic-nohangcheck.html
* igt@gem_exec_fair@basic-none-solo@rcs0:
- shard-apl: [FAIL][71] ([i915#2842]) -> [PASS][72]
[71]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13296/shard-apl2/igt@gem_exec_fair@basic-none-solo@rcs0.html
[72]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-apl6/igt@gem_exec_fair@basic-none-solo@rcs0.html
* igt@gem_exec_fair@basic-pace@rcs0:
- shard-rkl: [FAIL][73] ([i915#2842]) -> [PASS][74] +1 similar issue
[73]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13296/shard-rkl-6/igt@gem_exec_fair@basic-pace@rcs0.html
[74]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-rkl-1/igt@gem_exec_fair@basic-pace@rcs0.html
* igt@gem_exec_suspend@basic-s4-devices@smem:
- shard-tglu: [ABORT][75] ([i915#7975] / [i915#8213]) -> [PASS][76]
[75]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13296/shard-tglu-10/igt@gem_exec_suspend@basic-s4-devices@smem.html
[76]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-tglu-7/igt@gem_exec_suspend@basic-s4-devices@smem.html
* igt@gem_mmap_offset@clear@smem0:
- {shard-dg1}: [FAIL][77] ([i915#7962]) -> [PASS][78]
[77]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13296/shard-dg1-14/igt@gem_mmap_offset@clear@smem0.html
[78]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-dg1-15/igt@gem_mmap_offset@clear@smem0.html
* igt@gem_ppgtt@blt-vs-render-ctx0:
- shard-snb: [DMESG-FAIL][79] ([i915#8295]) -> [PASS][80]
[79]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13296/shard-snb6/igt@gem_ppgtt@blt-vs-render-ctx0.html
[80]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-snb5/igt@gem_ppgtt@blt-vs-render-ctx0.html
* igt@i915_module_load@reload-with-fault-injection:
- {shard-dg1}: [DMESG-WARN][81] ([i915#4391] / [i915#4423]) -> [PASS][82]
[81]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13296/shard-dg1-17/igt@i915_module_load@reload-with-fault-injection.html
[82]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-dg1-19/igt@i915_module_load@reload-with-fault-injection.html
* igt@i915_pm_dc@dc9-dpms:
- shard-tglu: [SKIP][83] ([i915#4281]) -> [PASS][84]
[83]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13296/shard-tglu-3/igt@i915_pm_dc@dc9-dpms.html
[84]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-tglu-2/igt@i915_pm_dc@dc9-dpms.html
* igt@i915_pm_rc6_residency@rc6-idle@rcs0:
- {shard-dg1}: [FAIL][85] ([i915#3591]) -> [PASS][86] +1 similar issue
[85]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13296/shard-dg1-18/igt@i915_pm_rc6_residency@rc6-idle@rcs0.html
[86]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-dg1-18/igt@i915_pm_rc6_residency@rc6-idle@rcs0.html
* igt@i915_pm_rpm@dpms-mode-unset-lpsp:
- {shard-dg1}: [SKIP][87] ([i915#1397]) -> [PASS][88] +1 similar issue
[87]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13296/shard-dg1-17/igt@i915_pm_rpm@dpms-mode-unset-lpsp.html
[88]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-dg1-19/igt@i915_pm_rpm@dpms-mode-unset-lpsp.html
* igt@i915_pm_rpm@modeset-lpsp:
- shard-rkl: [SKIP][89] ([i915#1397]) -> [PASS][90]
[89]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13296/shard-rkl-6/igt@i915_pm_rpm@modeset-lpsp.html
[90]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-rkl-7/igt@i915_pm_rpm@modeset-lpsp.html
* igt@kms_big_fb@y-tiled-max-hw-stride-32bpp-rotate-0-async-flip:
- shard-rkl: [FAIL][91] ([i915#3743]) -> [PASS][92]
[91]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13296/shard-rkl-7/igt@kms_big_fb@y-tiled-max-hw-stride-32bpp-rotate-0-async-flip.html
[92]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-rkl-7/igt@kms_big_fb@y-tiled-max-hw-stride-32bpp-rotate-0-async-flip.html
* igt@kms_flip@plain-flip-ts-check-interruptible@b-hdmi-a2:
- shard-glk: [FAIL][93] ([i915#2122]) -> [PASS][94]
[93]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13296/shard-glk4/igt@kms_flip@plain-flip-ts-check-interruptible@b-hdmi-a2.html
[94]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-glk6/igt@kms_flip@plain-flip-ts-check-interruptible@b-hdmi-a2.html
* igt@kms_universal_plane@universal-plane-pageflip-windowed-pipe-c:
- {shard-dg1}: [DMESG-WARN][95] ([i915#4423]) -> [PASS][96]
[95]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13296/shard-dg1-17/igt@kms_universal_plane@universal-plane-pageflip-windowed-pipe-c.html
[96]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-dg1-19/igt@kms_universal_plane@universal-plane-pageflip-windowed-pipe-c.html
#### Warnings ####
* igt@i915_pm_rc6_residency@rc6-idle@bcs0:
- shard-tglu: [FAIL][97] ([i915#2681] / [i915#3591]) -> [WARN][98] ([i915#2681])
[97]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13296/shard-tglu-6/igt@i915_pm_rc6_residency@rc6-idle@bcs0.html
[98]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-tglu-5/igt@i915_pm_rc6_residency@rc6-idle@bcs0.html
* igt@i915_pm_rc6_residency@rc6-idle@vcs0:
- shard-tglu: [WARN][99] ([i915#2681]) -> [FAIL][100] ([i915#2681] / [i915#3591])
[99]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13296/shard-tglu-6/igt@i915_pm_rc6_residency@rc6-idle@vcs0.html
[100]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-tglu-5/igt@i915_pm_rc6_residency@rc6-idle@vcs0.html
* igt@kms_multipipe_modeset@basic-max-pipe-crc-check:
- shard-rkl: [SKIP][101] ([i915#4816]) -> [SKIP][102] ([i915#4070] / [i915#4816])
[101]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13296/shard-rkl-3/igt@kms_multipipe_modeset@basic-max-pipe-crc-check.html
[102]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_114200v4/shard-rkl-1/igt@kms_multipipe_modeset@basic-max-pipe-crc-check.html
{name}: This element is suppressed. This means it is ignored when computing
the status of the difference (SUCCESS, WARNING, or FAILURE).
[fdo#103375]: https://bugs.freedesktop.org/show_bug.cgi?id=103375
[fdo#109271]: https://bugs.freedesktop.org/show_bug.cgi?id=109271
[fdo#109280]: https://bugs.freedesktop.org/show_bug.cgi?id=109280
[fdo#109303]: https://bugs.freedesktop.org/show_bug.cgi?id=109303
[fdo#109315]: https://bugs.freedesktop.org/show_bug.cgi?id=109315
[fdo#110723]: https://bugs.freedesktop.org/show_bug.cgi?id=110723
[fdo#111068]: https://bugs.freedesktop.org/show_bug.cgi?id=111068
[fdo#111614]: https://bugs.freedesktop.org/show_bug.cgi?id=111614
[fdo#111615]: https://bugs.freedesktop.org/show_bug.cgi?id=111615
[fdo#111767]: https://bugs.freedesktop.org/show_bug.cgi?id=111767
[fdo#111825]: https://bugs.freedesktop.org/show_bug.cgi?id=111825
[fdo#112283]: https://bugs.freedesktop.org/show_bug.cgi?id=112283
[i915#1072]: https://gitlab.freedesktop.org/drm/intel/issues/1072
[i915#1397]: https://gitlab.freedesktop.org/drm/intel/issues/1397
[i915#1769]: https://gitlab.freedesktop.org/drm/intel/issues/1769
[i915#1825]: https://gitlab.freedesktop.org/drm/intel/issues/1825
[i915#2122]: https://gitlab.freedesktop.org/drm/intel/issues/2122
[i915#2435]: https://gitlab.freedesktop.org/drm/intel/issues/2435
[i915#2527]: https://gitlab.freedesktop.org/drm/intel/issues/2527
[i915#2672]: https://gitlab.freedesktop.org/drm/intel/issues/2672
[i915#2681]: https://gitlab.freedesktop.org/drm/intel/issues/2681
[i915#280]: https://gitlab.freedesktop.org/drm/intel/issues/280
[i915#2842]: https://gitlab.freedesktop.org/drm/intel/issues/2842
[i915#2846]: https://gitlab.freedesktop.org/drm/intel/issues/2846
[i915#2856]: https://gitlab.freedesktop.org/drm/intel/issues/2856
[i915#3023]: https://gitlab.freedesktop.org/drm/intel/issues/3023
[i915#3116]: https://gitlab.freedesktop.org/drm/intel/issues/3116
[i915#3282]: https://gitlab.freedesktop.org/drm/intel/issues/3282
[i915#3297]: https://gitlab.freedesktop.org/drm/intel/issues/3297
[i915#3318]: https://gitlab.freedesktop.org/drm/intel/issues/3318
[i915#3359]: https://gitlab.freedesktop.org/drm/intel/issues/3359
[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#3734]: https://gitlab.freedesktop.org/drm/intel/issues/3734
[i915#3743]: https://gitlab.freedesktop.org/drm/intel/issues/3743
[i915#3886]: https://gitlab.freedesktop.org/drm/intel/issues/3886
[i915#4070]: https://gitlab.freedesktop.org/drm/intel/issues/4070
[i915#4078]: https://gitlab.freedesktop.org/drm/intel/issues/4078
[i915#4281]: https://gitlab.freedesktop.org/drm/intel/issues/4281
[i915#4391]: https://gitlab.freedesktop.org/drm/intel/issues/4391
[i915#4423]: https://gitlab.freedesktop.org/drm/intel/issues/4423
[i915#4579]: https://gitlab.freedesktop.org/drm/intel/issues/4579
[i915#4613]: https://gitlab.freedesktop.org/drm/intel/issues/4613
[i915#4816]: https://gitlab.freedesktop.org/drm/intel/issues/4816
[i915#4998]: https://gitlab.freedesktop.org/drm/intel/issues/4998
[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#533]: https://gitlab.freedesktop.org/drm/intel/issues/533
[i915#5354]: https://gitlab.freedesktop.org/drm/intel/issues/5354
[i915#5465]: https://gitlab.freedesktop.org/drm/intel/issues/5465
[i915#5493]: https://gitlab.freedesktop.org/drm/intel/issues/5493
[i915#5784]: https://gitlab.freedesktop.org/drm/intel/issues/5784
[i915#6095]: https://gitlab.freedesktop.org/drm/intel/issues/6095
[i915#6268]: https://gitlab.freedesktop.org/drm/intel/issues/6268
[i915#658]: https://gitlab.freedesktop.org/drm/intel/issues/658
[i915#6768]: https://gitlab.freedesktop.org/drm/intel/issues/6768
[i915#7561]: https://gitlab.freedesktop.org/drm/intel/issues/7561
[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#79]: https://gitlab.freedesktop.org/drm/intel/issues/79
[i915#7962]: https://gitlab.freedesktop.org/drm/intel/issues/7962
[i915#7975]: https://gitlab.freedesktop.org/drm/intel/issues/7975
[i915#8011]: https://gitlab.freedesktop.org/drm/intel/issues/8011
[i915#8213]: https://gitlab.freedesktop.org/drm/intel/issues/8213
[i915#8257]: https://gitlab.freedesktop.org/drm/intel/issues/8257
[i915#8295]: https://gitlab.freedesktop.org/drm/intel/issues/8295
[i915#8347]: https://gitlab.freedesktop.org/drm/intel/issues/8347
[i915#8411]: https://gitlab.freedesktop.org/drm/intel/issues/8411
[i915#8502]: https://gitlab.freedesktop.org/drm/intel/issues/8502
[i915#8623]: https://gitlab.freedesktop.org/drm/intel/issues/8623
Build changes
-------------
* Linux: CI_DRM_13296 -> Patchwork_114200v4
CI-20190529: 20190529
CI_DRM_13296: 6582018c9b880e8d671c59395e34d599b9edfc59 @ git://anongit.freedesktop.org/gfx-ci/linux
IGT_7340: e975155e9167f0fed8f3da9c5b61de71d082b5c7 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
Patchwork_114200v4: 6582018c9b880e8d671c59395e34d599b9edfc59 @ 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_114200v4/index.html
[-- Attachment #2: Type: text/html, Size: 34990 bytes --]
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [Intel-gfx] [PATCH v2 1/5] drm/i915: Initialize dig_port->aux_ch to NONE to be sure
2023-06-20 17:32 ` [Intel-gfx] [PATCH v2 1/5] drm/i915: Initialize dig_port->aux_ch to NONE to be sure Ville Syrjala
@ 2023-06-21 7:44 ` Jani Nikula
0 siblings, 0 replies; 19+ messages in thread
From: Jani Nikula @ 2023-06-21 7:44 UTC (permalink / raw)
To: Ville Syrjala, intel-gfx
On Tue, 20 Jun 2023, Ville Syrjala <ville.syrjala@linux.intel.com> wrote:
> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
>
> Make sure dig_port->aux_ch is trustworthy by initializing it
> to NONE (-1) at the start. The encoder init will later fill in
> the actual value, if appropriate.
Smells like we could add intel_dig_port_alloc() and shove this
there. But that's for another patch.
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
>
> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> ---
> drivers/gpu/drm/i915/display/g4x_dp.c | 2 ++
> drivers/gpu/drm/i915/display/g4x_hdmi.c | 2 ++
> drivers/gpu/drm/i915/display/intel_ddi.c | 2 ++
> 3 files changed, 6 insertions(+)
>
> diff --git a/drivers/gpu/drm/i915/display/g4x_dp.c b/drivers/gpu/drm/i915/display/g4x_dp.c
> index c58a3f249a01..0cab5992e3da 100644
> --- a/drivers/gpu/drm/i915/display/g4x_dp.c
> +++ b/drivers/gpu/drm/i915/display/g4x_dp.c
> @@ -1273,6 +1273,8 @@ bool g4x_dp_init(struct drm_i915_private *dev_priv,
> if (!dig_port)
> return false;
>
> + dig_port->aux_ch = AUX_CH_NONE;
> +
> intel_connector = intel_connector_alloc();
> if (!intel_connector)
> goto err_connector_alloc;
> diff --git a/drivers/gpu/drm/i915/display/g4x_hdmi.c b/drivers/gpu/drm/i915/display/g4x_hdmi.c
> index 8c71e3ede680..c1fd13bdc9d2 100644
> --- a/drivers/gpu/drm/i915/display/g4x_hdmi.c
> +++ b/drivers/gpu/drm/i915/display/g4x_hdmi.c
> @@ -698,6 +698,8 @@ void g4x_hdmi_init(struct drm_i915_private *dev_priv,
> if (!dig_port)
> return;
>
> + dig_port->aux_ch = AUX_CH_NONE;
> +
> intel_connector = intel_connector_alloc();
> if (!intel_connector) {
> kfree(dig_port);
> diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c
> index 61722556bb47..6cb24a472a9b 100644
> --- a/drivers/gpu/drm/i915/display/intel_ddi.c
> +++ b/drivers/gpu/drm/i915/display/intel_ddi.c
> @@ -4747,6 +4747,8 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)
> if (!dig_port)
> return;
>
> + dig_port->aux_ch = AUX_CH_NONE;
> +
> encoder = &dig_port->base;
> encoder->devdata = devdata;
--
Jani Nikula, Intel Open Source Graphics Center
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [Intel-gfx] [PATCH v2 2/5] drm/i915: Only populate aux_ch is really needed
2023-06-20 17:32 ` [Intel-gfx] [PATCH v2 2/5] drm/i915: Only populate aux_ch is really needed Ville Syrjala
@ 2023-06-21 7:46 ` Jani Nikula
2023-06-21 7:47 ` Jani Nikula
0 siblings, 1 reply; 19+ messages in thread
From: Jani Nikula @ 2023-06-21 7:46 UTC (permalink / raw)
To: Ville Syrjala, intel-gfx
On Tue, 20 Jun 2023, Ville Syrjala <ville.syrjala@linux.intel.com> wrote:
> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
>
> Mixing VBT based AUX CH with platform defaults seems like
> a recipe for conflicts. Let's only populate AUX CH if we
> absolutely need it, that is only if we are dealing with
> a DP output or a TC port (which need it due to some power
> well shenanigans).
>
> TODO: double check that real VBTs do in fact populate
> the AUX CH for HDMI TC legacy ports...
>
> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
> ---
> drivers/gpu/drm/i915/display/g4x_hdmi.c | 1 -
> drivers/gpu/drm/i915/display/intel_ddi.c | 12 +++++++++++-
> 2 files changed, 11 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/g4x_hdmi.c b/drivers/gpu/drm/i915/display/g4x_hdmi.c
> index c1fd13bdc9d2..634b14116d9d 100644
> --- a/drivers/gpu/drm/i915/display/g4x_hdmi.c
> +++ b/drivers/gpu/drm/i915/display/g4x_hdmi.c
> @@ -775,6 +775,5 @@ void g4x_hdmi_init(struct drm_i915_private *dev_priv,
>
> intel_infoframe_init(dig_port);
>
> - dig_port->aux_ch = intel_dp_aux_ch(intel_encoder);
> intel_hdmi_init_connector(dig_port, intel_connector);
> }
> diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c
> index 6cb24a472a9b..662b5ceef3c8 100644
> --- a/drivers/gpu/drm/i915/display/intel_ddi.c
> +++ b/drivers/gpu/drm/i915/display/intel_ddi.c
> @@ -4676,6 +4676,14 @@ static bool port_strap_detected(struct drm_i915_private *i915, enum port port)
> }
> }
>
> +static bool need_aux_ch(struct intel_encoder *encoder, bool init_dp)
> +{
> + struct drm_i915_private *i915 = to_i915(encoder->base.dev);
> + enum phy phy = intel_port_to_phy(i915, encoder->port);
> +
> + return init_dp || intel_phy_is_tc(i915, phy);
> +}
> +
> void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)
> {
> struct intel_digital_port *dig_port;
> @@ -4929,7 +4937,9 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)
>
> dig_port->dp.output_reg = INVALID_MMIO_REG;
> dig_port->max_lanes = intel_ddi_max_lanes(dig_port);
> - dig_port->aux_ch = intel_dp_aux_ch(encoder);
> +
> + if (need_aux_ch(encoder, init_dp))
> + dig_port->aux_ch = intel_dp_aux_ch(encoder);
>
> if (intel_phy_is_tc(dev_priv, phy)) {
> bool is_legacy =
--
Jani Nikula, Intel Open Source Graphics Center
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [Intel-gfx] [PATCH v2 2/5] drm/i915: Only populate aux_ch is really needed
2023-06-21 7:46 ` Jani Nikula
@ 2023-06-21 7:47 ` Jani Nikula
0 siblings, 0 replies; 19+ messages in thread
From: Jani Nikula @ 2023-06-21 7:47 UTC (permalink / raw)
To: Ville Syrjala, intel-gfx
On Wed, 21 Jun 2023, Jani Nikula <jani.nikula@linux.intel.com> wrote:
> On Tue, 20 Jun 2023, Ville Syrjala <ville.syrjala@linux.intel.com> wrote:
>> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
>>
>> Mixing VBT based AUX CH with platform defaults seems like
>> a recipe for conflicts. Let's only populate AUX CH if we
>> absolutely need it, that is only if we are dealing with
>> a DP output or a TC port (which need it due to some power
>> well shenanigans).
>>
>> TODO: double check that real VBTs do in fact populate
>> the AUX CH for HDMI TC legacy ports...
>>
>> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
>
> Reviewed-by: Jani Nikula <jani.nikula@intel.com>
Typo in subject s/is/if/ ?
>
>> ---
>> drivers/gpu/drm/i915/display/g4x_hdmi.c | 1 -
>> drivers/gpu/drm/i915/display/intel_ddi.c | 12 +++++++++++-
>> 2 files changed, 11 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/i915/display/g4x_hdmi.c b/drivers/gpu/drm/i915/display/g4x_hdmi.c
>> index c1fd13bdc9d2..634b14116d9d 100644
>> --- a/drivers/gpu/drm/i915/display/g4x_hdmi.c
>> +++ b/drivers/gpu/drm/i915/display/g4x_hdmi.c
>> @@ -775,6 +775,5 @@ void g4x_hdmi_init(struct drm_i915_private *dev_priv,
>>
>> intel_infoframe_init(dig_port);
>>
>> - dig_port->aux_ch = intel_dp_aux_ch(intel_encoder);
>> intel_hdmi_init_connector(dig_port, intel_connector);
>> }
>> diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c
>> index 6cb24a472a9b..662b5ceef3c8 100644
>> --- a/drivers/gpu/drm/i915/display/intel_ddi.c
>> +++ b/drivers/gpu/drm/i915/display/intel_ddi.c
>> @@ -4676,6 +4676,14 @@ static bool port_strap_detected(struct drm_i915_private *i915, enum port port)
>> }
>> }
>>
>> +static bool need_aux_ch(struct intel_encoder *encoder, bool init_dp)
>> +{
>> + struct drm_i915_private *i915 = to_i915(encoder->base.dev);
>> + enum phy phy = intel_port_to_phy(i915, encoder->port);
>> +
>> + return init_dp || intel_phy_is_tc(i915, phy);
>> +}
>> +
>> void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)
>> {
>> struct intel_digital_port *dig_port;
>> @@ -4929,7 +4937,9 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)
>>
>> dig_port->dp.output_reg = INVALID_MMIO_REG;
>> dig_port->max_lanes = intel_ddi_max_lanes(dig_port);
>> - dig_port->aux_ch = intel_dp_aux_ch(encoder);
>> +
>> + if (need_aux_ch(encoder, init_dp))
>> + dig_port->aux_ch = intel_dp_aux_ch(encoder);
>>
>> if (intel_phy_is_tc(dev_priv, phy)) {
>> bool is_legacy =
--
Jani Nikula, Intel Open Source Graphics Center
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [Intel-gfx] [PATCH v2 3/5] drm/i915: Remove DDC pin sanitation
2023-06-20 17:32 ` [Intel-gfx] [PATCH v2 3/5] drm/i915: Remove DDC pin sanitation Ville Syrjala
@ 2023-06-21 7:56 ` Jani Nikula
2023-06-29 14:04 ` Ville Syrjälä
0 siblings, 1 reply; 19+ messages in thread
From: Jani Nikula @ 2023-06-21 7:56 UTC (permalink / raw)
To: Ville Syrjala, intel-gfx
On Tue, 20 Jun 2023, Ville Syrjala <ville.syrjala@linux.intel.com> wrote:
> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
>
> Stop with the VBT DDC pin sanitation, and instead just check
> that the appropriate DDC pin is still available when initializing
> a HDMI connector.
Could be more verbose about the why here.
> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> ---
> drivers/gpu/drm/i915/display/intel_bios.c | 69 ----------------------
> drivers/gpu/drm/i915/display/intel_hdmi.c | 72 +++++++++++++++++++----
> 2 files changed, 59 insertions(+), 82 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_bios.c b/drivers/gpu/drm/i915/display/intel_bios.c
> index 34a397adbd6b..439ab5b3cbe5 100644
> --- a/drivers/gpu/drm/i915/display/intel_bios.c
> +++ b/drivers/gpu/drm/i915/display/intel_bios.c
> @@ -2230,72 +2230,6 @@ static u8 map_ddc_pin(struct drm_i915_private *i915, u8 vbt_pin)
> return 0;
> }
>
> -static enum port get_port_by_ddc_pin(struct drm_i915_private *i915, u8 ddc_pin)
> -{
> - enum port port;
> -
> - if (!ddc_pin)
> - return PORT_NONE;
> -
> - for_each_port(port) {
> - const struct intel_bios_encoder_data *devdata =
> - i915->display.vbt.ports[port];
> -
> - if (devdata && ddc_pin == devdata->child.ddc_pin)
> - return port;
> - }
> -
> - return PORT_NONE;
> -}
> -
> -static void sanitize_ddc_pin(struct intel_bios_encoder_data *devdata,
> - enum port port)
> -{
> - struct drm_i915_private *i915 = devdata->i915;
> - struct child_device_config *child;
> - u8 mapped_ddc_pin;
> - enum port p;
> -
> - if (!devdata->child.ddc_pin)
> - return;
> -
> - mapped_ddc_pin = map_ddc_pin(i915, devdata->child.ddc_pin);
> - if (!intel_gmbus_is_valid_pin(i915, mapped_ddc_pin)) {
> - drm_dbg_kms(&i915->drm,
> - "Port %c has invalid DDC pin %d, "
> - "sticking to defaults\n",
> - port_name(port), mapped_ddc_pin);
> - devdata->child.ddc_pin = 0;
> - return;
> - }
> -
> - p = get_port_by_ddc_pin(i915, devdata->child.ddc_pin);
> - if (p == PORT_NONE)
> - return;
> -
> - drm_dbg_kms(&i915->drm,
> - "port %c trying to use the same DDC pin (0x%x) as port %c, "
> - "disabling port %c DVI/HDMI support\n",
> - port_name(port), mapped_ddc_pin,
> - port_name(p), port_name(p));
> -
> - /*
> - * If we have multiple ports supposedly sharing the pin, then dvi/hdmi
> - * couldn't exist on the shared port. Otherwise they share the same ddc
> - * pin and system couldn't communicate with them separately.
> - *
> - * Give inverse child device order the priority, last one wins. Yes,
> - * there are real machines (eg. Asrock B250M-HDV) where VBT has both
> - * port A and port E with the same AUX ch and we must pick port E :(
> - */
The priority order gets changed, right? Needs explanation.
> - child = &i915->display.vbt.ports[p]->child;
> -
> - child->device_type &= ~DEVICE_TYPE_TMDS_DVI_SIGNALING;
> - child->device_type |= DEVICE_TYPE_NOT_HDMI_OUTPUT;
> -
> - child->ddc_pin = 0;
> -}
> -
> static enum port get_port_by_aux_ch(struct drm_i915_private *i915, u8 aux_ch)
> {
> enum port port;
> @@ -2753,9 +2687,6 @@ static void parse_ddi_port(struct intel_bios_encoder_data *devdata)
>
> sanitize_device_type(devdata, port);
>
> - if (intel_bios_encoder_supports_dvi(devdata))
> - sanitize_ddc_pin(devdata, port);
> -
> if (intel_bios_encoder_supports_dp(devdata))
> sanitize_aux_ch(devdata, port);
>
> diff --git a/drivers/gpu/drm/i915/display/intel_hdmi.c b/drivers/gpu/drm/i915/display/intel_hdmi.c
> index 7ac5e6c5e00d..8d1c8abfcffa 100644
> --- a/drivers/gpu/drm/i915/display/intel_hdmi.c
> +++ b/drivers/gpu/drm/i915/display/intel_hdmi.c
> @@ -2880,21 +2880,12 @@ static u8 g4x_port_to_ddc_pin(struct drm_i915_private *dev_priv,
> return ddc_pin;
> }
>
> -static u8 intel_hdmi_ddc_pin(struct intel_encoder *encoder)
> +static u8 intel_hdmi_default_ddc_pin(struct intel_encoder *encoder)
> {
> struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
> enum port port = encoder->port;
> u8 ddc_pin;
>
> - ddc_pin = intel_bios_hdmi_ddc_pin(encoder->devdata);
> - if (ddc_pin) {
> - drm_dbg_kms(&dev_priv->drm,
> - "[ENCODER:%d:%s] Using DDC pin 0x%x (VBT)\n",
> - encoder->base.base.id, encoder->base.name,
> - ddc_pin);
> - return ddc_pin;
> - }
> -
> if (IS_ALDERLAKE_S(dev_priv))
> ddc_pin = adls_port_to_ddc_pin(dev_priv, port);
> else if (INTEL_PCH_TYPE(dev_priv) >= PCH_DG1)
> @@ -2916,10 +2907,62 @@ static u8 intel_hdmi_ddc_pin(struct intel_encoder *encoder)
> else
> ddc_pin = g4x_port_to_ddc_pin(dev_priv, port);
>
> - drm_dbg_kms(&dev_priv->drm,
> - "[ENCODER:%d:%s] Using DDC pin 0x%x (platform default)\n",
> + return ddc_pin;
> +}
> +
> +static struct intel_encoder *
> +get_encoder_by_ddc_pin(struct intel_encoder *encoder, u8 ddc_pin)
> +{
> + struct drm_i915_private *i915 = to_i915(encoder->base.dev);
> + struct intel_encoder *other;
> +
> + for_each_intel_encoder(&i915->drm, other) {
> + if (other == encoder)
> + continue;
> +
> + if (!intel_encoder_is_dig_port(other))
> + continue;
> +
> + if (enc_to_dig_port(other)->hdmi.ddc_bus == ddc_pin)
> + return other;
> + }
> +
> + return NULL;
> +}
> +
> +static u8 intel_hdmi_ddc_pin(struct intel_encoder *encoder)
> +{
> + struct drm_i915_private *i915 = to_i915(encoder->base.dev);
> + struct intel_encoder *other;
> + const char *source;
> + u8 ddc_pin;
> +
> + ddc_pin = intel_bios_hdmi_ddc_pin(encoder->devdata);
> + source = "VBT";
> +
> + if (!ddc_pin) {
> + ddc_pin = intel_hdmi_default_ddc_pin(encoder);
> + source = "platform default";
> + }
> +
> + if (!intel_gmbus_is_valid_pin(i915, ddc_pin)) {
> + drm_dbg_kms(&i915->drm, "[ENCODER:%d:%s] Invalid DDC pin %d\n",
> + encoder->base.base.id, encoder->base.name, ddc_pin);
> + return 0;
> + }
The existing code checks the vbt ddc pin for validity, and if it's
invalid, falls back to platform default.
The above skips the platform default fallback if vbt has invalid but
non-zero ddc pin.
I'm not sure if it really matters, but at the very least deserves a
mention in the commit message.
BR,
Jani.
> +
> + other = get_encoder_by_ddc_pin(encoder, ddc_pin);
> + if (other) {
> + drm_dbg_kms(&i915->drm, "[ENCODER:%d:%s] DDC pin %d already claimed by [ENCODER:%d:%s]\n",
> + encoder->base.base.id, encoder->base.name, ddc_pin,
> + other->base.base.id, other->base.name);
> + return 0;
> + }
> +
> + drm_dbg_kms(&i915->drm,
> + "[ENCODER:%d:%s] Using DDC pin 0x%x (%s)\n",
> encoder->base.base.id, encoder->base.name,
> - ddc_pin);
> + ddc_pin, source);
>
> return ddc_pin;
> }
> @@ -2990,6 +3033,9 @@ void intel_hdmi_init_connector(struct intel_digital_port *dig_port,
> return;
>
> intel_hdmi->ddc_bus = intel_hdmi_ddc_pin(intel_encoder);
> + if (!intel_hdmi->ddc_bus)
> + return;
> +
> ddc = intel_gmbus_get_adapter(dev_priv, intel_hdmi->ddc_bus);
>
> drm_connector_init_with_ddc(dev, connector,
--
Jani Nikula, Intel Open Source Graphics Center
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [Intel-gfx] [PATCH v2 4/5] drm/i915: Remove AUX CH sanitation
2023-06-20 17:32 ` [Intel-gfx] [PATCH v2 4/5] drm/i915: Remove AUX CH sanitation Ville Syrjala
@ 2023-06-21 8:00 ` Jani Nikula
2023-06-21 13:13 ` Ville Syrjälä
0 siblings, 1 reply; 19+ messages in thread
From: Jani Nikula @ 2023-06-21 8:00 UTC (permalink / raw)
To: Ville Syrjala, intel-gfx
On Tue, 20 Jun 2023, Ville Syrjala <ville.syrjala@linux.intel.com> wrote:
> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
>
> Stop with the VBT AUX CH sanitation, and instead just check
> that the appropriate AUX CH is still available when initializing
> a DP/TC port.
>
> Note that the old way of sanitizing gave priority to the last
> port declared in the VBT, but now we sort of do the opposite by
> favoring the first encoder to succesfully initialize. The reason
> for the old "last port wins" preference was eg. Asrock B250M-HDV
> where port A (eDP) and port E (DP->VGA) have an AUX CH conflict
> and we need to prefer port E. However with the new way port A (eDP)
> will be probed first, but will fail to probe due to HPD and thus
> port E will still win in the end.
That's the kind of explanation I was after in the previous patch for ddc
pin.
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
>
> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> ---
> drivers/gpu/drm/i915/display/g4x_dp.c | 3 ++
> drivers/gpu/drm/i915/display/intel_bios.c | 53 ---------------------
> drivers/gpu/drm/i915/display/intel_ddi.c | 5 +-
> drivers/gpu/drm/i915/display/intel_dp_aux.c | 51 ++++++++++++++++----
> 4 files changed, 50 insertions(+), 62 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/g4x_dp.c b/drivers/gpu/drm/i915/display/g4x_dp.c
> index 0cab5992e3da..4c7187f7913e 100644
> --- a/drivers/gpu/drm/i915/display/g4x_dp.c
> +++ b/drivers/gpu/drm/i915/display/g4x_dp.c
> @@ -1378,6 +1378,9 @@ bool g4x_dp_init(struct drm_i915_private *dev_priv,
> intel_infoframe_init(dig_port);
>
> dig_port->aux_ch = intel_dp_aux_ch(intel_encoder);
> + if (dig_port->aux_ch == AUX_CH_NONE)
> + goto err_init_connector;
> +
> if (!intel_dp_init_connector(dig_port, intel_connector))
> goto err_init_connector;
>
> diff --git a/drivers/gpu/drm/i915/display/intel_bios.c b/drivers/gpu/drm/i915/display/intel_bios.c
> index 439ab5b3cbe5..d1bf725ee9b3 100644
> --- a/drivers/gpu/drm/i915/display/intel_bios.c
> +++ b/drivers/gpu/drm/i915/display/intel_bios.c
> @@ -2230,56 +2230,6 @@ static u8 map_ddc_pin(struct drm_i915_private *i915, u8 vbt_pin)
> return 0;
> }
>
> -static enum port get_port_by_aux_ch(struct drm_i915_private *i915, u8 aux_ch)
> -{
> - enum port port;
> -
> - if (!aux_ch)
> - return PORT_NONE;
> -
> - for_each_port(port) {
> - const struct intel_bios_encoder_data *devdata =
> - i915->display.vbt.ports[port];
> -
> - if (devdata && aux_ch == devdata->child.aux_channel)
> - return port;
> - }
> -
> - return PORT_NONE;
> -}
> -
> -static void sanitize_aux_ch(struct intel_bios_encoder_data *devdata,
> - enum port port)
> -{
> - struct drm_i915_private *i915 = devdata->i915;
> - struct child_device_config *child;
> - enum port p;
> -
> - p = get_port_by_aux_ch(i915, devdata->child.aux_channel);
> - if (p == PORT_NONE)
> - return;
> -
> - drm_dbg_kms(&i915->drm,
> - "port %c trying to use the same AUX CH (0x%x) as port %c, "
> - "disabling port %c DP support\n",
> - port_name(port), devdata->child.aux_channel,
> - port_name(p), port_name(p));
> -
> - /*
> - * If we have multiple ports supposedly sharing the aux channel, then DP
> - * couldn't exist on the shared port. Otherwise they share the same aux
> - * channel and system couldn't communicate with them separately.
> - *
> - * Give inverse child device order the priority, last one wins. Yes,
> - * there are real machines (eg. Asrock B250M-HDV) where VBT has both
> - * port A and port E with the same AUX ch and we must pick port E :(
> - */
> - child = &i915->display.vbt.ports[p]->child;
> -
> - child->device_type &= ~DEVICE_TYPE_DISPLAYPORT_OUTPUT;
> - child->aux_channel = 0;
> -}
> -
> static u8 dvo_port_type(u8 dvo_port)
> {
> switch (dvo_port) {
> @@ -2687,9 +2637,6 @@ static void parse_ddi_port(struct intel_bios_encoder_data *devdata)
>
> sanitize_device_type(devdata, port);
>
> - if (intel_bios_encoder_supports_dp(devdata))
> - sanitize_aux_ch(devdata, port);
> -
> i915->display.vbt.ports[port] = devdata;
> }
>
> diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c
> index 662b5ceef3c8..9e4e6482aa26 100644
> --- a/drivers/gpu/drm/i915/display/intel_ddi.c
> +++ b/drivers/gpu/drm/i915/display/intel_ddi.c
> @@ -4938,8 +4938,11 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)
> dig_port->dp.output_reg = INVALID_MMIO_REG;
> dig_port->max_lanes = intel_ddi_max_lanes(dig_port);
>
> - if (need_aux_ch(encoder, init_dp))
> + if (need_aux_ch(encoder, init_dp)) {
> dig_port->aux_ch = intel_dp_aux_ch(encoder);
> + if (dig_port->aux_ch == AUX_CH_NONE)
> + goto err;
> + }
>
> if (intel_phy_is_tc(dev_priv, phy)) {
> bool is_legacy =
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_aux.c b/drivers/gpu/drm/i915/display/intel_dp_aux.c
> index 21b50a5c8a85..2d173bd495a3 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_aux.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_aux.c
> @@ -792,25 +792,60 @@ static enum aux_ch default_aux_ch(struct intel_encoder *encoder)
> return (enum aux_ch)encoder->port;
> }
>
> +static struct intel_encoder *
> +get_encoder_by_aux_ch(struct intel_encoder *encoder,
> + enum aux_ch aux_ch)
> +{
> + struct drm_i915_private *i915 = to_i915(encoder->base.dev);
> + struct intel_encoder *other;
> +
> + for_each_intel_encoder(&i915->drm, other) {
> + if (other == encoder)
> + continue;
> +
> + if (!intel_encoder_is_dig_port(other))
> + continue;
> +
> + if (enc_to_dig_port(other)->aux_ch == aux_ch)
> + return other;
> + }
> +
> + return NULL;
> +}
> +
> enum aux_ch intel_dp_aux_ch(struct intel_encoder *encoder)
> {
> struct drm_i915_private *i915 = to_i915(encoder->base.dev);
> + struct intel_encoder *other;
> + const char *source;
> enum aux_ch aux_ch;
>
> aux_ch = intel_bios_dp_aux_ch(encoder->devdata);
> - if (aux_ch != AUX_CH_NONE) {
> - drm_dbg_kms(&i915->drm, "[ENCODER:%d:%s] using AUX %c (VBT)\n",
> - encoder->base.base.id, encoder->base.name,
> - aux_ch_name(aux_ch));
> - return aux_ch;
> + source = "VBT";
> +
> + if (aux_ch == AUX_CH_NONE) {
> + aux_ch = default_aux_ch(encoder);
> + source = "platform default";
> }
>
> - aux_ch = default_aux_ch(encoder);
> + if (aux_ch == AUX_CH_NONE)
> + return AUX_CH_NONE;
> +
> + /* FIXME validate aux_ch against platform caps */
> +
> + other = get_encoder_by_aux_ch(encoder, aux_ch);
> + if (other) {
> + drm_dbg_kms(&i915->drm,
> + "[ENCODER:%d:%s] AUX CH %c already claimed by [ENCODER:%d:%s]\n",
> + encoder->base.base.id, encoder->base.name, aux_ch_name(aux_ch),
> + other->base.base.id, other->base.name);
> + return AUX_CH_NONE;
> + }
>
> drm_dbg_kms(&i915->drm,
> - "[ENCODER:%d:%s] using AUX %c (platform default)\n",
> + "[ENCODER:%d:%s] Using AUX CH %c (%s)\n",
> encoder->base.base.id, encoder->base.name,
> - aux_ch_name(aux_ch));
> + aux_ch_name(aux_ch), source);
>
> return aux_ch;
> }
--
Jani Nikula, Intel Open Source Graphics Center
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [Intel-gfx] [PATCH v2 4/5] drm/i915: Remove AUX CH sanitation
2023-06-21 8:00 ` Jani Nikula
@ 2023-06-21 13:13 ` Ville Syrjälä
0 siblings, 0 replies; 19+ messages in thread
From: Ville Syrjälä @ 2023-06-21 13:13 UTC (permalink / raw)
To: Jani Nikula; +Cc: intel-gfx
On Wed, Jun 21, 2023 at 11:00:31AM +0300, Jani Nikula wrote:
> On Tue, 20 Jun 2023, Ville Syrjala <ville.syrjala@linux.intel.com> wrote:
> > From: Ville Syrjälä <ville.syrjala@linux.intel.com>
> >
> > Stop with the VBT AUX CH sanitation, and instead just check
> > that the appropriate AUX CH is still available when initializing
> > a DP/TC port.
> >
> > Note that the old way of sanitizing gave priority to the last
> > port declared in the VBT, but now we sort of do the opposite by
> > favoring the first encoder to succesfully initialize. The reason
> > for the old "last port wins" preference was eg. Asrock B250M-HDV
> > where port A (eDP) and port E (DP->VGA) have an AUX CH conflict
> > and we need to prefer port E. However with the new way port A (eDP)
> > will be probed first, but will fail to probe due to HPD and thus
> > port E will still win in the end.
>
> That's the kind of explanation I was after in the previous patch for ddc
> pin.
I think I lost a bit of explanations on account of squashing
away one one entire patch from the original series. Suppose
I should add more text to both of these sanitation patches
to explain the reasoning a bit better...
>
> Reviewed-by: Jani Nikula <jani.nikula@intel.com>
Ta.
>
> >
> > Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> > ---
> > drivers/gpu/drm/i915/display/g4x_dp.c | 3 ++
> > drivers/gpu/drm/i915/display/intel_bios.c | 53 ---------------------
> > drivers/gpu/drm/i915/display/intel_ddi.c | 5 +-
> > drivers/gpu/drm/i915/display/intel_dp_aux.c | 51 ++++++++++++++++----
> > 4 files changed, 50 insertions(+), 62 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/i915/display/g4x_dp.c b/drivers/gpu/drm/i915/display/g4x_dp.c
> > index 0cab5992e3da..4c7187f7913e 100644
> > --- a/drivers/gpu/drm/i915/display/g4x_dp.c
> > +++ b/drivers/gpu/drm/i915/display/g4x_dp.c
> > @@ -1378,6 +1378,9 @@ bool g4x_dp_init(struct drm_i915_private *dev_priv,
> > intel_infoframe_init(dig_port);
> >
> > dig_port->aux_ch = intel_dp_aux_ch(intel_encoder);
> > + if (dig_port->aux_ch == AUX_CH_NONE)
> > + goto err_init_connector;
> > +
> > if (!intel_dp_init_connector(dig_port, intel_connector))
> > goto err_init_connector;
> >
> > diff --git a/drivers/gpu/drm/i915/display/intel_bios.c b/drivers/gpu/drm/i915/display/intel_bios.c
> > index 439ab5b3cbe5..d1bf725ee9b3 100644
> > --- a/drivers/gpu/drm/i915/display/intel_bios.c
> > +++ b/drivers/gpu/drm/i915/display/intel_bios.c
> > @@ -2230,56 +2230,6 @@ static u8 map_ddc_pin(struct drm_i915_private *i915, u8 vbt_pin)
> > return 0;
> > }
> >
> > -static enum port get_port_by_aux_ch(struct drm_i915_private *i915, u8 aux_ch)
> > -{
> > - enum port port;
> > -
> > - if (!aux_ch)
> > - return PORT_NONE;
> > -
> > - for_each_port(port) {
> > - const struct intel_bios_encoder_data *devdata =
> > - i915->display.vbt.ports[port];
> > -
> > - if (devdata && aux_ch == devdata->child.aux_channel)
> > - return port;
> > - }
> > -
> > - return PORT_NONE;
> > -}
> > -
> > -static void sanitize_aux_ch(struct intel_bios_encoder_data *devdata,
> > - enum port port)
> > -{
> > - struct drm_i915_private *i915 = devdata->i915;
> > - struct child_device_config *child;
> > - enum port p;
> > -
> > - p = get_port_by_aux_ch(i915, devdata->child.aux_channel);
> > - if (p == PORT_NONE)
> > - return;
> > -
> > - drm_dbg_kms(&i915->drm,
> > - "port %c trying to use the same AUX CH (0x%x) as port %c, "
> > - "disabling port %c DP support\n",
> > - port_name(port), devdata->child.aux_channel,
> > - port_name(p), port_name(p));
> > -
> > - /*
> > - * If we have multiple ports supposedly sharing the aux channel, then DP
> > - * couldn't exist on the shared port. Otherwise they share the same aux
> > - * channel and system couldn't communicate with them separately.
> > - *
> > - * Give inverse child device order the priority, last one wins. Yes,
> > - * there are real machines (eg. Asrock B250M-HDV) where VBT has both
> > - * port A and port E with the same AUX ch and we must pick port E :(
> > - */
> > - child = &i915->display.vbt.ports[p]->child;
> > -
> > - child->device_type &= ~DEVICE_TYPE_DISPLAYPORT_OUTPUT;
> > - child->aux_channel = 0;
> > -}
> > -
> > static u8 dvo_port_type(u8 dvo_port)
> > {
> > switch (dvo_port) {
> > @@ -2687,9 +2637,6 @@ static void parse_ddi_port(struct intel_bios_encoder_data *devdata)
> >
> > sanitize_device_type(devdata, port);
> >
> > - if (intel_bios_encoder_supports_dp(devdata))
> > - sanitize_aux_ch(devdata, port);
> > -
> > i915->display.vbt.ports[port] = devdata;
> > }
> >
> > diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c
> > index 662b5ceef3c8..9e4e6482aa26 100644
> > --- a/drivers/gpu/drm/i915/display/intel_ddi.c
> > +++ b/drivers/gpu/drm/i915/display/intel_ddi.c
> > @@ -4938,8 +4938,11 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)
> > dig_port->dp.output_reg = INVALID_MMIO_REG;
> > dig_port->max_lanes = intel_ddi_max_lanes(dig_port);
> >
> > - if (need_aux_ch(encoder, init_dp))
> > + if (need_aux_ch(encoder, init_dp)) {
> > dig_port->aux_ch = intel_dp_aux_ch(encoder);
> > + if (dig_port->aux_ch == AUX_CH_NONE)
> > + goto err;
> > + }
> >
> > if (intel_phy_is_tc(dev_priv, phy)) {
> > bool is_legacy =
> > diff --git a/drivers/gpu/drm/i915/display/intel_dp_aux.c b/drivers/gpu/drm/i915/display/intel_dp_aux.c
> > index 21b50a5c8a85..2d173bd495a3 100644
> > --- a/drivers/gpu/drm/i915/display/intel_dp_aux.c
> > +++ b/drivers/gpu/drm/i915/display/intel_dp_aux.c
> > @@ -792,25 +792,60 @@ static enum aux_ch default_aux_ch(struct intel_encoder *encoder)
> > return (enum aux_ch)encoder->port;
> > }
> >
> > +static struct intel_encoder *
> > +get_encoder_by_aux_ch(struct intel_encoder *encoder,
> > + enum aux_ch aux_ch)
> > +{
> > + struct drm_i915_private *i915 = to_i915(encoder->base.dev);
> > + struct intel_encoder *other;
> > +
> > + for_each_intel_encoder(&i915->drm, other) {
> > + if (other == encoder)
> > + continue;
> > +
> > + if (!intel_encoder_is_dig_port(other))
> > + continue;
> > +
> > + if (enc_to_dig_port(other)->aux_ch == aux_ch)
> > + return other;
> > + }
> > +
> > + return NULL;
> > +}
> > +
> > enum aux_ch intel_dp_aux_ch(struct intel_encoder *encoder)
> > {
> > struct drm_i915_private *i915 = to_i915(encoder->base.dev);
> > + struct intel_encoder *other;
> > + const char *source;
> > enum aux_ch aux_ch;
> >
> > aux_ch = intel_bios_dp_aux_ch(encoder->devdata);
> > - if (aux_ch != AUX_CH_NONE) {
> > - drm_dbg_kms(&i915->drm, "[ENCODER:%d:%s] using AUX %c (VBT)\n",
> > - encoder->base.base.id, encoder->base.name,
> > - aux_ch_name(aux_ch));
> > - return aux_ch;
> > + source = "VBT";
> > +
> > + if (aux_ch == AUX_CH_NONE) {
> > + aux_ch = default_aux_ch(encoder);
> > + source = "platform default";
> > }
> >
> > - aux_ch = default_aux_ch(encoder);
> > + if (aux_ch == AUX_CH_NONE)
> > + return AUX_CH_NONE;
> > +
> > + /* FIXME validate aux_ch against platform caps */
> > +
> > + other = get_encoder_by_aux_ch(encoder, aux_ch);
> > + if (other) {
> > + drm_dbg_kms(&i915->drm,
> > + "[ENCODER:%d:%s] AUX CH %c already claimed by [ENCODER:%d:%s]\n",
> > + encoder->base.base.id, encoder->base.name, aux_ch_name(aux_ch),
> > + other->base.base.id, other->base.name);
> > + return AUX_CH_NONE;
> > + }
> >
> > drm_dbg_kms(&i915->drm,
> > - "[ENCODER:%d:%s] using AUX %c (platform default)\n",
> > + "[ENCODER:%d:%s] Using AUX CH %c (%s)\n",
> > encoder->base.base.id, encoder->base.name,
> > - aux_ch_name(aux_ch));
> > + aux_ch_name(aux_ch), source);
> >
> > return aux_ch;
> > }
>
> --
> Jani Nikula, Intel Open Source Graphics Center
--
Ville Syrjälä
Intel
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [Intel-gfx] [PATCH v2 5/5] drm/i915: Try to initialize DDI/ICL+ DSI ports for every VBT child device
2023-06-20 17:32 ` [Intel-gfx] [PATCH v2 5/5] drm/i915: Try to initialize DDI/ICL+ DSI ports for every VBT child device Ville Syrjala
@ 2023-06-26 13:06 ` Jani Nikula
2023-06-29 14:13 ` Ville Syrjälä
0 siblings, 1 reply; 19+ messages in thread
From: Jani Nikula @ 2023-06-26 13:06 UTC (permalink / raw)
To: Ville Syrjala, intel-gfx
On Tue, 20 Jun 2023, Ville Syrjala <ville.syrjala@linux.intel.com> wrote:
> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
>
> Try to deal with duplicate child devices for the same DDI port
> by attempting to initialize them in VBT defined order The first
> on to succeed for a specific DDI port will be the one we use.
>
> We'll also get rid of i915->display.vbt.ports[] here as any conflicts
> will now be handled at encoder registration time rather than during
> VBT parsing. Note that intel_bios_encoder_data_lookup() still remaims
> for pre-DDI DP/HDMI ports as those don't (at least yet) use VBT
> driven initialization.
>
> TODO: DSI dual link handling is sketchy at best
The second DSI link isn't listed as a child device, is it? Just the
first, it'll have to be the "lower" port, and the second one is implicit
based on dual link usage.
>
> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> ---
> drivers/gpu/drm/i915/display/icl_dsi.c | 11 ++--
> drivers/gpu/drm/i915/display/icl_dsi.h | 6 +-
> drivers/gpu/drm/i915/display/intel_bios.c | 65 ++++++++++++++-----
> drivers/gpu/drm/i915/display/intel_bios.h | 6 ++
> drivers/gpu/drm/i915/display/intel_ddi.c | 49 +++++++++++---
> drivers/gpu/drm/i915/display/intel_ddi.h | 5 +-
> drivers/gpu/drm/i915/display/intel_display.c | 11 +---
> .../gpu/drm/i915/display/intel_display_core.h | 2 -
> 8 files changed, 107 insertions(+), 48 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/icl_dsi.c b/drivers/gpu/drm/i915/display/icl_dsi.c
> index 59a2a289d9be..475f4f587c79 100644
> --- a/drivers/gpu/drm/i915/display/icl_dsi.c
> +++ b/drivers/gpu/drm/i915/display/icl_dsi.c
> @@ -1933,16 +1933,14 @@ static void icl_dsi_add_properties(struct intel_connector *connector)
> fixed_mode->vdisplay);
> }
>
> -void icl_dsi_init(struct drm_i915_private *dev_priv)
> +void icl_dsi_init(struct drm_i915_private *dev_priv,
> + const struct intel_bios_encoder_data *devdata,
> + enum port port)
> {
> struct intel_dsi *intel_dsi;
> struct intel_encoder *encoder;
> struct intel_connector *intel_connector;
> struct drm_connector *connector;
> - enum port port;
> -
> - if (!intel_bios_is_dsi_present(dev_priv, &port))
> - return;
>
> intel_dsi = kzalloc(sizeof(*intel_dsi), GFP_KERNEL);
> if (!intel_dsi)
> @@ -1958,6 +1956,8 @@ void icl_dsi_init(struct drm_i915_private *dev_priv)
> intel_dsi->attached_connector = intel_connector;
> connector = &intel_connector->base;
>
> + encoder->devdata = devdata;
> +
> /* register DSI encoder with DRM subsystem */
> drm_encoder_init(&dev_priv->drm, &encoder->base, &gen11_dsi_encoder_funcs,
> DRM_MODE_ENCODER_DSI, "DSI %c", port_name(port));
> @@ -1995,7 +1995,6 @@ void icl_dsi_init(struct drm_i915_private *dev_priv)
>
> intel_dsi->panel_power_off_time = ktime_get_boottime();
>
> - encoder->devdata = intel_bios_encoder_data_lookup(dev_priv, port);
> intel_bios_init_panel_late(dev_priv, &intel_connector->panel, encoder->devdata, NULL);
>
> mutex_lock(&dev_priv->drm.mode_config.mutex);
> diff --git a/drivers/gpu/drm/i915/display/icl_dsi.h b/drivers/gpu/drm/i915/display/icl_dsi.h
> index b4861b56b5b2..ac42f2dc21ec 100644
> --- a/drivers/gpu/drm/i915/display/icl_dsi.h
> +++ b/drivers/gpu/drm/i915/display/icl_dsi.h
> @@ -6,10 +6,14 @@
> #ifndef __ICL_DSI_H__
> #define __ICL_DSI_H__
>
> +enum port;
> struct drm_i915_private;
> +struct intel_bios_encoder_data;
> struct intel_crtc_state;
>
> -void icl_dsi_init(struct drm_i915_private *i915);
> +void icl_dsi_init(struct drm_i915_private *i915,
> + const struct intel_bios_encoder_data *devdata,
> + enum port port);
> void icl_dsi_frame_update(struct intel_crtc_state *crtc_state);
>
> #endif /* __ICL_DSI_H__ */
> diff --git a/drivers/gpu/drm/i915/display/intel_bios.c b/drivers/gpu/drm/i915/display/intel_bios.c
> index d1bf725ee9b3..7d2e843681f3 100644
> --- a/drivers/gpu/drm/i915/display/intel_bios.c
> +++ b/drivers/gpu/drm/i915/display/intel_bios.c
> @@ -2484,7 +2484,7 @@ intel_bios_encoder_supports_edp(const struct intel_bios_encoder_data *devdata)
> devdata->child.device_type & DEVICE_TYPE_INTERNAL_CONNECTOR;
> }
>
> -static bool
> +bool
> intel_bios_encoder_supports_dsi(const struct intel_bios_encoder_data *devdata)
> {
> return devdata->child.device_type & DEVICE_TYPE_MIPI_OUTPUT;
> @@ -2542,13 +2542,19 @@ static bool is_port_valid(struct drm_i915_private *i915, enum port port)
> return true;
> }
>
> -static void print_ddi_port(const struct intel_bios_encoder_data *devdata,
> - enum port port)
> +static void print_ddi_port(const struct intel_bios_encoder_data *devdata)
> {
> struct drm_i915_private *i915 = devdata->i915;
> const struct child_device_config *child = &devdata->child;
> bool is_dvi, is_hdmi, is_dp, is_edp, is_dsi, is_crt, supports_typec_usb, supports_tbt;
> int dp_boost_level, dp_max_link_rate, hdmi_boost_level, hdmi_level_shift, max_tmds_clock;
> + enum port port;
> +
> + port = dvo_port_to_port(i915, child->dvo_port);
> + if (port == PORT_NONE && DISPLAY_VER(i915) >= 11)
> + port = dsi_dvo_port_to_port(i915, child->dvo_port);
> + if (port == PORT_NONE)
> + return;
>
> is_dvi = intel_bios_encoder_supports_dvi(devdata);
> is_dp = intel_bios_encoder_supports_dp(devdata);
> @@ -2628,16 +2634,7 @@ static void parse_ddi_port(struct intel_bios_encoder_data *devdata)
> return;
> }
>
> - if (i915->display.vbt.ports[port]) {
> - drm_dbg_kms(&i915->drm,
> - "More than one child device for port %c in VBT, using the first.\n",
> - port_name(port));
> - return;
> - }
> -
> sanitize_device_type(devdata, port);
> -
> - i915->display.vbt.ports[port] = devdata;
> }
>
> static bool has_ddi_port_info(struct drm_i915_private *i915)
> @@ -2648,7 +2645,6 @@ static bool has_ddi_port_info(struct drm_i915_private *i915)
> static void parse_ddi_ports(struct drm_i915_private *i915)
> {
> struct intel_bios_encoder_data *devdata;
> - enum port port;
>
> if (!has_ddi_port_info(i915))
> return;
> @@ -2656,10 +2652,8 @@ static void parse_ddi_ports(struct drm_i915_private *i915)
> list_for_each_entry(devdata, &i915->display.vbt.display_devices, node)
> parse_ddi_port(devdata);
>
> - for_each_port(port) {
> - if (i915->display.vbt.ports[port])
> - print_ddi_port(i915->display.vbt.ports[port], port);
> - }
> + list_for_each_entry(devdata, &i915->display.vbt.display_devices, node)
> + print_ddi_port(devdata);
> }
>
> static void
> @@ -3584,5 +3578,40 @@ bool intel_bios_encoder_hpd_invert(const struct intel_bios_encoder_data *devdata
> const struct intel_bios_encoder_data *
> intel_bios_encoder_data_lookup(struct drm_i915_private *i915, enum port port)
> {
> - return i915->display.vbt.ports[port];
> + struct intel_bios_encoder_data *devdata;
> +
> + list_for_each_entry(devdata, &i915->display.vbt.display_devices, node) {
> + const struct child_device_config *child = &devdata->child;
> + enum port p;
> +
> + p = dvo_port_to_port(i915, child->dvo_port);
> + if (p == PORT_NONE && DISPLAY_VER(i915) >= 11)
> + p = dsi_dvo_port_to_port(i915, child->dvo_port);
> +
> + if (p == port)
> + return devdata;
> + }
> +
> + return NULL;
> +}
> +
> +void intel_bios_for_each_encoder(struct drm_i915_private *i915,
> + void (*func)(struct drm_i915_private *i915,
> + const struct intel_bios_encoder_data *devdata,
> + enum port port))
> +{
> + struct intel_bios_encoder_data *devdata;
> +
> + list_for_each_entry(devdata, &i915->display.vbt.display_devices, node) {
> + const struct child_device_config *child = &devdata->child;
> + enum port port;
> +
> + port = dvo_port_to_port(i915, child->dvo_port);
> + if (port == PORT_NONE && DISPLAY_VER(i915) >= 11)
> + port = dsi_dvo_port_to_port(i915, child->dvo_port);
> + if (port == PORT_NONE)
> + continue;
Looks like at least three places would benefit from a
intel_bios_encoder_port() function that would do the above.
Maybe we wouldn't even need to pass the port to the callback, it could
dig the port out itself?
> +
> + func(i915, devdata, port);
> + }
> }
> diff --git a/drivers/gpu/drm/i915/display/intel_bios.h b/drivers/gpu/drm/i915/display/intel_bios.h
> index 45fae97d9719..fdc847211a84 100644
> --- a/drivers/gpu/drm/i915/display/intel_bios.h
> +++ b/drivers/gpu/drm/i915/display/intel_bios.h
> @@ -263,6 +263,7 @@ bool intel_bios_encoder_supports_dp(const struct intel_bios_encoder_data *devdat
> bool intel_bios_encoder_supports_edp(const struct intel_bios_encoder_data *devdata);
> bool intel_bios_encoder_supports_typec_usb(const struct intel_bios_encoder_data *devdata);
> bool intel_bios_encoder_supports_tbt(const struct intel_bios_encoder_data *devdata);
> +bool intel_bios_encoder_supports_dsi(const struct intel_bios_encoder_data *devdata);
> bool intel_bios_encoder_supports_dp_dual_mode(const struct intel_bios_encoder_data *devdata);
> bool intel_bios_encoder_is_lspcon(const struct intel_bios_encoder_data *devdata);
> bool intel_bios_encoder_lane_reversal(const struct intel_bios_encoder_data *devdata);
> @@ -276,4 +277,9 @@ int intel_bios_hdmi_ddc_pin(const struct intel_bios_encoder_data *devdata);
> int intel_bios_hdmi_level_shift(const struct intel_bios_encoder_data *devdata);
> int intel_bios_hdmi_max_tmds_clock(const struct intel_bios_encoder_data *devdata);
>
> +void intel_bios_for_each_encoder(struct drm_i915_private *i915,
> + void (*func)(struct drm_i915_private *i915,
> + const struct intel_bios_encoder_data *devdata,
> + enum port port));
> +
> #endif /* _INTEL_BIOS_H_ */
> diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c
> index 9e4e6482aa26..7bfcd52e4645 100644
> --- a/drivers/gpu/drm/i915/display/intel_ddi.c
> +++ b/drivers/gpu/drm/i915/display/intel_ddi.c
> @@ -32,6 +32,7 @@
>
> #include "i915_drv.h"
> #include "i915_reg.h"
> +#include "icl_dsi.h"
> #include "intel_audio.h"
> #include "intel_audio_regs.h"
> #include "intel_backlight.h"
> @@ -4684,11 +4685,32 @@ static bool need_aux_ch(struct intel_encoder *encoder, bool init_dp)
> return init_dp || intel_phy_is_tc(i915, phy);
> }
>
> -void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)
> +static bool assert_has_icl_dsi(struct drm_i915_private *i915)
> +{
> + return !drm_WARN(&i915->drm, !IS_ALDERLAKE_P(i915) &&
> + !IS_TIGERLAKE(i915) && DISPLAY_VER(i915) != 11,
> + "Platform does not support DSI\n");
> +}
> +
> +static bool port_in_use(struct drm_i915_private *i915, enum port port)
> +{
> + struct intel_encoder *encoder;
> +
> + for_each_intel_encoder(&i915->drm, encoder) {
> + /* FIXME what about second port for dual link DSI? */
> + if (encoder->port == port)
> + return true;
> + }
> +
> + return false;
> +}
> +
> +void intel_ddi_init(struct drm_i915_private *dev_priv,
> + const struct intel_bios_encoder_data *devdata,
> + enum port port)
> {
> struct intel_digital_port *dig_port;
> struct intel_encoder *encoder;
> - const struct intel_bios_encoder_data *devdata;
> bool init_hdmi, init_dp;
> enum phy phy = intel_port_to_phy(dev_priv, port);
>
> @@ -4701,6 +4723,21 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)
> if (!assert_port_valid(dev_priv, port))
> return;
>
> + if (port_in_use(dev_priv, port)) {
> + drm_dbg_kms(&dev_priv->drm,
> + "Port %c already claimed\n", port_name(port));
> + return;
> + }
> +
> + if (intel_bios_encoder_supports_dsi(devdata)) {
> + /* BXT/GLK handled elsewhere, for now at least */
> + if (!assert_has_icl_dsi(dev_priv))
> + return;
> +
> + icl_dsi_init(dev_priv, devdata, port);
> + return;
> + }
Maybe the division of responsibilities above is fine for starters... but
feels like if we're going to convert more platforms/outputs to this, we
should have a separate function near intel_setup_outputs() that gets
passed to intel_bios_for_each_encoder() that chooses the encoder
function to call?
> +
> /*
> * On platforms with HTI (aka HDPORT), if it's enabled at boot it may
> * have taken over some of the PHYs and made them unavailable to the
> @@ -4713,14 +4750,6 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)
> return;
> }
>
> - devdata = intel_bios_encoder_data_lookup(dev_priv, port);
> - if (!devdata) {
> - drm_dbg_kms(&dev_priv->drm,
> - "VBT says port %c is not present\n",
> - port_name(port));
> - return;
> - }
> -
> init_hdmi = intel_bios_encoder_supports_dvi(devdata) ||
> intel_bios_encoder_supports_hdmi(devdata);
> init_dp = intel_bios_encoder_supports_dp(devdata);
> diff --git a/drivers/gpu/drm/i915/display/intel_ddi.h b/drivers/gpu/drm/i915/display/intel_ddi.h
> index 2bc034042a93..10d586b0a9c0 100644
> --- a/drivers/gpu/drm/i915/display/intel_ddi.h
> +++ b/drivers/gpu/drm/i915/display/intel_ddi.h
> @@ -11,6 +11,7 @@
> struct drm_connector_state;
> struct drm_i915_private;
> struct intel_atomic_state;
> +struct intel_bios_encoder_data;
> struct intel_connector;
> struct intel_crtc;
> struct intel_crtc_state;
> @@ -50,7 +51,9 @@ void hsw_prepare_dp_ddi_buffers(struct intel_encoder *encoder,
> const struct intel_crtc_state *crtc_state);
> void intel_wait_ddi_buf_idle(struct drm_i915_private *dev_priv,
> enum port port);
> -void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port);
> +void intel_ddi_init(struct drm_i915_private *dev_priv,
> + const struct intel_bios_encoder_data *devdata,
> + enum port port);
> bool intel_ddi_get_hw_state(struct intel_encoder *encoder, enum pipe *pipe);
> void intel_ddi_enable_transcoder_func(struct intel_encoder *encoder,
> const struct intel_crtc_state *crtc_state);
> diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
> index 43d6ba980780..836d3a1c797a 100644
> --- a/drivers/gpu/drm/i915/display/intel_display.c
> +++ b/drivers/gpu/drm/i915/display/intel_display.c
> @@ -53,7 +53,6 @@
> #include "i915_utils.h"
> #include "i9xx_plane.h"
> #include "i9xx_wm.h"
> -#include "icl_dsi.h"
> #include "intel_atomic.h"
> #include "intel_atomic_plane.h"
> #include "intel_audio.h"
> @@ -7409,18 +7408,10 @@ void intel_setup_outputs(struct drm_i915_private *dev_priv)
> return;
>
> if (HAS_DDI(dev_priv)) {
> - enum port port;
> -
> if (intel_ddi_crt_present(dev_priv))
> intel_crt_init(dev_priv);
>
> - for_each_port_masked(port, DISPLAY_RUNTIME_INFO(dev_priv)->port_mask)
Do we now lose the VBT port cross-check against ->port_mask? Or do we
rely all encoder inits to call assert_port_valid()?
> - intel_ddi_init(dev_priv, port);
> -
> - /* FIXME do something about DSI */
> - if (IS_ALDERLAKE_P(dev_priv) || IS_TIGERLAKE(dev_priv) ||
> - DISPLAY_VER(dev_priv) == 11)
> - icl_dsi_init(dev_priv);
> + intel_bios_for_each_encoder(dev_priv, intel_ddi_init);
>
> if (IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv))
> vlv_dsi_init(dev_priv);
> diff --git a/drivers/gpu/drm/i915/display/intel_display_core.h b/drivers/gpu/drm/i915/display/intel_display_core.h
> index 8d2243c71dd8..56c596ca7cbf 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_core.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_core.h
> @@ -33,7 +33,6 @@ struct i915_audio_component;
> struct i915_hdcp_arbiter;
> struct intel_atomic_state;
> struct intel_audio_funcs;
> -struct intel_bios_encoder_data;
> struct intel_cdclk_funcs;
> struct intel_cdclk_vals;
> struct intel_color_funcs;
> @@ -218,7 +217,6 @@ struct intel_vbt_data {
> struct list_head display_devices;
> struct list_head bdb_blocks;
>
> - struct intel_bios_encoder_data *ports[I915_MAX_PORTS]; /* Non-NULL if port present. */
> struct sdvo_device_mapping {
> u8 initialized;
> u8 dvo_port;
--
Jani Nikula, Intel Open Source Graphics Center
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [Intel-gfx] [PATCH v2 3/5] drm/i915: Remove DDC pin sanitation
2023-06-21 7:56 ` Jani Nikula
@ 2023-06-29 14:04 ` Ville Syrjälä
0 siblings, 0 replies; 19+ messages in thread
From: Ville Syrjälä @ 2023-06-29 14:04 UTC (permalink / raw)
To: Jani Nikula; +Cc: intel-gfx
On Wed, Jun 21, 2023 at 10:56:14AM +0300, Jani Nikula wrote:
> On Tue, 20 Jun 2023, Ville Syrjala <ville.syrjala@linux.intel.com> wrote:
> > From: Ville Syrjälä <ville.syrjala@linux.intel.com>
> >
> > Stop with the VBT DDC pin sanitation, and instead just check
> > that the appropriate DDC pin is still available when initializing
> > a HDMI connector.
>
> Could be more verbose about the why here.
>
> > Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> > ---
> > drivers/gpu/drm/i915/display/intel_bios.c | 69 ----------------------
> > drivers/gpu/drm/i915/display/intel_hdmi.c | 72 +++++++++++++++++++----
> > 2 files changed, 59 insertions(+), 82 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/i915/display/intel_bios.c b/drivers/gpu/drm/i915/display/intel_bios.c
> > index 34a397adbd6b..439ab5b3cbe5 100644
> > --- a/drivers/gpu/drm/i915/display/intel_bios.c
> > +++ b/drivers/gpu/drm/i915/display/intel_bios.c
> > @@ -2230,72 +2230,6 @@ static u8 map_ddc_pin(struct drm_i915_private *i915, u8 vbt_pin)
> > return 0;
> > }
> >
> > -static enum port get_port_by_ddc_pin(struct drm_i915_private *i915, u8 ddc_pin)
> > -{
> > - enum port port;
> > -
> > - if (!ddc_pin)
> > - return PORT_NONE;
> > -
> > - for_each_port(port) {
> > - const struct intel_bios_encoder_data *devdata =
> > - i915->display.vbt.ports[port];
> > -
> > - if (devdata && ddc_pin == devdata->child.ddc_pin)
> > - return port;
> > - }
> > -
> > - return PORT_NONE;
> > -}
> > -
> > -static void sanitize_ddc_pin(struct intel_bios_encoder_data *devdata,
> > - enum port port)
> > -{
> > - struct drm_i915_private *i915 = devdata->i915;
> > - struct child_device_config *child;
> > - u8 mapped_ddc_pin;
> > - enum port p;
> > -
> > - if (!devdata->child.ddc_pin)
> > - return;
> > -
> > - mapped_ddc_pin = map_ddc_pin(i915, devdata->child.ddc_pin);
> > - if (!intel_gmbus_is_valid_pin(i915, mapped_ddc_pin)) {
> > - drm_dbg_kms(&i915->drm,
> > - "Port %c has invalid DDC pin %d, "
> > - "sticking to defaults\n",
> > - port_name(port), mapped_ddc_pin);
> > - devdata->child.ddc_pin = 0;
> > - return;
> > - }
> > -
> > - p = get_port_by_ddc_pin(i915, devdata->child.ddc_pin);
> > - if (p == PORT_NONE)
> > - return;
> > -
> > - drm_dbg_kms(&i915->drm,
> > - "port %c trying to use the same DDC pin (0x%x) as port %c, "
> > - "disabling port %c DVI/HDMI support\n",
> > - port_name(port), mapped_ddc_pin,
> > - port_name(p), port_name(p));
> > -
> > - /*
> > - * If we have multiple ports supposedly sharing the pin, then dvi/hdmi
> > - * couldn't exist on the shared port. Otherwise they share the same ddc
> > - * pin and system couldn't communicate with them separately.
> > - *
> > - * Give inverse child device order the priority, last one wins. Yes,
> > - * there are real machines (eg. Asrock B250M-HDV) where VBT has both
> > - * port A and port E with the same AUX ch and we must pick port E :(
> > - */
>
> The priority order gets changed, right? Needs explanation.
>
> > - child = &i915->display.vbt.ports[p]->child;
> > -
> > - child->device_type &= ~DEVICE_TYPE_TMDS_DVI_SIGNALING;
> > - child->device_type |= DEVICE_TYPE_NOT_HDMI_OUTPUT;
> > -
> > - child->ddc_pin = 0;
> > -}
> > -
> > static enum port get_port_by_aux_ch(struct drm_i915_private *i915, u8 aux_ch)
> > {
> > enum port port;
> > @@ -2753,9 +2687,6 @@ static void parse_ddi_port(struct intel_bios_encoder_data *devdata)
> >
> > sanitize_device_type(devdata, port);
> >
> > - if (intel_bios_encoder_supports_dvi(devdata))
> > - sanitize_ddc_pin(devdata, port);
> > -
> > if (intel_bios_encoder_supports_dp(devdata))
> > sanitize_aux_ch(devdata, port);
> >
> > diff --git a/drivers/gpu/drm/i915/display/intel_hdmi.c b/drivers/gpu/drm/i915/display/intel_hdmi.c
> > index 7ac5e6c5e00d..8d1c8abfcffa 100644
> > --- a/drivers/gpu/drm/i915/display/intel_hdmi.c
> > +++ b/drivers/gpu/drm/i915/display/intel_hdmi.c
> > @@ -2880,21 +2880,12 @@ static u8 g4x_port_to_ddc_pin(struct drm_i915_private *dev_priv,
> > return ddc_pin;
> > }
> >
> > -static u8 intel_hdmi_ddc_pin(struct intel_encoder *encoder)
> > +static u8 intel_hdmi_default_ddc_pin(struct intel_encoder *encoder)
> > {
> > struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
> > enum port port = encoder->port;
> > u8 ddc_pin;
> >
> > - ddc_pin = intel_bios_hdmi_ddc_pin(encoder->devdata);
> > - if (ddc_pin) {
> > - drm_dbg_kms(&dev_priv->drm,
> > - "[ENCODER:%d:%s] Using DDC pin 0x%x (VBT)\n",
> > - encoder->base.base.id, encoder->base.name,
> > - ddc_pin);
> > - return ddc_pin;
> > - }
> > -
> > if (IS_ALDERLAKE_S(dev_priv))
> > ddc_pin = adls_port_to_ddc_pin(dev_priv, port);
> > else if (INTEL_PCH_TYPE(dev_priv) >= PCH_DG1)
> > @@ -2916,10 +2907,62 @@ static u8 intel_hdmi_ddc_pin(struct intel_encoder *encoder)
> > else
> > ddc_pin = g4x_port_to_ddc_pin(dev_priv, port);
> >
> > - drm_dbg_kms(&dev_priv->drm,
> > - "[ENCODER:%d:%s] Using DDC pin 0x%x (platform default)\n",
> > + return ddc_pin;
> > +}
> > +
> > +static struct intel_encoder *
> > +get_encoder_by_ddc_pin(struct intel_encoder *encoder, u8 ddc_pin)
> > +{
> > + struct drm_i915_private *i915 = to_i915(encoder->base.dev);
> > + struct intel_encoder *other;
> > +
> > + for_each_intel_encoder(&i915->drm, other) {
> > + if (other == encoder)
> > + continue;
> > +
> > + if (!intel_encoder_is_dig_port(other))
> > + continue;
> > +
> > + if (enc_to_dig_port(other)->hdmi.ddc_bus == ddc_pin)
> > + return other;
> > + }
> > +
> > + return NULL;
> > +}
> > +
> > +static u8 intel_hdmi_ddc_pin(struct intel_encoder *encoder)
> > +{
> > + struct drm_i915_private *i915 = to_i915(encoder->base.dev);
> > + struct intel_encoder *other;
> > + const char *source;
> > + u8 ddc_pin;
> > +
> > + ddc_pin = intel_bios_hdmi_ddc_pin(encoder->devdata);
> > + source = "VBT";
> > +
> > + if (!ddc_pin) {
> > + ddc_pin = intel_hdmi_default_ddc_pin(encoder);
> > + source = "platform default";
> > + }
> > +
> > + if (!intel_gmbus_is_valid_pin(i915, ddc_pin)) {
> > + drm_dbg_kms(&i915->drm, "[ENCODER:%d:%s] Invalid DDC pin %d\n",
> > + encoder->base.base.id, encoder->base.name, ddc_pin);
> > + return 0;
> > + }
>
> The existing code checks the vbt ddc pin for validity, and if it's
> invalid, falls back to platform default.
>
> The above skips the platform default fallback if vbt has invalid but
> non-zero ddc pin.
>
> I'm not sure if it really matters, but at the very least deserves a
> mention in the commit message.
Right. That one is subtle enough detail that I missed it myself.
>
>
> BR,
> Jani.
>
>
> > +
> > + other = get_encoder_by_ddc_pin(encoder, ddc_pin);
> > + if (other) {
> > + drm_dbg_kms(&i915->drm, "[ENCODER:%d:%s] DDC pin %d already claimed by [ENCODER:%d:%s]\n",
> > + encoder->base.base.id, encoder->base.name, ddc_pin,
> > + other->base.base.id, other->base.name);
> > + return 0;
> > + }
> > +
> > + drm_dbg_kms(&i915->drm,
> > + "[ENCODER:%d:%s] Using DDC pin 0x%x (%s)\n",
> > encoder->base.base.id, encoder->base.name,
> > - ddc_pin);
> > + ddc_pin, source);
> >
> > return ddc_pin;
> > }
> > @@ -2990,6 +3033,9 @@ void intel_hdmi_init_connector(struct intel_digital_port *dig_port,
> > return;
> >
> > intel_hdmi->ddc_bus = intel_hdmi_ddc_pin(intel_encoder);
> > + if (!intel_hdmi->ddc_bus)
> > + return;
> > +
> > ddc = intel_gmbus_get_adapter(dev_priv, intel_hdmi->ddc_bus);
> >
> > drm_connector_init_with_ddc(dev, connector,
>
> --
> Jani Nikula, Intel Open Source Graphics Center
--
Ville Syrjälä
Intel
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [Intel-gfx] [PATCH v2 5/5] drm/i915: Try to initialize DDI/ICL+ DSI ports for every VBT child device
2023-06-26 13:06 ` Jani Nikula
@ 2023-06-29 14:13 ` Ville Syrjälä
0 siblings, 0 replies; 19+ messages in thread
From: Ville Syrjälä @ 2023-06-29 14:13 UTC (permalink / raw)
To: Jani Nikula; +Cc: intel-gfx
On Mon, Jun 26, 2023 at 04:06:00PM +0300, Jani Nikula wrote:
> On Tue, 20 Jun 2023, Ville Syrjala <ville.syrjala@linux.intel.com> wrote:
> > From: Ville Syrjälä <ville.syrjala@linux.intel.com>
> >
> > Try to deal with duplicate child devices for the same DDI port
> > by attempting to initialize them in VBT defined order The first
> > on to succeed for a specific DDI port will be the one we use.
> >
> > We'll also get rid of i915->display.vbt.ports[] here as any conflicts
> > will now be handled at encoder registration time rather than during
> > VBT parsing. Note that intel_bios_encoder_data_lookup() still remaims
> > for pre-DDI DP/HDMI ports as those don't (at least yet) use VBT
> > driven initialization.
> >
> > TODO: DSI dual link handling is sketchy at best
>
> The second DSI link isn't listed as a child device, is it? Just the
> first, it'll have to be the "lower" port, and the second one is implicit
> based on dual link usage.
I'm not 100% sure it's always the lower port. Looks like both the
vlv and icl DSI code just checks for dual link and sets the port
mask up with both ports.
Also I think we have a bit of a chicken vs. egg issue here as we
haven't yet called intel_bios_init_panel_late() and this don't even
know if the current port is dual link or not. So I suppose we could
easily check both ports for any dual link DSI encoders we already
registered, but can't check it for the encoder we're currently
trying to initialize. So this probably needs a bunch of extra work
to properly figure out.
>
> >
> > Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> > ---
> > drivers/gpu/drm/i915/display/icl_dsi.c | 11 ++--
> > drivers/gpu/drm/i915/display/icl_dsi.h | 6 +-
> > drivers/gpu/drm/i915/display/intel_bios.c | 65 ++++++++++++++-----
> > drivers/gpu/drm/i915/display/intel_bios.h | 6 ++
> > drivers/gpu/drm/i915/display/intel_ddi.c | 49 +++++++++++---
> > drivers/gpu/drm/i915/display/intel_ddi.h | 5 +-
> > drivers/gpu/drm/i915/display/intel_display.c | 11 +---
> > .../gpu/drm/i915/display/intel_display_core.h | 2 -
> > 8 files changed, 107 insertions(+), 48 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/i915/display/icl_dsi.c b/drivers/gpu/drm/i915/display/icl_dsi.c
> > index 59a2a289d9be..475f4f587c79 100644
> > --- a/drivers/gpu/drm/i915/display/icl_dsi.c
> > +++ b/drivers/gpu/drm/i915/display/icl_dsi.c
> > @@ -1933,16 +1933,14 @@ static void icl_dsi_add_properties(struct intel_connector *connector)
> > fixed_mode->vdisplay);
> > }
> >
> > -void icl_dsi_init(struct drm_i915_private *dev_priv)
> > +void icl_dsi_init(struct drm_i915_private *dev_priv,
> > + const struct intel_bios_encoder_data *devdata,
> > + enum port port)
> > {
> > struct intel_dsi *intel_dsi;
> > struct intel_encoder *encoder;
> > struct intel_connector *intel_connector;
> > struct drm_connector *connector;
> > - enum port port;
> > -
> > - if (!intel_bios_is_dsi_present(dev_priv, &port))
> > - return;
> >
> > intel_dsi = kzalloc(sizeof(*intel_dsi), GFP_KERNEL);
> > if (!intel_dsi)
> > @@ -1958,6 +1956,8 @@ void icl_dsi_init(struct drm_i915_private *dev_priv)
> > intel_dsi->attached_connector = intel_connector;
> > connector = &intel_connector->base;
> >
> > + encoder->devdata = devdata;
> > +
> > /* register DSI encoder with DRM subsystem */
> > drm_encoder_init(&dev_priv->drm, &encoder->base, &gen11_dsi_encoder_funcs,
> > DRM_MODE_ENCODER_DSI, "DSI %c", port_name(port));
> > @@ -1995,7 +1995,6 @@ void icl_dsi_init(struct drm_i915_private *dev_priv)
> >
> > intel_dsi->panel_power_off_time = ktime_get_boottime();
> >
> > - encoder->devdata = intel_bios_encoder_data_lookup(dev_priv, port);
> > intel_bios_init_panel_late(dev_priv, &intel_connector->panel, encoder->devdata, NULL);
> >
> > mutex_lock(&dev_priv->drm.mode_config.mutex);
> > diff --git a/drivers/gpu/drm/i915/display/icl_dsi.h b/drivers/gpu/drm/i915/display/icl_dsi.h
> > index b4861b56b5b2..ac42f2dc21ec 100644
> > --- a/drivers/gpu/drm/i915/display/icl_dsi.h
> > +++ b/drivers/gpu/drm/i915/display/icl_dsi.h
> > @@ -6,10 +6,14 @@
> > #ifndef __ICL_DSI_H__
> > #define __ICL_DSI_H__
> >
> > +enum port;
> > struct drm_i915_private;
> > +struct intel_bios_encoder_data;
> > struct intel_crtc_state;
> >
> > -void icl_dsi_init(struct drm_i915_private *i915);
> > +void icl_dsi_init(struct drm_i915_private *i915,
> > + const struct intel_bios_encoder_data *devdata,
> > + enum port port);
> > void icl_dsi_frame_update(struct intel_crtc_state *crtc_state);
> >
> > #endif /* __ICL_DSI_H__ */
> > diff --git a/drivers/gpu/drm/i915/display/intel_bios.c b/drivers/gpu/drm/i915/display/intel_bios.c
> > index d1bf725ee9b3..7d2e843681f3 100644
> > --- a/drivers/gpu/drm/i915/display/intel_bios.c
> > +++ b/drivers/gpu/drm/i915/display/intel_bios.c
> > @@ -2484,7 +2484,7 @@ intel_bios_encoder_supports_edp(const struct intel_bios_encoder_data *devdata)
> > devdata->child.device_type & DEVICE_TYPE_INTERNAL_CONNECTOR;
> > }
> >
> > -static bool
> > +bool
> > intel_bios_encoder_supports_dsi(const struct intel_bios_encoder_data *devdata)
> > {
> > return devdata->child.device_type & DEVICE_TYPE_MIPI_OUTPUT;
> > @@ -2542,13 +2542,19 @@ static bool is_port_valid(struct drm_i915_private *i915, enum port port)
> > return true;
> > }
> >
> > -static void print_ddi_port(const struct intel_bios_encoder_data *devdata,
> > - enum port port)
> > +static void print_ddi_port(const struct intel_bios_encoder_data *devdata)
> > {
> > struct drm_i915_private *i915 = devdata->i915;
> > const struct child_device_config *child = &devdata->child;
> > bool is_dvi, is_hdmi, is_dp, is_edp, is_dsi, is_crt, supports_typec_usb, supports_tbt;
> > int dp_boost_level, dp_max_link_rate, hdmi_boost_level, hdmi_level_shift, max_tmds_clock;
> > + enum port port;
> > +
> > + port = dvo_port_to_port(i915, child->dvo_port);
> > + if (port == PORT_NONE && DISPLAY_VER(i915) >= 11)
> > + port = dsi_dvo_port_to_port(i915, child->dvo_port);
> > + if (port == PORT_NONE)
> > + return;
> >
> > is_dvi = intel_bios_encoder_supports_dvi(devdata);
> > is_dp = intel_bios_encoder_supports_dp(devdata);
> > @@ -2628,16 +2634,7 @@ static void parse_ddi_port(struct intel_bios_encoder_data *devdata)
> > return;
> > }
> >
> > - if (i915->display.vbt.ports[port]) {
> > - drm_dbg_kms(&i915->drm,
> > - "More than one child device for port %c in VBT, using the first.\n",
> > - port_name(port));
> > - return;
> > - }
> > -
> > sanitize_device_type(devdata, port);
> > -
> > - i915->display.vbt.ports[port] = devdata;
> > }
> >
> > static bool has_ddi_port_info(struct drm_i915_private *i915)
> > @@ -2648,7 +2645,6 @@ static bool has_ddi_port_info(struct drm_i915_private *i915)
> > static void parse_ddi_ports(struct drm_i915_private *i915)
> > {
> > struct intel_bios_encoder_data *devdata;
> > - enum port port;
> >
> > if (!has_ddi_port_info(i915))
> > return;
> > @@ -2656,10 +2652,8 @@ static void parse_ddi_ports(struct drm_i915_private *i915)
> > list_for_each_entry(devdata, &i915->display.vbt.display_devices, node)
> > parse_ddi_port(devdata);
> >
> > - for_each_port(port) {
> > - if (i915->display.vbt.ports[port])
> > - print_ddi_port(i915->display.vbt.ports[port], port);
> > - }
> > + list_for_each_entry(devdata, &i915->display.vbt.display_devices, node)
> > + print_ddi_port(devdata);
> > }
> >
> > static void
> > @@ -3584,5 +3578,40 @@ bool intel_bios_encoder_hpd_invert(const struct intel_bios_encoder_data *devdata
> > const struct intel_bios_encoder_data *
> > intel_bios_encoder_data_lookup(struct drm_i915_private *i915, enum port port)
> > {
> > - return i915->display.vbt.ports[port];
> > + struct intel_bios_encoder_data *devdata;
> > +
> > + list_for_each_entry(devdata, &i915->display.vbt.display_devices, node) {
> > + const struct child_device_config *child = &devdata->child;
> > + enum port p;
> > +
> > + p = dvo_port_to_port(i915, child->dvo_port);
> > + if (p == PORT_NONE && DISPLAY_VER(i915) >= 11)
> > + p = dsi_dvo_port_to_port(i915, child->dvo_port);
> > +
> > + if (p == port)
> > + return devdata;
> > + }
> > +
> > + return NULL;
> > +}
> > +
> > +void intel_bios_for_each_encoder(struct drm_i915_private *i915,
> > + void (*func)(struct drm_i915_private *i915,
> > + const struct intel_bios_encoder_data *devdata,
> > + enum port port))
> > +{
> > + struct intel_bios_encoder_data *devdata;
> > +
> > + list_for_each_entry(devdata, &i915->display.vbt.display_devices, node) {
> > + const struct child_device_config *child = &devdata->child;
> > + enum port port;
> > +
> > + port = dvo_port_to_port(i915, child->dvo_port);
> > + if (port == PORT_NONE && DISPLAY_VER(i915) >= 11)
> > + port = dsi_dvo_port_to_port(i915, child->dvo_port);
> > + if (port == PORT_NONE)
> > + continue;
>
> Looks like at least three places would benefit from a
> intel_bios_encoder_port() function that would do the above.
>
> Maybe we wouldn't even need to pass the port to the callback, it could
> dig the port out itself?
Sure, that works. I'll switch to that.
>
> > +
> > + func(i915, devdata, port);
> > + }
> > }
> > diff --git a/drivers/gpu/drm/i915/display/intel_bios.h b/drivers/gpu/drm/i915/display/intel_bios.h
> > index 45fae97d9719..fdc847211a84 100644
> > --- a/drivers/gpu/drm/i915/display/intel_bios.h
> > +++ b/drivers/gpu/drm/i915/display/intel_bios.h
> > @@ -263,6 +263,7 @@ bool intel_bios_encoder_supports_dp(const struct intel_bios_encoder_data *devdat
> > bool intel_bios_encoder_supports_edp(const struct intel_bios_encoder_data *devdata);
> > bool intel_bios_encoder_supports_typec_usb(const struct intel_bios_encoder_data *devdata);
> > bool intel_bios_encoder_supports_tbt(const struct intel_bios_encoder_data *devdata);
> > +bool intel_bios_encoder_supports_dsi(const struct intel_bios_encoder_data *devdata);
> > bool intel_bios_encoder_supports_dp_dual_mode(const struct intel_bios_encoder_data *devdata);
> > bool intel_bios_encoder_is_lspcon(const struct intel_bios_encoder_data *devdata);
> > bool intel_bios_encoder_lane_reversal(const struct intel_bios_encoder_data *devdata);
> > @@ -276,4 +277,9 @@ int intel_bios_hdmi_ddc_pin(const struct intel_bios_encoder_data *devdata);
> > int intel_bios_hdmi_level_shift(const struct intel_bios_encoder_data *devdata);
> > int intel_bios_hdmi_max_tmds_clock(const struct intel_bios_encoder_data *devdata);
> >
> > +void intel_bios_for_each_encoder(struct drm_i915_private *i915,
> > + void (*func)(struct drm_i915_private *i915,
> > + const struct intel_bios_encoder_data *devdata,
> > + enum port port));
> > +
> > #endif /* _INTEL_BIOS_H_ */
> > diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c
> > index 9e4e6482aa26..7bfcd52e4645 100644
> > --- a/drivers/gpu/drm/i915/display/intel_ddi.c
> > +++ b/drivers/gpu/drm/i915/display/intel_ddi.c
> > @@ -32,6 +32,7 @@
> >
> > #include "i915_drv.h"
> > #include "i915_reg.h"
> > +#include "icl_dsi.h"
> > #include "intel_audio.h"
> > #include "intel_audio_regs.h"
> > #include "intel_backlight.h"
> > @@ -4684,11 +4685,32 @@ static bool need_aux_ch(struct intel_encoder *encoder, bool init_dp)
> > return init_dp || intel_phy_is_tc(i915, phy);
> > }
> >
> > -void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)
> > +static bool assert_has_icl_dsi(struct drm_i915_private *i915)
> > +{
> > + return !drm_WARN(&i915->drm, !IS_ALDERLAKE_P(i915) &&
> > + !IS_TIGERLAKE(i915) && DISPLAY_VER(i915) != 11,
> > + "Platform does not support DSI\n");
> > +}
> > +
> > +static bool port_in_use(struct drm_i915_private *i915, enum port port)
> > +{
> > + struct intel_encoder *encoder;
> > +
> > + for_each_intel_encoder(&i915->drm, encoder) {
> > + /* FIXME what about second port for dual link DSI? */
> > + if (encoder->port == port)
> > + return true;
> > + }
> > +
> > + return false;
> > +}
> > +
> > +void intel_ddi_init(struct drm_i915_private *dev_priv,
> > + const struct intel_bios_encoder_data *devdata,
> > + enum port port)
> > {
> > struct intel_digital_port *dig_port;
> > struct intel_encoder *encoder;
> > - const struct intel_bios_encoder_data *devdata;
> > bool init_hdmi, init_dp;
> > enum phy phy = intel_port_to_phy(dev_priv, port);
> >
> > @@ -4701,6 +4723,21 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)
> > if (!assert_port_valid(dev_priv, port))
> > return;
> >
> > + if (port_in_use(dev_priv, port)) {
> > + drm_dbg_kms(&dev_priv->drm,
> > + "Port %c already claimed\n", port_name(port));
> > + return;
> > + }
> > +
> > + if (intel_bios_encoder_supports_dsi(devdata)) {
> > + /* BXT/GLK handled elsewhere, for now at least */
> > + if (!assert_has_icl_dsi(dev_priv))
> > + return;
> > +
> > + icl_dsi_init(dev_priv, devdata, port);
> > + return;
> > + }
>
> Maybe the division of responsibilities above is fine for starters... but
> feels like if we're going to convert more platforms/outputs to this, we
> should have a separate function near intel_setup_outputs() that gets
> passed to intel_bios_for_each_encoder() that chooses the encoder
> function to call?
Perhaps. I need to ponder more about the pre-DDI stuff at some point.
I have an old branch that reworks the output setup for those quite
a bit, but that didn't go as far as switching to pure VBT based init.
Maybe I'll try to land that series first at some point, and then think
more about the VBT based stuff.
>
> > +
> > /*
> > * On platforms with HTI (aka HDPORT), if it's enabled at boot it may
> > * have taken over some of the PHYs and made them unavailable to the
> > @@ -4713,14 +4750,6 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)
> > return;
> > }
> >
> > - devdata = intel_bios_encoder_data_lookup(dev_priv, port);
> > - if (!devdata) {
> > - drm_dbg_kms(&dev_priv->drm,
> > - "VBT says port %c is not present\n",
> > - port_name(port));
> > - return;
> > - }
> > -
> > init_hdmi = intel_bios_encoder_supports_dvi(devdata) ||
> > intel_bios_encoder_supports_hdmi(devdata);
> > init_dp = intel_bios_encoder_supports_dp(devdata);
> > diff --git a/drivers/gpu/drm/i915/display/intel_ddi.h b/drivers/gpu/drm/i915/display/intel_ddi.h
> > index 2bc034042a93..10d586b0a9c0 100644
> > --- a/drivers/gpu/drm/i915/display/intel_ddi.h
> > +++ b/drivers/gpu/drm/i915/display/intel_ddi.h
> > @@ -11,6 +11,7 @@
> > struct drm_connector_state;
> > struct drm_i915_private;
> > struct intel_atomic_state;
> > +struct intel_bios_encoder_data;
> > struct intel_connector;
> > struct intel_crtc;
> > struct intel_crtc_state;
> > @@ -50,7 +51,9 @@ void hsw_prepare_dp_ddi_buffers(struct intel_encoder *encoder,
> > const struct intel_crtc_state *crtc_state);
> > void intel_wait_ddi_buf_idle(struct drm_i915_private *dev_priv,
> > enum port port);
> > -void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port);
> > +void intel_ddi_init(struct drm_i915_private *dev_priv,
> > + const struct intel_bios_encoder_data *devdata,
> > + enum port port);
> > bool intel_ddi_get_hw_state(struct intel_encoder *encoder, enum pipe *pipe);
> > void intel_ddi_enable_transcoder_func(struct intel_encoder *encoder,
> > const struct intel_crtc_state *crtc_state);
> > diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
> > index 43d6ba980780..836d3a1c797a 100644
> > --- a/drivers/gpu/drm/i915/display/intel_display.c
> > +++ b/drivers/gpu/drm/i915/display/intel_display.c
> > @@ -53,7 +53,6 @@
> > #include "i915_utils.h"
> > #include "i9xx_plane.h"
> > #include "i9xx_wm.h"
> > -#include "icl_dsi.h"
> > #include "intel_atomic.h"
> > #include "intel_atomic_plane.h"
> > #include "intel_audio.h"
> > @@ -7409,18 +7408,10 @@ void intel_setup_outputs(struct drm_i915_private *dev_priv)
> > return;
> >
> > if (HAS_DDI(dev_priv)) {
> > - enum port port;
> > -
> > if (intel_ddi_crt_present(dev_priv))
> > intel_crt_init(dev_priv);
> >
> > - for_each_port_masked(port, DISPLAY_RUNTIME_INFO(dev_priv)->port_mask)
>
> Do we now lose the VBT port cross-check against ->port_mask? Or do we
> rely all encoder inits to call assert_port_valid()?
I figured assert_port_valid() will cover us.
>
> > - intel_ddi_init(dev_priv, port);
> > -
> > - /* FIXME do something about DSI */
> > - if (IS_ALDERLAKE_P(dev_priv) || IS_TIGERLAKE(dev_priv) ||
> > - DISPLAY_VER(dev_priv) == 11)
> > - icl_dsi_init(dev_priv);
> > + intel_bios_for_each_encoder(dev_priv, intel_ddi_init);
> >
> > if (IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv))
> > vlv_dsi_init(dev_priv);
> > diff --git a/drivers/gpu/drm/i915/display/intel_display_core.h b/drivers/gpu/drm/i915/display/intel_display_core.h
> > index 8d2243c71dd8..56c596ca7cbf 100644
> > --- a/drivers/gpu/drm/i915/display/intel_display_core.h
> > +++ b/drivers/gpu/drm/i915/display/intel_display_core.h
> > @@ -33,7 +33,6 @@ struct i915_audio_component;
> > struct i915_hdcp_arbiter;
> > struct intel_atomic_state;
> > struct intel_audio_funcs;
> > -struct intel_bios_encoder_data;
> > struct intel_cdclk_funcs;
> > struct intel_cdclk_vals;
> > struct intel_color_funcs;
> > @@ -218,7 +217,6 @@ struct intel_vbt_data {
> > struct list_head display_devices;
> > struct list_head bdb_blocks;
> >
> > - struct intel_bios_encoder_data *ports[I915_MAX_PORTS]; /* Non-NULL if port present. */
> > struct sdvo_device_mapping {
> > u8 initialized;
> > u8 dvo_port;
>
> --
> Jani Nikula, Intel Open Source Graphics Center
--
Ville Syrjälä
Intel
^ permalink raw reply [flat|nested] 19+ messages in thread
end of thread, other threads:[~2023-06-29 14:23 UTC | newest]
Thread overview: 19+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-06-20 17:32 [Intel-gfx] [PATCH v2 0/5] drm/i915: Init DDI ports in VBT order Ville Syrjala
2023-06-20 17:32 ` [Intel-gfx] [PATCH v2 1/5] drm/i915: Initialize dig_port->aux_ch to NONE to be sure Ville Syrjala
2023-06-21 7:44 ` Jani Nikula
2023-06-20 17:32 ` [Intel-gfx] [PATCH v2 2/5] drm/i915: Only populate aux_ch is really needed Ville Syrjala
2023-06-21 7:46 ` Jani Nikula
2023-06-21 7:47 ` Jani Nikula
2023-06-20 17:32 ` [Intel-gfx] [PATCH v2 3/5] drm/i915: Remove DDC pin sanitation Ville Syrjala
2023-06-21 7:56 ` Jani Nikula
2023-06-29 14:04 ` Ville Syrjälä
2023-06-20 17:32 ` [Intel-gfx] [PATCH v2 4/5] drm/i915: Remove AUX CH sanitation Ville Syrjala
2023-06-21 8:00 ` Jani Nikula
2023-06-21 13:13 ` Ville Syrjälä
2023-06-20 17:32 ` [Intel-gfx] [PATCH v2 5/5] drm/i915: Try to initialize DDI/ICL+ DSI ports for every VBT child device Ville Syrjala
2023-06-26 13:06 ` Jani Nikula
2023-06-29 14:13 ` Ville Syrjälä
2023-06-20 21:30 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for drm/i915: Init DDI ports in VBT order (rev4) Patchwork
2023-06-20 21:30 ` [Intel-gfx] ✗ Fi.CI.SPARSE: " Patchwork
2023-06-20 21:44 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork
2023-06-21 5:42 ` [Intel-gfx] ✓ Fi.CI.IGT: " Patchwork
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox