* [Intel-gfx] [PATCH v8 0/8] drm/edid: info & modes parsing and drm_edid refactors
@ 2023-01-19 16:18 Jani Nikula
2023-01-19 16:18 ` [Intel-gfx] [PATCH v8 1/8] drm/edid: split HDMI VSDB info and mode parsing Jani Nikula
` (9 more replies)
0 siblings, 10 replies; 18+ messages in thread
From: Jani Nikula @ 2023-01-19 16:18 UTC (permalink / raw)
To: intel-gfx, dri-devel; +Cc: jani.nikula
A bunch of patches merged, thanks to Ville's review, here's another spin
to get CI on the updated patch 1. The rest remain unchanged.
Jani Nikula (8):
drm/edid: split HDMI VSDB info and mode parsing
drm/edid: refactor _drm_edid_connector_update() and rename
drm/edid: add separate drm_edid_connector_add_modes()
drm/edid: remove redundant _drm_connector_update_edid_property()
drm/i915/edid: convert DP, HDMI and LVDS to drm_edid
drm/i915/bios: convert intel_bios_init_panel() to drm_edid
drm/i915/opregion: convert intel_opregion_get_edid() to struct
drm_edid
drm/i915/panel: move panel fixed EDID to struct intel_panel
drivers/gpu/drm/drm_edid.c | 93 +++++++++++--------
drivers/gpu/drm/drm_probe_helper.c | 4 +-
drivers/gpu/drm/i915/display/icl_dsi.c | 2 +-
drivers/gpu/drm/i915/display/intel_bios.c | 23 ++---
drivers/gpu/drm/i915/display/intel_bios.h | 4 +-
.../gpu/drm/i915/display/intel_connector.c | 5 +-
.../drm/i915/display/intel_display_types.h | 8 +-
drivers/gpu/drm/i915/display/intel_dp.c | 91 +++++++++---------
drivers/gpu/drm/i915/display/intel_dvo.c | 2 +-
drivers/gpu/drm/i915/display/intel_hdmi.c | 28 +++---
drivers/gpu/drm/i915/display/intel_lvds.c | 51 ++++++----
drivers/gpu/drm/i915/display/intel_opregion.c | 29 +++---
drivers/gpu/drm/i915/display/intel_opregion.h | 4 +-
drivers/gpu/drm/i915/display/intel_panel.c | 10 +-
drivers/gpu/drm/i915/display/intel_panel.h | 4 +-
drivers/gpu/drm/i915/display/intel_sdvo.c | 2 +-
drivers/gpu/drm/i915/display/vlv_dsi.c | 2 +-
include/drm/drm_edid.h | 2 +
18 files changed, 201 insertions(+), 163 deletions(-)
--
2.34.1
^ permalink raw reply [flat|nested] 18+ messages in thread
* [Intel-gfx] [PATCH v8 1/8] drm/edid: split HDMI VSDB info and mode parsing
2023-01-19 16:18 [Intel-gfx] [PATCH v8 0/8] drm/edid: info & modes parsing and drm_edid refactors Jani Nikula
@ 2023-01-19 16:18 ` Jani Nikula
2023-01-19 16:18 ` [Intel-gfx] [PATCH v8 2/8] drm/edid: refactor _drm_edid_connector_update() and rename Jani Nikula
` (8 subsequent siblings)
9 siblings, 0 replies; 18+ messages in thread
From: Jani Nikula @ 2023-01-19 16:18 UTC (permalink / raw)
To: intel-gfx, dri-devel; +Cc: jani.nikula
Separate the parsing of display info and modes from the HDMI VSDB. This
is prerequisite work for overall better separation of the two parsing
steps.
The info parsing is about figuring out whether the sink supports HDMI
infoframes. Since they were added in HDMI 1.4, assume the sink supports
HDMI infoframes if it has the HDMI_Video_present bit set (introduced in
HDMI 1.4). For details, see commit f1781e9bb2dd ("drm/edid: Allow HDMI
infoframe without VIC or S3D").
The logic is not exactly the same, but since it was somewhat heuristic
to begin with, assume this is close enough.
v2:
- Simplify to only check HDMI_Video_present bit (Ville)
- Drop cea_db_raw_size() helper (Ville)
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/drm_edid.c | 13 ++++++++++---
1 file changed, 10 insertions(+), 3 deletions(-)
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index e8b67f3f5c91..ee453e39562a 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -4713,7 +4713,6 @@ static int hdmi_vsdb_latency_length(const u8 *db)
static int
do_hdmi_vsdb_modes(struct drm_connector *connector, const u8 *db, u8 len)
{
- struct drm_display_info *info = &connector->display_info;
int modes = 0, offset = 0, i, multi_present = 0, multi_len;
u8 vic_len, hdmi_3d_len = 0;
u16 mask;
@@ -4831,8 +4830,6 @@ do_hdmi_vsdb_modes(struct drm_connector *connector, const u8 *db, u8 len)
}
out:
- if (modes > 0)
- info->has_hdmi_infoframe = true;
return modes;
}
@@ -6153,6 +6150,7 @@ static void drm_parse_hdmi_deep_color_info(struct drm_connector *connector,
}
}
+/* HDMI Vendor-Specific Data Block (HDMI VSDB, H14b-VSDB) */
static void
drm_parse_hdmi_vsdb_video(struct drm_connector *connector, const u8 *db)
{
@@ -6166,6 +6164,15 @@ drm_parse_hdmi_vsdb_video(struct drm_connector *connector, const u8 *db)
if (len >= 7)
info->max_tmds_clock = db[7] * 5000;
+ /*
+ * Try to infer whether the sink supports HDMI infoframes.
+ *
+ * HDMI infoframe support was first added in HDMI 1.4. Assume the sink
+ * supports infoframes if HDMI_Video_present is set.
+ */
+ if (len >= 8 && db[8] & BIT(5))
+ info->has_hdmi_infoframe = true;
+
drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] HDMI: DVI dual %d, max TMDS clock %d kHz\n",
connector->base.id, connector->name,
info->dvi_dual, info->max_tmds_clock);
--
2.34.1
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [Intel-gfx] [PATCH v8 2/8] drm/edid: refactor _drm_edid_connector_update() and rename
2023-01-19 16:18 [Intel-gfx] [PATCH v8 0/8] drm/edid: info & modes parsing and drm_edid refactors Jani Nikula
2023-01-19 16:18 ` [Intel-gfx] [PATCH v8 1/8] drm/edid: split HDMI VSDB info and mode parsing Jani Nikula
@ 2023-01-19 16:18 ` Jani Nikula
2023-01-19 16:18 ` [Intel-gfx] [PATCH v8 3/8] drm/edid: add separate drm_edid_connector_add_modes() Jani Nikula
` (7 subsequent siblings)
9 siblings, 0 replies; 18+ messages in thread
From: Jani Nikula @ 2023-01-19 16:18 UTC (permalink / raw)
To: intel-gfx, dri-devel; +Cc: jani.nikula
By moving update_display_info() out of _drm_edid_connector_update() we
make the function purely about adding modes. Rename accordingly.
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/drm_edid.c | 25 ++++++++++++-------------
1 file changed, 12 insertions(+), 13 deletions(-)
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index ee453e39562a..f9502df3dbca 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -6637,19 +6637,12 @@ static int add_displayid_detailed_modes(struct drm_connector *connector,
return num_modes;
}
-static int _drm_edid_connector_update(struct drm_connector *connector,
- const struct drm_edid *drm_edid)
+static int _drm_edid_connector_add_modes(struct drm_connector *connector,
+ const struct drm_edid *drm_edid)
{
const struct drm_display_info *info = &connector->display_info;
int num_modes = 0;
- /*
- * CEA-861-F adds ycbcr capability map block, for HDMI 2.0 sinks.
- * To avoid multiple parsing of same block, lets parse that map
- * from sink info, before parsing CEA modes.
- */
- update_display_info(connector, drm_edid);
-
if (!drm_edid)
return 0;
@@ -6754,7 +6747,9 @@ int drm_edid_connector_update(struct drm_connector *connector,
{
int count;
- count = _drm_edid_connector_update(connector, drm_edid);
+ update_display_info(connector, drm_edid);
+
+ count = _drm_edid_connector_add_modes(connector, drm_edid);
_drm_update_tile_info(connector, drm_edid);
@@ -6824,7 +6819,8 @@ EXPORT_SYMBOL(drm_connector_update_edid_property);
*/
int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid)
{
- struct drm_edid drm_edid;
+ struct drm_edid _drm_edid;
+ const struct drm_edid *drm_edid;
if (edid && !drm_edid_is_valid(edid)) {
drm_warn(connector->dev, "[CONNECTOR:%d:%s] EDID invalid.\n",
@@ -6832,8 +6828,11 @@ int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid)
edid = NULL;
}
- return _drm_edid_connector_update(connector,
- drm_edid_legacy_init(&drm_edid, edid));
+ drm_edid = drm_edid_legacy_init(&_drm_edid, edid);
+
+ update_display_info(connector, drm_edid);
+
+ return _drm_edid_connector_add_modes(connector, drm_edid);
}
EXPORT_SYMBOL(drm_add_edid_modes);
--
2.34.1
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [Intel-gfx] [PATCH v8 3/8] drm/edid: add separate drm_edid_connector_add_modes()
2023-01-19 16:18 [Intel-gfx] [PATCH v8 0/8] drm/edid: info & modes parsing and drm_edid refactors Jani Nikula
2023-01-19 16:18 ` [Intel-gfx] [PATCH v8 1/8] drm/edid: split HDMI VSDB info and mode parsing Jani Nikula
2023-01-19 16:18 ` [Intel-gfx] [PATCH v8 2/8] drm/edid: refactor _drm_edid_connector_update() and rename Jani Nikula
@ 2023-01-19 16:18 ` Jani Nikula
2023-01-19 16:18 ` [Intel-gfx] [PATCH v8 4/8] drm/edid: remove redundant _drm_connector_update_edid_property() Jani Nikula
` (6 subsequent siblings)
9 siblings, 0 replies; 18+ messages in thread
From: Jani Nikula @ 2023-01-19 16:18 UTC (permalink / raw)
To: intel-gfx, dri-devel; +Cc: jani.nikula
The original goal with drm_edid_connector_update() was to have a single
call for updating the connector and adding probed modes, in this order,
but that turned out to be problematic. Drivers that need to update the
connector in the .detect() callback would end up updating the probed
modes as well. Turns out the callback may be called so many times that
the probed mode list fills up without bounds, and this is amplified by
add_alternate_cea_modes() duplicating the CEA modes on every call,
actually running out of memory on some machines.
Kudos to Imre Deak <imre.deak@intel.com> for explaining this to me.
Go back to having separate drm_edid_connector_update() and
drm_edid_connector_add_modes() calls. The former may be called from
.detect(), .force(), or .get_modes(), but the latter only from
.get_modes().
Unlike drm_add_edid_modes(), have drm_edid_connector_add_modes() update
the probed modes from the EDID property instead of the passed in
EDID. This is mainly to enforce two things:
1) drm_edid_connector_update() must be called before
drm_edid_connector_add_modes().
Display info and quirks are needed for parsing the modes, and we
don't want to call update_display_info() again to ensure the info is
available, like drm_add_edid_modes() does.
2) The same EDID is used for both updating the connector and adding the
probed modes.
Fortunately, the change is easy, because no driver has actually adopted
drm_edid_connector_update(). Not even i915, and that's mainly because of
the problem described above.
Cc: Imre Deak <imre.deak@intel.com>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/drm_edid.c | 44 +++++++++++++++++++++++-------
drivers/gpu/drm/drm_probe_helper.c | 4 ++-
include/drm/drm_edid.h | 2 ++
3 files changed, 39 insertions(+), 11 deletions(-)
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index f9502df3dbca..d0c21d27b978 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -6735,30 +6735,54 @@ static int _drm_edid_connector_property_update(struct drm_connector *connector,
* @connector: Connector
* @drm_edid: EDID
*
- * Update the connector mode list, display info, ELD, HDR metadata, relevant
- * properties, etc. from the passed in EDID.
+ * Update the connector display info, ELD, HDR metadata, relevant properties,
+ * etc. from the passed in EDID.
*
* If EDID is NULL, reset the information.
*
- * Return: The number of modes added or 0 if we couldn't find any.
+ * Must be called before calling drm_edid_connector_add_modes().
+ *
+ * Return: 0 on success, negative error on errors.
*/
int drm_edid_connector_update(struct drm_connector *connector,
const struct drm_edid *drm_edid)
{
+ update_display_info(connector, drm_edid);
+
+ _drm_update_tile_info(connector, drm_edid);
+
+ return _drm_edid_connector_property_update(connector, drm_edid);
+}
+EXPORT_SYMBOL(drm_edid_connector_update);
+
+/**
+ * drm_edid_connector_add_modes - Update probed modes from the EDID property
+ * @connector: Connector
+ *
+ * Add the modes from the previously updated EDID property to the connector
+ * probed modes list.
+ *
+ * drm_edid_connector_update() must have been called before this to update the
+ * EDID property.
+ *
+ * Return: The number of modes added, or 0 if we couldn't find any.
+ */
+int drm_edid_connector_add_modes(struct drm_connector *connector)
+{
+ const struct drm_edid *drm_edid = NULL;
int count;
- update_display_info(connector, drm_edid);
+ if (connector->edid_blob_ptr)
+ drm_edid = drm_edid_alloc(connector->edid_blob_ptr->data,
+ connector->edid_blob_ptr->length);
count = _drm_edid_connector_add_modes(connector, drm_edid);
- _drm_update_tile_info(connector, drm_edid);
-
- /* Note: Ignore errors for now. */
- _drm_edid_connector_property_update(connector, drm_edid);
+ drm_edid_free(drm_edid);
return count;
}
-EXPORT_SYMBOL(drm_edid_connector_update);
+EXPORT_SYMBOL(drm_edid_connector_add_modes);
static int _drm_connector_update_edid_property(struct drm_connector *connector,
const struct drm_edid *drm_edid)
@@ -6813,7 +6837,7 @@ EXPORT_SYMBOL(drm_connector_update_edid_property);
* &drm_display_info structure and ELD in @connector with any information which
* can be derived from the edid.
*
- * This function is deprecated. Use drm_edid_connector_update() instead.
+ * This function is deprecated. Use drm_edid_connector_add_modes() instead.
*
* Return: The number of modes added or 0 if we couldn't find any.
*/
diff --git a/drivers/gpu/drm/drm_probe_helper.c b/drivers/gpu/drm/drm_probe_helper.c
index 7973f2589ced..95aeeed33cf5 100644
--- a/drivers/gpu/drm/drm_probe_helper.c
+++ b/drivers/gpu/drm/drm_probe_helper.c
@@ -1163,7 +1163,9 @@ int drm_connector_helper_get_modes(struct drm_connector *connector)
* EDID. Otherwise, if the EDID is NULL, clear the connector
* information.
*/
- count = drm_edid_connector_update(connector, drm_edid);
+ drm_edid_connector_update(connector, drm_edid);
+
+ count = drm_edid_connector_add_modes(connector);
drm_edid_free(drm_edid);
diff --git a/include/drm/drm_edid.h b/include/drm/drm_edid.h
index 372963600f1d..70ae6c290bdc 100644
--- a/include/drm/drm_edid.h
+++ b/include/drm/drm_edid.h
@@ -609,6 +609,8 @@ const struct drm_edid *drm_edid_read_custom(struct drm_connector *connector,
void *context);
int drm_edid_connector_update(struct drm_connector *connector,
const struct drm_edid *edid);
+int drm_edid_connector_add_modes(struct drm_connector *connector);
+
const u8 *drm_find_edid_extension(const struct drm_edid *drm_edid,
int ext_id, int *ext_index);
--
2.34.1
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [Intel-gfx] [PATCH v8 4/8] drm/edid: remove redundant _drm_connector_update_edid_property()
2023-01-19 16:18 [Intel-gfx] [PATCH v8 0/8] drm/edid: info & modes parsing and drm_edid refactors Jani Nikula
` (2 preceding siblings ...)
2023-01-19 16:18 ` [Intel-gfx] [PATCH v8 3/8] drm/edid: add separate drm_edid_connector_add_modes() Jani Nikula
@ 2023-01-19 16:18 ` Jani Nikula
2023-01-23 9:59 ` Jani Nikula
2023-01-19 16:18 ` [Intel-gfx] [PATCH v8 5/8] drm/i915/edid: convert DP, HDMI and LVDS to drm_edid Jani Nikula
` (5 subsequent siblings)
9 siblings, 1 reply; 18+ messages in thread
From: Jani Nikula @ 2023-01-19 16:18 UTC (permalink / raw)
To: intel-gfx, dri-devel; +Cc: jani.nikula
Realize that drm_edid_connector_update() and
_drm_connector_update_edid_property() are now the same thing. Drop the
latter.
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/drm_edid.c | 21 +--------------------
1 file changed, 1 insertion(+), 20 deletions(-)
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index d0c21d27b978..3d0a4da661bc 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -6784,24 +6784,6 @@ int drm_edid_connector_add_modes(struct drm_connector *connector)
}
EXPORT_SYMBOL(drm_edid_connector_add_modes);
-static int _drm_connector_update_edid_property(struct drm_connector *connector,
- const struct drm_edid *drm_edid)
-{
- /*
- * Set the display info, using edid if available, otherwise resetting
- * the values to defaults. This duplicates the work done in
- * drm_add_edid_modes, but that function is not consistently called
- * before this one in all drivers and the computation is cheap enough
- * that it seems better to duplicate it rather than attempt to ensure
- * some arbitrary ordering of calls.
- */
- update_display_info(connector, drm_edid);
-
- _drm_update_tile_info(connector, drm_edid);
-
- return _drm_edid_connector_property_update(connector, drm_edid);
-}
-
/**
* drm_connector_update_edid_property - update the edid property of a connector
* @connector: drm connector
@@ -6823,8 +6805,7 @@ int drm_connector_update_edid_property(struct drm_connector *connector,
{
struct drm_edid drm_edid;
- return _drm_connector_update_edid_property(connector,
- drm_edid_legacy_init(&drm_edid, edid));
+ return drm_edid_connector_update(connector, drm_edid_legacy_init(&drm_edid, edid));
}
EXPORT_SYMBOL(drm_connector_update_edid_property);
--
2.34.1
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [Intel-gfx] [PATCH v8 5/8] drm/i915/edid: convert DP, HDMI and LVDS to drm_edid
2023-01-19 16:18 [Intel-gfx] [PATCH v8 0/8] drm/edid: info & modes parsing and drm_edid refactors Jani Nikula
` (3 preceding siblings ...)
2023-01-19 16:18 ` [Intel-gfx] [PATCH v8 4/8] drm/edid: remove redundant _drm_connector_update_edid_property() Jani Nikula
@ 2023-01-19 16:18 ` Jani Nikula
2023-01-20 18:48 ` Ville Syrjälä
2023-01-19 16:18 ` [Intel-gfx] [PATCH v8 6/8] drm/i915/bios: convert intel_bios_init_panel() " Jani Nikula
` (4 subsequent siblings)
9 siblings, 1 reply; 18+ messages in thread
From: Jani Nikula @ 2023-01-19 16:18 UTC (permalink / raw)
To: intel-gfx, dri-devel; +Cc: jani.nikula
Convert all the connectors that use cached connector edid and
detect_edid to drm_edid.
Since drm_get_edid() calls drm_connector_update_edid_property() while
drm_edid_read*() do not, we need to call drm_edid_connector_update()
separately, in part due to the EDID caching behaviour in HDMI and
DP. Especially DP depends on the details parsed from EDID. (The big
behavioural change conflating EDID reading with parsing and property
update was done in commit 5186421cbfe2 ("drm: Introduce epoch counter to
drm_connector"))
v6: Rebase on drm_edid_connector_add_modes()
v5: Fix potential uninitialized var use (kernel test robot <lkp@intel.com>)
v4: Call drm_edid_connector_update() after reading HDMI/DP EDID
v3: Don't leak vga switcheroo EDID in LVDS init (Ville)
v2: Don't leak opregion fallback EDID (Ville)
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
.../gpu/drm/i915/display/intel_connector.c | 4 +-
.../drm/i915/display/intel_display_types.h | 4 +-
drivers/gpu/drm/i915/display/intel_dp.c | 83 +++++++++++--------
drivers/gpu/drm/i915/display/intel_hdmi.c | 28 ++++---
drivers/gpu/drm/i915/display/intel_lvds.c | 46 ++++++----
5 files changed, 96 insertions(+), 69 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/intel_connector.c b/drivers/gpu/drm/i915/display/intel_connector.c
index 562da3b741e2..4814d4e2f7f9 100644
--- a/drivers/gpu/drm/i915/display/intel_connector.c
+++ b/drivers/gpu/drm/i915/display/intel_connector.c
@@ -95,12 +95,12 @@ void intel_connector_destroy(struct drm_connector *connector)
{
struct intel_connector *intel_connector = to_intel_connector(connector);
- kfree(intel_connector->detect_edid);
+ drm_edid_free(intel_connector->detect_edid);
intel_hdcp_cleanup(intel_connector);
if (!IS_ERR_OR_NULL(intel_connector->edid))
- kfree(intel_connector->edid);
+ drm_edid_free(intel_connector->edid);
intel_panel_fini(intel_connector);
diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
index 32e8b2fc3cc6..34dc850340b8 100644
--- a/drivers/gpu/drm/i915/display/intel_display_types.h
+++ b/drivers/gpu/drm/i915/display/intel_display_types.h
@@ -592,8 +592,8 @@ struct intel_connector {
struct intel_panel panel;
/* Cached EDID for eDP and LVDS. May hold ERR_PTR for invalid EDID. */
- struct edid *edid;
- struct edid *detect_edid;
+ const struct drm_edid *edid;
+ const struct drm_edid *detect_edid;
/* Number of times hotplug detection was tried after an HPD interrupt */
int hotplug_retries;
diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
index 80d95cec8f9d..cd7fae1b7543 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -3648,12 +3648,11 @@ static u8 intel_dp_autotest_edid(struct intel_dp *intel_dp)
intel_dp->aux.i2c_defer_count);
intel_dp->compliance.test_data.edid = INTEL_DP_RESOLUTION_FAILSAFE;
} else {
- struct edid *block = intel_connector->detect_edid;
+ /* FIXME: Get rid of drm_edid_raw() */
+ const struct edid *block = drm_edid_raw(intel_connector->detect_edid);
- /* We have to write the checksum
- * of the last block read
- */
- block += intel_connector->detect_edid->extensions;
+ /* We have to write the checksum of the last block read */
+ block += block->extensions;
if (drm_dp_dpcd_writeb(&intel_dp->aux, DP_TEST_EDID_CHECKSUM,
block->checksum) <= 0)
@@ -4475,7 +4474,7 @@ bool intel_digital_port_connected(struct intel_encoder *encoder)
return is_connected;
}
-static struct edid *
+static const struct drm_edid *
intel_dp_get_edid(struct intel_dp *intel_dp)
{
struct intel_connector *intel_connector = intel_dp->attached_connector;
@@ -4486,18 +4485,22 @@ intel_dp_get_edid(struct intel_dp *intel_dp)
if (IS_ERR(intel_connector->edid))
return NULL;
- return drm_edid_duplicate(intel_connector->edid);
+ return drm_edid_dup(intel_connector->edid);
} else
- return drm_get_edid(&intel_connector->base,
- &intel_dp->aux.ddc);
+ return drm_edid_read_ddc(&intel_connector->base,
+ &intel_dp->aux.ddc);
}
static void
intel_dp_update_dfp(struct intel_dp *intel_dp,
- const struct edid *edid)
+ const struct drm_edid *drm_edid)
{
struct drm_i915_private *i915 = dp_to_i915(intel_dp);
struct intel_connector *connector = intel_dp->attached_connector;
+ const struct edid *edid;
+
+ /* FIXME: Get rid of drm_edid_raw() */
+ edid = drm_edid_raw(drm_edid);
intel_dp->dfp.max_bpc =
drm_dp_downstream_max_bpc(intel_dp->dpcd,
@@ -4597,21 +4600,27 @@ intel_dp_set_edid(struct intel_dp *intel_dp)
{
struct drm_i915_private *i915 = dp_to_i915(intel_dp);
struct intel_connector *connector = intel_dp->attached_connector;
- struct edid *edid;
+ const struct drm_edid *drm_edid;
+ const struct edid *edid;
bool vrr_capable;
intel_dp_unset_edid(intel_dp);
- edid = intel_dp_get_edid(intel_dp);
- connector->detect_edid = edid;
+ drm_edid = intel_dp_get_edid(intel_dp);
+ connector->detect_edid = drm_edid;
+
+ /* Below we depend on display info having been updated */
+ drm_edid_connector_update(&connector->base, drm_edid);
vrr_capable = intel_vrr_is_capable(connector);
drm_dbg_kms(&i915->drm, "[CONNECTOR:%d:%s] VRR capable: %s\n",
connector->base.base.id, connector->base.name, str_yes_no(vrr_capable));
drm_connector_set_vrr_capable_property(&connector->base, vrr_capable);
- intel_dp_update_dfp(intel_dp, edid);
+ intel_dp_update_dfp(intel_dp, drm_edid);
intel_dp_update_420(intel_dp);
+ /* FIXME: Get rid of drm_edid_raw() */
+ edid = drm_edid_raw(drm_edid);
if (edid && edid->input & DRM_EDID_INPUT_DIGITAL) {
intel_dp->has_hdmi_sink = drm_detect_hdmi_monitor(edid);
intel_dp->has_audio = drm_detect_monitor_audio(edid);
@@ -4626,7 +4635,7 @@ intel_dp_unset_edid(struct intel_dp *intel_dp)
struct intel_connector *connector = intel_dp->attached_connector;
drm_dp_cec_unset_edid(&intel_dp->aux);
- kfree(connector->detect_edid);
+ drm_edid_free(connector->detect_edid);
connector->detect_edid = NULL;
intel_dp->has_hdmi_sink = false;
@@ -4790,12 +4799,10 @@ intel_dp_force(struct drm_connector *connector)
static int intel_dp_get_modes(struct drm_connector *connector)
{
struct intel_connector *intel_connector = to_intel_connector(connector);
- struct edid *edid;
- int num_modes = 0;
+ int num_modes;
- edid = intel_connector->detect_edid;
- if (edid)
- num_modes = intel_connector_update_modes(connector, edid);
+ /* drm_edid_connector_update() done in ->detect() or ->force() */
+ num_modes = drm_edid_connector_add_modes(connector);
/* Also add fixed mode, which may or may not be present in EDID */
if (intel_dp_is_edp(intel_attached_dp(intel_connector)))
@@ -4804,7 +4811,7 @@ static int intel_dp_get_modes(struct drm_connector *connector)
if (num_modes)
return num_modes;
- if (!edid) {
+ if (!intel_connector->detect_edid) {
struct intel_dp *intel_dp = intel_attached_dp(intel_connector);
struct drm_display_mode *mode;
@@ -5240,7 +5247,7 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp,
struct drm_display_mode *fixed_mode;
struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
bool has_dpcd;
- struct edid *edid;
+ const struct drm_edid *drm_edid;
if (!intel_dp_is_edp(intel_dp))
return true;
@@ -5287,29 +5294,35 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp,
}
mutex_lock(&dev_priv->drm.mode_config.mutex);
- edid = drm_get_edid(connector, &intel_dp->aux.ddc);
- if (!edid) {
+ drm_edid = drm_edid_read_ddc(connector, &intel_dp->aux.ddc);
+ if (!drm_edid) {
+ const struct edid *edid;
+
/* Fallback to EDID from ACPI OpRegion, if any */
+ /* FIXME: Make intel_opregion_get_edid() return drm_edid */
edid = intel_opregion_get_edid(intel_connector);
- if (edid)
+ if (edid) {
+ drm_edid = drm_edid_alloc(edid, (edid->extensions + 1) * EDID_LENGTH);
drm_dbg_kms(&dev_priv->drm,
"[CONNECTOR:%d:%s] Using OpRegion EDID\n",
connector->base.id, connector->name);
- }
- if (edid) {
- if (drm_add_edid_modes(connector, edid)) {
- drm_connector_update_edid_property(connector, edid);
- } else {
kfree(edid);
- edid = ERR_PTR(-EINVAL);
+ }
+ }
+ if (drm_edid) {
+ if (drm_edid_connector_update(connector, drm_edid) ||
+ !drm_edid_connector_add_modes(connector)) {
+ drm_edid_connector_update(connector, NULL);
+ drm_edid_free(drm_edid);
+ drm_edid = ERR_PTR(-EINVAL);
}
} else {
- edid = ERR_PTR(-ENOENT);
+ drm_edid = ERR_PTR(-ENOENT);
}
- intel_connector->edid = edid;
+ intel_connector->edid = drm_edid;
- intel_bios_init_panel_late(dev_priv, &intel_connector->panel,
- encoder->devdata, IS_ERR(edid) ? NULL : edid);
+ intel_bios_init_panel_late(dev_priv, &intel_connector->panel, encoder->devdata,
+ IS_ERR_OR_NULL(drm_edid) ? NULL : drm_edid_raw(drm_edid));
intel_panel_add_edid_fixed_modes(intel_connector, true);
diff --git a/drivers/gpu/drm/i915/display/intel_hdmi.c b/drivers/gpu/drm/i915/display/intel_hdmi.c
index 6a2ee342eab5..3431193f0b47 100644
--- a/drivers/gpu/drm/i915/display/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/display/intel_hdmi.c
@@ -2360,7 +2360,7 @@ intel_hdmi_unset_edid(struct drm_connector *connector)
intel_hdmi->dp_dual_mode.type = DRM_DP_DUAL_MODE_NONE;
intel_hdmi->dp_dual_mode.max_tmds_clock = 0;
- kfree(to_intel_connector(connector)->detect_edid);
+ drm_edid_free(to_intel_connector(connector)->detect_edid);
to_intel_connector(connector)->detect_edid = NULL;
}
@@ -2421,7 +2421,8 @@ intel_hdmi_set_edid(struct drm_connector *connector)
struct drm_i915_private *dev_priv = to_i915(connector->dev);
struct intel_hdmi *intel_hdmi = intel_attached_hdmi(to_intel_connector(connector));
intel_wakeref_t wakeref;
- struct edid *edid;
+ const struct drm_edid *drm_edid;
+ const struct edid *edid;
bool connected = false;
struct i2c_adapter *i2c;
@@ -2429,17 +2430,23 @@ intel_hdmi_set_edid(struct drm_connector *connector)
i2c = intel_gmbus_get_adapter(dev_priv, intel_hdmi->ddc_bus);
- edid = drm_get_edid(connector, i2c);
+ drm_edid = drm_edid_read_ddc(connector, i2c);
- if (!edid && !intel_gmbus_is_forced_bit(i2c)) {
+ if (!drm_edid && !intel_gmbus_is_forced_bit(i2c)) {
drm_dbg_kms(&dev_priv->drm,
"HDMI GMBUS EDID read failed, retry using GPIO bit-banging\n");
intel_gmbus_force_bit(i2c, true);
- edid = drm_get_edid(connector, i2c);
+ drm_edid = drm_edid_read_ddc(connector, i2c);
intel_gmbus_force_bit(i2c, false);
}
- to_intel_connector(connector)->detect_edid = edid;
+ /* Below we depend on display info having been updated */
+ drm_edid_connector_update(connector, drm_edid);
+
+ to_intel_connector(connector)->detect_edid = drm_edid;
+
+ /* FIXME: Get rid of drm_edid_raw() */
+ edid = drm_edid_raw(drm_edid);
if (edid && edid->input & DRM_EDID_INPUT_DIGITAL) {
intel_hdmi->has_audio = drm_detect_monitor_audio(edid);
intel_hdmi->has_hdmi_sink = drm_detect_hdmi_monitor(edid);
@@ -2515,13 +2522,8 @@ intel_hdmi_force(struct drm_connector *connector)
static int intel_hdmi_get_modes(struct drm_connector *connector)
{
- struct edid *edid;
-
- edid = to_intel_connector(connector)->detect_edid;
- if (edid == NULL)
- return 0;
-
- return intel_connector_update_modes(connector, edid);
+ /* drm_edid_connector_update() done in ->detect() or ->force() */
+ return drm_edid_connector_add_modes(connector);
}
static struct i2c_adapter *
diff --git a/drivers/gpu/drm/i915/display/intel_lvds.c b/drivers/gpu/drm/i915/display/intel_lvds.c
index aecec992cd0d..6a98787edf48 100644
--- a/drivers/gpu/drm/i915/display/intel_lvds.c
+++ b/drivers/gpu/drm/i915/display/intel_lvds.c
@@ -479,8 +479,11 @@ static int intel_lvds_get_modes(struct drm_connector *connector)
struct intel_connector *intel_connector = to_intel_connector(connector);
/* use cached edid if we have one */
- if (!IS_ERR_OR_NULL(intel_connector->edid))
- return drm_add_edid_modes(connector, intel_connector->edid);
+ if (!IS_ERR_OR_NULL(intel_connector->edid)) {
+ drm_edid_connector_update(connector, intel_connector->edid);
+
+ return drm_edid_connector_add_modes(connector);
+ }
return intel_panel_get_modes(intel_connector);
}
@@ -834,7 +837,7 @@ void intel_lvds_init(struct drm_i915_private *dev_priv)
struct intel_connector *intel_connector;
struct drm_connector *connector;
struct drm_encoder *encoder;
- struct edid *edid;
+ const struct drm_edid *drm_edid;
i915_reg_t lvds_reg;
u32 lvds;
u8 pin;
@@ -945,27 +948,36 @@ void intel_lvds_init(struct drm_i915_private *dev_priv)
* preferred mode is the right one.
*/
mutex_lock(&dev_priv->drm.mode_config.mutex);
- if (vga_switcheroo_handler_flags() & VGA_SWITCHEROO_CAN_SWITCH_DDC)
+ if (vga_switcheroo_handler_flags() & VGA_SWITCHEROO_CAN_SWITCH_DDC) {
+ const struct edid *edid;
+
+ /* FIXME: Make drm_get_edid_switcheroo() return drm_edid */
edid = drm_get_edid_switcheroo(connector,
- intel_gmbus_get_adapter(dev_priv, pin));
- else
- edid = drm_get_edid(connector,
- intel_gmbus_get_adapter(dev_priv, pin));
- if (edid) {
- if (drm_add_edid_modes(connector, edid)) {
- drm_connector_update_edid_property(connector,
- edid);
- } else {
+ intel_gmbus_get_adapter(dev_priv, pin));
+ if (edid) {
+ drm_edid = drm_edid_alloc(edid, (edid->extensions + 1) * EDID_LENGTH);
kfree(edid);
- edid = ERR_PTR(-EINVAL);
+ } else {
+ drm_edid = NULL;
+ }
+ } else {
+ drm_edid = drm_edid_read_ddc(connector,
+ intel_gmbus_get_adapter(dev_priv, pin));
+ }
+ if (drm_edid) {
+ if (drm_edid_connector_update(connector, drm_edid) ||
+ !drm_edid_connector_add_modes(connector)) {
+ drm_edid_connector_update(connector, NULL);
+ drm_edid_free(drm_edid);
+ drm_edid = ERR_PTR(-EINVAL);
}
} else {
- edid = ERR_PTR(-ENOENT);
+ drm_edid = ERR_PTR(-ENOENT);
}
- intel_connector->edid = edid;
+ intel_connector->edid = drm_edid;
intel_bios_init_panel_late(dev_priv, &intel_connector->panel, NULL,
- IS_ERR(edid) ? NULL : edid);
+ IS_ERR_OR_NULL(drm_edid) ? NULL : drm_edid_raw(drm_edid));
/* Try EDID first */
intel_panel_add_edid_fixed_modes(intel_connector, true);
--
2.34.1
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [Intel-gfx] [PATCH v8 6/8] drm/i915/bios: convert intel_bios_init_panel() to drm_edid
2023-01-19 16:18 [Intel-gfx] [PATCH v8 0/8] drm/edid: info & modes parsing and drm_edid refactors Jani Nikula
` (4 preceding siblings ...)
2023-01-19 16:18 ` [Intel-gfx] [PATCH v8 5/8] drm/i915/edid: convert DP, HDMI and LVDS to drm_edid Jani Nikula
@ 2023-01-19 16:18 ` Jani Nikula
2023-01-20 18:48 ` Ville Syrjälä
2023-01-19 16:19 ` [Intel-gfx] [PATCH v8 7/8] drm/i915/opregion: convert intel_opregion_get_edid() to struct drm_edid Jani Nikula
` (3 subsequent siblings)
9 siblings, 1 reply; 18+ messages in thread
From: Jani Nikula @ 2023-01-19 16:18 UTC (permalink / raw)
To: intel-gfx, dri-devel; +Cc: jani.nikula
Try to use struct drm_edid where possible, even if having to fall back
to looking into struct edid down low via drm_edid_raw().
v2: Rebase
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/i915/display/intel_bios.c | 23 ++++++++++++-----------
drivers/gpu/drm/i915/display/intel_bios.h | 4 ++--
drivers/gpu/drm/i915/display/intel_dp.c | 2 +-
drivers/gpu/drm/i915/display/intel_lvds.c | 2 +-
4 files changed, 16 insertions(+), 15 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/intel_bios.c b/drivers/gpu/drm/i915/display/intel_bios.c
index 78abe34c7a42..e6ca51232dcf 100644
--- a/drivers/gpu/drm/i915/display/intel_bios.c
+++ b/drivers/gpu/drm/i915/display/intel_bios.c
@@ -619,14 +619,14 @@ static void dump_pnp_id(struct drm_i915_private *i915,
static int opregion_get_panel_type(struct drm_i915_private *i915,
const struct intel_bios_encoder_data *devdata,
- const struct edid *edid, bool use_fallback)
+ const struct drm_edid *drm_edid, bool use_fallback)
{
return intel_opregion_get_panel_type(i915);
}
static int vbt_get_panel_type(struct drm_i915_private *i915,
const struct intel_bios_encoder_data *devdata,
- const struct edid *edid, bool use_fallback)
+ const struct drm_edid *drm_edid, bool use_fallback)
{
const struct bdb_lvds_options *lvds_options;
@@ -651,12 +651,13 @@ static int vbt_get_panel_type(struct drm_i915_private *i915,
static int pnpid_get_panel_type(struct drm_i915_private *i915,
const struct intel_bios_encoder_data *devdata,
- const struct edid *edid, bool use_fallback)
+ const struct drm_edid *drm_edid, bool use_fallback)
{
const struct bdb_lvds_lfp_data *data;
const struct bdb_lvds_lfp_data_ptrs *ptrs;
const struct lvds_pnp_id *edid_id;
struct lvds_pnp_id edid_id_nodate;
+ const struct edid *edid = drm_edid_raw(drm_edid); /* FIXME */
int i, best = -1;
if (!edid)
@@ -700,7 +701,7 @@ static int pnpid_get_panel_type(struct drm_i915_private *i915,
static int fallback_get_panel_type(struct drm_i915_private *i915,
const struct intel_bios_encoder_data *devdata,
- const struct edid *edid, bool use_fallback)
+ const struct drm_edid *drm_edid, bool use_fallback)
{
return use_fallback ? 0 : -1;
}
@@ -714,13 +715,13 @@ enum panel_type {
static int get_panel_type(struct drm_i915_private *i915,
const struct intel_bios_encoder_data *devdata,
- const struct edid *edid, bool use_fallback)
+ const struct drm_edid *drm_edid, bool use_fallback)
{
struct {
const char *name;
int (*get_panel_type)(struct drm_i915_private *i915,
const struct intel_bios_encoder_data *devdata,
- const struct edid *edid, bool use_fallback);
+ const struct drm_edid *drm_edid, bool use_fallback);
int panel_type;
} panel_types[] = {
[PANEL_TYPE_OPREGION] = {
@@ -744,7 +745,7 @@ static int get_panel_type(struct drm_i915_private *i915,
for (i = 0; i < ARRAY_SIZE(panel_types); i++) {
panel_types[i].panel_type = panel_types[i].get_panel_type(i915, devdata,
- edid, use_fallback);
+ drm_edid, use_fallback);
drm_WARN_ON(&i915->drm, panel_types[i].panel_type > 0xf &&
panel_types[i].panel_type != 0xff);
@@ -3186,7 +3187,7 @@ void intel_bios_init(struct drm_i915_private *i915)
static void intel_bios_init_panel(struct drm_i915_private *i915,
struct intel_panel *panel,
const struct intel_bios_encoder_data *devdata,
- const struct edid *edid,
+ const struct drm_edid *drm_edid,
bool use_fallback)
{
/* already have it? */
@@ -3196,7 +3197,7 @@ static void intel_bios_init_panel(struct drm_i915_private *i915,
}
panel->vbt.panel_type = get_panel_type(i915, devdata,
- edid, use_fallback);
+ drm_edid, use_fallback);
if (panel->vbt.panel_type < 0) {
drm_WARN_ON(&i915->drm, use_fallback);
return;
@@ -3227,9 +3228,9 @@ void intel_bios_init_panel_early(struct drm_i915_private *i915,
void intel_bios_init_panel_late(struct drm_i915_private *i915,
struct intel_panel *panel,
const struct intel_bios_encoder_data *devdata,
- const struct edid *edid)
+ const struct drm_edid *drm_edid)
{
- intel_bios_init_panel(i915, panel, devdata, edid, true);
+ intel_bios_init_panel(i915, panel, devdata, drm_edid, true);
}
/**
diff --git a/drivers/gpu/drm/i915/display/intel_bios.h b/drivers/gpu/drm/i915/display/intel_bios.h
index ff1fdd2e0c1c..d221f784aa88 100644
--- a/drivers/gpu/drm/i915/display/intel_bios.h
+++ b/drivers/gpu/drm/i915/display/intel_bios.h
@@ -32,8 +32,8 @@
#include <linux/types.h>
+struct drm_edid;
struct drm_i915_private;
-struct edid;
struct intel_bios_encoder_data;
struct intel_crtc_state;
struct intel_encoder;
@@ -238,7 +238,7 @@ void intel_bios_init_panel_early(struct drm_i915_private *dev_priv,
void intel_bios_init_panel_late(struct drm_i915_private *dev_priv,
struct intel_panel *panel,
const struct intel_bios_encoder_data *devdata,
- const struct edid *edid);
+ const struct drm_edid *drm_edid);
void intel_bios_fini_panel(struct intel_panel *panel);
void intel_bios_driver_remove(struct drm_i915_private *dev_priv);
bool intel_bios_is_valid_vbt(const void *buf, size_t size);
diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
index cd7fae1b7543..4cc7c04b9bda 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -5322,7 +5322,7 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp,
intel_connector->edid = drm_edid;
intel_bios_init_panel_late(dev_priv, &intel_connector->panel, encoder->devdata,
- IS_ERR_OR_NULL(drm_edid) ? NULL : drm_edid_raw(drm_edid));
+ IS_ERR(drm_edid) ? NULL : drm_edid);
intel_panel_add_edid_fixed_modes(intel_connector, true);
diff --git a/drivers/gpu/drm/i915/display/intel_lvds.c b/drivers/gpu/drm/i915/display/intel_lvds.c
index 6a98787edf48..9f6910bba2e9 100644
--- a/drivers/gpu/drm/i915/display/intel_lvds.c
+++ b/drivers/gpu/drm/i915/display/intel_lvds.c
@@ -977,7 +977,7 @@ void intel_lvds_init(struct drm_i915_private *dev_priv)
intel_connector->edid = drm_edid;
intel_bios_init_panel_late(dev_priv, &intel_connector->panel, NULL,
- IS_ERR_OR_NULL(drm_edid) ? NULL : drm_edid_raw(drm_edid));
+ IS_ERR(drm_edid) ? NULL : drm_edid);
/* Try EDID first */
intel_panel_add_edid_fixed_modes(intel_connector, true);
--
2.34.1
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [Intel-gfx] [PATCH v8 7/8] drm/i915/opregion: convert intel_opregion_get_edid() to struct drm_edid
2023-01-19 16:18 [Intel-gfx] [PATCH v8 0/8] drm/edid: info & modes parsing and drm_edid refactors Jani Nikula
` (5 preceding siblings ...)
2023-01-19 16:18 ` [Intel-gfx] [PATCH v8 6/8] drm/i915/bios: convert intel_bios_init_panel() " Jani Nikula
@ 2023-01-19 16:19 ` Jani Nikula
2023-01-20 18:49 ` Ville Syrjälä
2023-01-19 16:19 ` [Intel-gfx] [PATCH v8 8/8] drm/i915/panel: move panel fixed EDID to struct intel_panel Jani Nikula
` (2 subsequent siblings)
9 siblings, 1 reply; 18+ messages in thread
From: Jani Nikula @ 2023-01-19 16:19 UTC (permalink / raw)
To: intel-gfx, dri-devel; +Cc: jani.nikula
Simplify validation and use by converting to drm_edid.
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/i915/display/intel_dp.c | 10 ++-----
drivers/gpu/drm/i915/display/intel_opregion.c | 29 +++++++------------
drivers/gpu/drm/i915/display/intel_opregion.h | 4 +--
3 files changed, 15 insertions(+), 28 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
index 4cc7c04b9bda..a44eefb97e8d 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -5296,18 +5296,12 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp,
mutex_lock(&dev_priv->drm.mode_config.mutex);
drm_edid = drm_edid_read_ddc(connector, &intel_dp->aux.ddc);
if (!drm_edid) {
- const struct edid *edid;
-
/* Fallback to EDID from ACPI OpRegion, if any */
- /* FIXME: Make intel_opregion_get_edid() return drm_edid */
- edid = intel_opregion_get_edid(intel_connector);
- if (edid) {
- drm_edid = drm_edid_alloc(edid, (edid->extensions + 1) * EDID_LENGTH);
+ drm_edid = intel_opregion_get_edid(intel_connector);
+ if (drm_edid)
drm_dbg_kms(&dev_priv->drm,
"[CONNECTOR:%d:%s] Using OpRegion EDID\n",
connector->base.id, connector->name);
- kfree(edid);
- }
}
if (drm_edid) {
if (drm_edid_connector_update(connector, drm_edid) ||
diff --git a/drivers/gpu/drm/i915/display/intel_opregion.c b/drivers/gpu/drm/i915/display/intel_opregion.c
index e0184745632c..b8dce0576512 100644
--- a/drivers/gpu/drm/i915/display/intel_opregion.c
+++ b/drivers/gpu/drm/i915/display/intel_opregion.c
@@ -1101,41 +1101,34 @@ intel_opregion_get_panel_type(struct drm_i915_private *dev_priv)
* The EDID in the OpRegion, or NULL if there is none or it's invalid.
*
*/
-struct edid *intel_opregion_get_edid(struct intel_connector *intel_connector)
+const struct drm_edid *intel_opregion_get_edid(struct intel_connector *intel_connector)
{
struct drm_connector *connector = &intel_connector->base;
struct drm_i915_private *i915 = to_i915(connector->dev);
struct intel_opregion *opregion = &i915->display.opregion;
- const void *in_edid;
- const struct edid *edid;
- struct edid *new_edid;
+ const struct drm_edid *drm_edid;
+ const void *edid;
int len;
if (!opregion->asle_ext)
return NULL;
- in_edid = opregion->asle_ext->bddc;
+ edid = opregion->asle_ext->bddc;
/* Validity corresponds to number of 128-byte blocks */
len = (opregion->asle_ext->phed & ASLE_PHED_EDID_VALID_MASK) * 128;
- if (!len || !memchr_inv(in_edid, 0, len))
+ if (!len || !memchr_inv(edid, 0, len))
return NULL;
- edid = in_edid;
+ drm_edid = drm_edid_alloc(edid, len);
- if (len < EDID_LENGTH * (1 + edid->extensions)) {
- drm_dbg_kms(&i915->drm, "Invalid EDID in ACPI OpRegion (Mailbox #5): too short\n");
- return NULL;
- }
- new_edid = drm_edid_duplicate(edid);
- if (!new_edid)
- return NULL;
- if (!drm_edid_is_valid(new_edid)) {
- kfree(new_edid);
+ if (!drm_edid_valid(drm_edid)) {
drm_dbg_kms(&i915->drm, "Invalid EDID in ACPI OpRegion (Mailbox #5)\n");
- return NULL;
+ drm_edid_free(drm_edid);
+ drm_edid = NULL;
}
- return new_edid;
+
+ return drm_edid;
}
bool intel_opregion_headless_sku(struct drm_i915_private *i915)
diff --git a/drivers/gpu/drm/i915/display/intel_opregion.h b/drivers/gpu/drm/i915/display/intel_opregion.h
index 2f261f985400..d02e6696a050 100644
--- a/drivers/gpu/drm/i915/display/intel_opregion.h
+++ b/drivers/gpu/drm/i915/display/intel_opregion.h
@@ -74,7 +74,7 @@ int intel_opregion_notify_encoder(struct intel_encoder *intel_encoder,
int intel_opregion_notify_adapter(struct drm_i915_private *dev_priv,
pci_power_t state);
int intel_opregion_get_panel_type(struct drm_i915_private *dev_priv);
-struct edid *intel_opregion_get_edid(struct intel_connector *connector);
+const struct drm_edid *intel_opregion_get_edid(struct intel_connector *connector);
bool intel_opregion_headless_sku(struct drm_i915_private *i915);
@@ -123,7 +123,7 @@ static inline int intel_opregion_get_panel_type(struct drm_i915_private *dev)
return -ENODEV;
}
-static inline struct edid *
+static inline const struct drm_edid *
intel_opregion_get_edid(struct intel_connector *connector)
{
return NULL;
--
2.34.1
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [Intel-gfx] [PATCH v8 8/8] drm/i915/panel: move panel fixed EDID to struct intel_panel
2023-01-19 16:18 [Intel-gfx] [PATCH v8 0/8] drm/edid: info & modes parsing and drm_edid refactors Jani Nikula
` (6 preceding siblings ...)
2023-01-19 16:19 ` [Intel-gfx] [PATCH v8 7/8] drm/i915/opregion: convert intel_opregion_get_edid() to struct drm_edid Jani Nikula
@ 2023-01-19 16:19 ` Jani Nikula
2023-01-20 18:49 ` Ville Syrjälä
2023-01-19 18:14 ` [Intel-gfx] ✓ Fi.CI.BAT: success for drm/edid: info & modes parsing and drm_edid refactors (rev3) Patchwork
2023-01-20 21:51 ` [Intel-gfx] ✓ Fi.CI.IGT: " Patchwork
9 siblings, 1 reply; 18+ messages in thread
From: Jani Nikula @ 2023-01-19 16:19 UTC (permalink / raw)
To: intel-gfx, dri-devel; +Cc: jani.nikula
It's a bit confusing to have two cached EDIDs in struct intel_connector
with slightly different purposes. Make the distinction a bit clearer by
moving the EDID cached for eDP and LVDS panels at connector init time to
struct intel_panel, and name it fixed_edid. That's what it is, a fixed
EDID for the panels.
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/i915/display/icl_dsi.c | 2 +-
.../gpu/drm/i915/display/intel_connector.c | 3 ---
.../drm/i915/display/intel_display_types.h | 6 ++++--
drivers/gpu/drm/i915/display/intel_dp.c | 20 +++++++++----------
drivers/gpu/drm/i915/display/intel_dvo.c | 2 +-
drivers/gpu/drm/i915/display/intel_lvds.c | 11 +++++-----
drivers/gpu/drm/i915/display/intel_panel.c | 10 +++++++++-
drivers/gpu/drm/i915/display/intel_panel.h | 4 +++-
drivers/gpu/drm/i915/display/intel_sdvo.c | 2 +-
drivers/gpu/drm/i915/display/vlv_dsi.c | 2 +-
10 files changed, 35 insertions(+), 27 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/icl_dsi.c b/drivers/gpu/drm/i915/display/icl_dsi.c
index ae14c794c4bc..d56d01f07bb7 100644
--- a/drivers/gpu/drm/i915/display/icl_dsi.c
+++ b/drivers/gpu/drm/i915/display/icl_dsi.c
@@ -2054,7 +2054,7 @@ void icl_dsi_init(struct drm_i915_private *dev_priv)
goto err;
}
- intel_panel_init(intel_connector);
+ intel_panel_init(intel_connector, NULL);
intel_backlight_setup(intel_connector, INVALID_PIPE);
diff --git a/drivers/gpu/drm/i915/display/intel_connector.c b/drivers/gpu/drm/i915/display/intel_connector.c
index 4814d4e2f7f9..257afac34839 100644
--- a/drivers/gpu/drm/i915/display/intel_connector.c
+++ b/drivers/gpu/drm/i915/display/intel_connector.c
@@ -99,9 +99,6 @@ void intel_connector_destroy(struct drm_connector *connector)
intel_hdcp_cleanup(intel_connector);
- if (!IS_ERR_OR_NULL(intel_connector->edid))
- drm_edid_free(intel_connector->edid);
-
intel_panel_fini(intel_connector);
drm_connector_cleanup(connector);
diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
index 34dc850340b8..6feb232bb1c2 100644
--- a/drivers/gpu/drm/i915/display/intel_display_types.h
+++ b/drivers/gpu/drm/i915/display/intel_display_types.h
@@ -351,6 +351,9 @@ struct intel_vbt_panel_data {
};
struct intel_panel {
+ /* Fixed EDID for eDP and LVDS. May hold ERR_PTR for invalid EDID. */
+ const struct drm_edid *fixed_edid;
+
struct list_head fixed_modes;
/* backlight */
@@ -591,8 +594,7 @@ struct intel_connector {
/* Panel info for eDP and LVDS */
struct intel_panel panel;
- /* Cached EDID for eDP and LVDS. May hold ERR_PTR for invalid EDID. */
- const struct drm_edid *edid;
+ /* Cached EDID for detect. */
const struct drm_edid *detect_edid;
/* Number of times hotplug detection was tried after an HPD interrupt */
diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
index a44eefb97e8d..e14c13444643 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -4477,18 +4477,19 @@ bool intel_digital_port_connected(struct intel_encoder *encoder)
static const struct drm_edid *
intel_dp_get_edid(struct intel_dp *intel_dp)
{
- struct intel_connector *intel_connector = intel_dp->attached_connector;
+ struct intel_connector *connector = intel_dp->attached_connector;
+ const struct drm_edid *fixed_edid = connector->panel.fixed_edid;
- /* use cached edid if we have one */
- if (intel_connector->edid) {
+ /* Use panel fixed edid if we have one */
+ if (fixed_edid) {
/* invalid edid */
- if (IS_ERR(intel_connector->edid))
+ if (IS_ERR(fixed_edid))
return NULL;
- return drm_edid_dup(intel_connector->edid);
- } else
- return drm_edid_read_ddc(&intel_connector->base,
- &intel_dp->aux.ddc);
+ return drm_edid_dup(fixed_edid);
+ }
+
+ return drm_edid_read_ddc(&connector->base, &intel_dp->aux.ddc);
}
static void
@@ -5313,7 +5314,6 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp,
} else {
drm_edid = ERR_PTR(-ENOENT);
}
- intel_connector->edid = drm_edid;
intel_bios_init_panel_late(dev_priv, &intel_connector->panel, encoder->devdata,
IS_ERR(drm_edid) ? NULL : drm_edid);
@@ -5340,7 +5340,7 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp,
goto out_vdd_off;
}
- intel_panel_init(intel_connector);
+ intel_panel_init(intel_connector, drm_edid);
intel_edp_backlight_setup(intel_dp, intel_connector);
diff --git a/drivers/gpu/drm/i915/display/intel_dvo.c b/drivers/gpu/drm/i915/display/intel_dvo.c
index 4aeae0f3ac91..0be8105cb18a 100644
--- a/drivers/gpu/drm/i915/display/intel_dvo.c
+++ b/drivers/gpu/drm/i915/display/intel_dvo.c
@@ -554,6 +554,6 @@ void intel_dvo_init(struct drm_i915_private *i915)
*/
intel_panel_add_encoder_fixed_mode(connector, encoder);
- intel_panel_init(connector);
+ intel_panel_init(connector, NULL);
}
}
diff --git a/drivers/gpu/drm/i915/display/intel_lvds.c b/drivers/gpu/drm/i915/display/intel_lvds.c
index 9f6910bba2e9..a1557d84ce0a 100644
--- a/drivers/gpu/drm/i915/display/intel_lvds.c
+++ b/drivers/gpu/drm/i915/display/intel_lvds.c
@@ -477,10 +477,11 @@ static int intel_lvds_compute_config(struct intel_encoder *intel_encoder,
static int intel_lvds_get_modes(struct drm_connector *connector)
{
struct intel_connector *intel_connector = to_intel_connector(connector);
+ const struct drm_edid *fixed_edid = intel_connector->panel.fixed_edid;
- /* use cached edid if we have one */
- if (!IS_ERR_OR_NULL(intel_connector->edid)) {
- drm_edid_connector_update(connector, intel_connector->edid);
+ /* Use panel fixed edid if we have one */
+ if (!IS_ERR_OR_NULL(fixed_edid)) {
+ drm_edid_connector_update(connector, fixed_edid);
return drm_edid_connector_add_modes(connector);
}
@@ -974,8 +975,6 @@ void intel_lvds_init(struct drm_i915_private *dev_priv)
} else {
drm_edid = ERR_PTR(-ENOENT);
}
- intel_connector->edid = drm_edid;
-
intel_bios_init_panel_late(dev_priv, &intel_connector->panel, NULL,
IS_ERR(drm_edid) ? NULL : drm_edid);
@@ -1000,7 +999,7 @@ void intel_lvds_init(struct drm_i915_private *dev_priv)
if (!intel_panel_preferred_fixed_mode(intel_connector))
goto failed;
- intel_panel_init(intel_connector);
+ intel_panel_init(intel_connector, drm_edid);
intel_backlight_setup(intel_connector, INVALID_PIPE);
diff --git a/drivers/gpu/drm/i915/display/intel_panel.c b/drivers/gpu/drm/i915/display/intel_panel.c
index 3b1004b019a8..42aa04bac261 100644
--- a/drivers/gpu/drm/i915/display/intel_panel.c
+++ b/drivers/gpu/drm/i915/display/intel_panel.c
@@ -31,6 +31,8 @@
#include <linux/kernel.h>
#include <linux/pwm.h>
+#include <drm/drm_edid.h>
+
#include "i915_reg.h"
#include "intel_backlight.h"
#include "intel_connector.h"
@@ -670,10 +672,13 @@ void intel_panel_init_alloc(struct intel_connector *connector)
INIT_LIST_HEAD(&panel->fixed_modes);
}
-int intel_panel_init(struct intel_connector *connector)
+int intel_panel_init(struct intel_connector *connector,
+ const struct drm_edid *fixed_edid)
{
struct intel_panel *panel = &connector->panel;
+ panel->fixed_edid = fixed_edid;
+
intel_backlight_init_funcs(panel);
if (!has_drrs_modes(connector))
@@ -692,6 +697,9 @@ void intel_panel_fini(struct intel_connector *connector)
struct intel_panel *panel = &connector->panel;
struct drm_display_mode *fixed_mode, *next;
+ if (!IS_ERR_OR_NULL(panel->fixed_edid))
+ drm_edid_free(panel->fixed_edid);
+
intel_backlight_destroy(panel);
intel_bios_fini_panel(panel);
diff --git a/drivers/gpu/drm/i915/display/intel_panel.h b/drivers/gpu/drm/i915/display/intel_panel.h
index 4b51e1c51da6..15a8c897b33f 100644
--- a/drivers/gpu/drm/i915/display/intel_panel.h
+++ b/drivers/gpu/drm/i915/display/intel_panel.h
@@ -13,13 +13,15 @@ enum drrs_type;
struct drm_connector;
struct drm_connector_state;
struct drm_display_mode;
+struct drm_edid;
struct drm_i915_private;
struct intel_connector;
struct intel_crtc_state;
struct intel_encoder;
void intel_panel_init_alloc(struct intel_connector *connector);
-int intel_panel_init(struct intel_connector *connector);
+int intel_panel_init(struct intel_connector *connector,
+ const struct drm_edid *fixed_edid);
void intel_panel_fini(struct intel_connector *connector);
enum drm_connector_status
intel_panel_detect(struct drm_connector *connector, bool force);
diff --git a/drivers/gpu/drm/i915/display/intel_sdvo.c b/drivers/gpu/drm/i915/display/intel_sdvo.c
index 21805c15d5eb..c58e5cfa8e88 100644
--- a/drivers/gpu/drm/i915/display/intel_sdvo.c
+++ b/drivers/gpu/drm/i915/display/intel_sdvo.c
@@ -2903,7 +2903,7 @@ intel_sdvo_lvds_init(struct intel_sdvo *intel_sdvo, u16 type)
mutex_unlock(&i915->drm.mode_config.mutex);
}
- intel_panel_init(intel_connector);
+ intel_panel_init(intel_connector, NULL);
if (!intel_panel_preferred_fixed_mode(intel_connector))
goto err;
diff --git a/drivers/gpu/drm/i915/display/vlv_dsi.c b/drivers/gpu/drm/i915/display/vlv_dsi.c
index 662bdb656aa3..2289f6b1b4eb 100644
--- a/drivers/gpu/drm/i915/display/vlv_dsi.c
+++ b/drivers/gpu/drm/i915/display/vlv_dsi.c
@@ -1983,7 +1983,7 @@ void vlv_dsi_init(struct drm_i915_private *dev_priv)
goto err_cleanup_connector;
}
- intel_panel_init(intel_connector);
+ intel_panel_init(intel_connector, NULL);
intel_backlight_setup(intel_connector, INVALID_PIPE);
--
2.34.1
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [Intel-gfx] ✓ Fi.CI.BAT: success for drm/edid: info & modes parsing and drm_edid refactors (rev3)
2023-01-19 16:18 [Intel-gfx] [PATCH v8 0/8] drm/edid: info & modes parsing and drm_edid refactors Jani Nikula
` (7 preceding siblings ...)
2023-01-19 16:19 ` [Intel-gfx] [PATCH v8 8/8] drm/i915/panel: move panel fixed EDID to struct intel_panel Jani Nikula
@ 2023-01-19 18:14 ` Patchwork
2023-01-20 21:51 ` [Intel-gfx] ✓ Fi.CI.IGT: " Patchwork
9 siblings, 0 replies; 18+ messages in thread
From: Patchwork @ 2023-01-19 18:14 UTC (permalink / raw)
To: Jani Nikula; +Cc: intel-gfx
[-- Attachment #1: Type: text/plain, Size: 5654 bytes --]
== Series Details ==
Series: drm/edid: info & modes parsing and drm_edid refactors (rev3)
URL : https://patchwork.freedesktop.org/series/112392/
State : success
== Summary ==
CI Bug Log - changes from CI_DRM_12613 -> Patchwork_112392v3
====================================================
Summary
-------
**SUCCESS**
No regressions found.
External URL: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_112392v3/index.html
Participating hosts (38 -> 35)
------------------------------
Missing (3): fi-kbl-soraka fi-rkl-11600 fi-snb-2520m
Known issues
------------
Here are the changes found in Patchwork_112392v3 that come from known issues:
### IGT changes ###
#### Issues hit ####
* igt@gem_exec_gttfill@basic:
- fi-pnv-d510: [PASS][1] -> [FAIL][2] ([i915#7229])
[1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12613/fi-pnv-d510/igt@gem_exec_gttfill@basic.html
[2]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_112392v3/fi-pnv-d510/igt@gem_exec_gttfill@basic.html
* igt@gem_lmem_swapping@basic:
- fi-apl-guc: NOTRUN -> [SKIP][3] ([fdo#109271] / [i915#4613]) +3 similar issues
[3]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_112392v3/fi-apl-guc/igt@gem_lmem_swapping@basic.html
* igt@i915_selftest@live@gt_lrc:
- fi-rkl-guc: [PASS][4] -> [INCOMPLETE][5] ([i915#4983])
[4]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12613/fi-rkl-guc/igt@i915_selftest@live@gt_lrc.html
[5]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_112392v3/fi-rkl-guc/igt@i915_selftest@live@gt_lrc.html
* igt@kms_chamelium_hpd@common-hpd-after-suspend:
- fi-apl-guc: NOTRUN -> [SKIP][6] ([fdo#109271]) +1 similar issue
[6]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_112392v3/fi-apl-guc/igt@kms_chamelium_hpd@common-hpd-after-suspend.html
#### Possible fixes ####
* igt@i915_selftest@live@hangcheck:
- fi-adl-ddr5: [DMESG-WARN][7] ([i915#5591]) -> [PASS][8]
[7]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12613/fi-adl-ddr5/igt@i915_selftest@live@hangcheck.html
[8]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_112392v3/fi-adl-ddr5/igt@i915_selftest@live@hangcheck.html
* igt@i915_selftest@live@migrate:
- {bat-adlp-6}: [DMESG-FAIL][9] ([i915#7699]) -> [PASS][10]
[9]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12613/bat-adlp-6/igt@i915_selftest@live@migrate.html
[10]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_112392v3/bat-adlp-6/igt@i915_selftest@live@migrate.html
* igt@i915_selftest@live@slpc:
- {bat-rpls-1}: [DMESG-FAIL][11] ([i915#6367]) -> [PASS][12]
[11]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12613/bat-rpls-1/igt@i915_selftest@live@slpc.html
[12]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_112392v3/bat-rpls-1/igt@i915_selftest@live@slpc.html
* igt@kms_pipe_crc_basic@suspend-read-crc@pipe-c-dp-3:
- {bat-dg2-9}: [FAIL][13] -> [PASS][14]
[13]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12613/bat-dg2-9/igt@kms_pipe_crc_basic@suspend-read-crc@pipe-c-dp-3.html
[14]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_112392v3/bat-dg2-9/igt@kms_pipe_crc_basic@suspend-read-crc@pipe-c-dp-3.html
* igt@prime_self_import@basic-with_one_bo_two_files:
- fi-apl-guc: [DMESG-WARN][15] -> [PASS][16]
[15]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12613/fi-apl-guc/igt@prime_self_import@basic-with_one_bo_two_files.html
[16]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_112392v3/fi-apl-guc/igt@prime_self_import@basic-with_one_bo_two_files.html
{name}: This element is suppressed. This means it is ignored when computing
the status of the difference (SUCCESS, WARNING, or FAILURE).
[fdo#109271]: https://bugs.freedesktop.org/show_bug.cgi?id=109271
[i915#3546]: https://gitlab.freedesktop.org/drm/intel/issues/3546
[i915#4258]: https://gitlab.freedesktop.org/drm/intel/issues/4258
[i915#4312]: https://gitlab.freedesktop.org/drm/intel/issues/4312
[i915#4613]: https://gitlab.freedesktop.org/drm/intel/issues/4613
[i915#4983]: https://gitlab.freedesktop.org/drm/intel/issues/4983
[i915#5354]: https://gitlab.freedesktop.org/drm/intel/issues/5354
[i915#5591]: https://gitlab.freedesktop.org/drm/intel/issues/5591
[i915#6367]: https://gitlab.freedesktop.org/drm/intel/issues/6367
[i915#7229]: https://gitlab.freedesktop.org/drm/intel/issues/7229
[i915#7699]: https://gitlab.freedesktop.org/drm/intel/issues/7699
Build changes
-------------
* Linux: CI_DRM_12613 -> Patchwork_112392v3
CI-20190529: 20190529
CI_DRM_12613: c79a53a6143abdc789b46eb24cd7ce00924be491 @ git://anongit.freedesktop.org/gfx-ci/linux
IGT_7126: 3aa9364a1e478010aba0d3dfe9183486560ecc60 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
Patchwork_112392v3: c79a53a6143abdc789b46eb24cd7ce00924be491 @ git://anongit.freedesktop.org/gfx-ci/linux
### Linux commits
a144c062bbba drm/i915/panel: move panel fixed EDID to struct intel_panel
d029f6d99edc drm/i915/opregion: convert intel_opregion_get_edid() to struct drm_edid
5e0da94762e8 drm/i915/bios: convert intel_bios_init_panel() to drm_edid
d923ff26c5a8 drm/i915/edid: convert DP, HDMI and LVDS to drm_edid
4d40761658a3 drm/edid: remove redundant _drm_connector_update_edid_property()
4cac85bdd7ae drm/edid: add separate drm_edid_connector_add_modes()
fb4e4c23d9ed drm/edid: refactor _drm_edid_connector_update() and rename
e98534344080 drm/edid: split HDMI VSDB info and mode parsing
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_112392v3/index.html
[-- Attachment #2: Type: text/html, Size: 6333 bytes --]
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [Intel-gfx] [PATCH v8 5/8] drm/i915/edid: convert DP, HDMI and LVDS to drm_edid
2023-01-19 16:18 ` [Intel-gfx] [PATCH v8 5/8] drm/i915/edid: convert DP, HDMI and LVDS to drm_edid Jani Nikula
@ 2023-01-20 18:48 ` Ville Syrjälä
2023-01-23 10:15 ` Jani Nikula
0 siblings, 1 reply; 18+ messages in thread
From: Ville Syrjälä @ 2023-01-20 18:48 UTC (permalink / raw)
To: Jani Nikula; +Cc: intel-gfx, dri-devel
On Thu, Jan 19, 2023 at 06:18:58PM +0200, Jani Nikula wrote:
> Convert all the connectors that use cached connector edid and
> detect_edid to drm_edid.
>
> Since drm_get_edid() calls drm_connector_update_edid_property() while
> drm_edid_read*() do not, we need to call drm_edid_connector_update()
> separately, in part due to the EDID caching behaviour in HDMI and
> DP. Especially DP depends on the details parsed from EDID. (The big
> behavioural change conflating EDID reading with parsing and property
> update was done in commit 5186421cbfe2 ("drm: Introduce epoch counter to
> drm_connector"))
>
> v6: Rebase on drm_edid_connector_add_modes()
>
> v5: Fix potential uninitialized var use (kernel test robot <lkp@intel.com>)
>
> v4: Call drm_edid_connector_update() after reading HDMI/DP EDID
>
> v3: Don't leak vga switcheroo EDID in LVDS init (Ville)
>
> v2: Don't leak opregion fallback EDID (Ville)
>
> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
> .../gpu/drm/i915/display/intel_connector.c | 4 +-
> .../drm/i915/display/intel_display_types.h | 4 +-
> drivers/gpu/drm/i915/display/intel_dp.c | 83 +++++++++++--------
> drivers/gpu/drm/i915/display/intel_hdmi.c | 28 ++++---
> drivers/gpu/drm/i915/display/intel_lvds.c | 46 ++++++----
> 5 files changed, 96 insertions(+), 69 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_connector.c b/drivers/gpu/drm/i915/display/intel_connector.c
> index 562da3b741e2..4814d4e2f7f9 100644
> --- a/drivers/gpu/drm/i915/display/intel_connector.c
> +++ b/drivers/gpu/drm/i915/display/intel_connector.c
> @@ -95,12 +95,12 @@ void intel_connector_destroy(struct drm_connector *connector)
> {
> struct intel_connector *intel_connector = to_intel_connector(connector);
>
> - kfree(intel_connector->detect_edid);
> + drm_edid_free(intel_connector->detect_edid);
>
> intel_hdcp_cleanup(intel_connector);
>
> if (!IS_ERR_OR_NULL(intel_connector->edid))
> - kfree(intel_connector->edid);
> + drm_edid_free(intel_connector->edid);
>
> intel_panel_fini(intel_connector);
>
> diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
> index 32e8b2fc3cc6..34dc850340b8 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_types.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_types.h
> @@ -592,8 +592,8 @@ struct intel_connector {
> struct intel_panel panel;
>
> /* Cached EDID for eDP and LVDS. May hold ERR_PTR for invalid EDID. */
> - struct edid *edid;
> - struct edid *detect_edid;
> + const struct drm_edid *edid;
> + const struct drm_edid *detect_edid;
>
> /* Number of times hotplug detection was tried after an HPD interrupt */
> int hotplug_retries;
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
> index 80d95cec8f9d..cd7fae1b7543 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> @@ -3648,12 +3648,11 @@ static u8 intel_dp_autotest_edid(struct intel_dp *intel_dp)
> intel_dp->aux.i2c_defer_count);
> intel_dp->compliance.test_data.edid = INTEL_DP_RESOLUTION_FAILSAFE;
> } else {
> - struct edid *block = intel_connector->detect_edid;
> + /* FIXME: Get rid of drm_edid_raw() */
> + const struct edid *block = drm_edid_raw(intel_connector->detect_edid);
>
> - /* We have to write the checksum
> - * of the last block read
> - */
> - block += intel_connector->detect_edid->extensions;
> + /* We have to write the checksum of the last block read */
> + block += block->extensions;
>
> if (drm_dp_dpcd_writeb(&intel_dp->aux, DP_TEST_EDID_CHECKSUM,
> block->checksum) <= 0)
> @@ -4475,7 +4474,7 @@ bool intel_digital_port_connected(struct intel_encoder *encoder)
> return is_connected;
> }
>
> -static struct edid *
> +static const struct drm_edid *
> intel_dp_get_edid(struct intel_dp *intel_dp)
> {
> struct intel_connector *intel_connector = intel_dp->attached_connector;
> @@ -4486,18 +4485,22 @@ intel_dp_get_edid(struct intel_dp *intel_dp)
> if (IS_ERR(intel_connector->edid))
> return NULL;
>
> - return drm_edid_duplicate(intel_connector->edid);
> + return drm_edid_dup(intel_connector->edid);
> } else
> - return drm_get_edid(&intel_connector->base,
> - &intel_dp->aux.ddc);
> + return drm_edid_read_ddc(&intel_connector->base,
> + &intel_dp->aux.ddc);
> }
>
> static void
> intel_dp_update_dfp(struct intel_dp *intel_dp,
> - const struct edid *edid)
> + const struct drm_edid *drm_edid)
> {
> struct drm_i915_private *i915 = dp_to_i915(intel_dp);
> struct intel_connector *connector = intel_dp->attached_connector;
> + const struct edid *edid;
> +
> + /* FIXME: Get rid of drm_edid_raw() */
> + edid = drm_edid_raw(drm_edid);
>
> intel_dp->dfp.max_bpc =
> drm_dp_downstream_max_bpc(intel_dp->dpcd,
> @@ -4597,21 +4600,27 @@ intel_dp_set_edid(struct intel_dp *intel_dp)
> {
> struct drm_i915_private *i915 = dp_to_i915(intel_dp);
> struct intel_connector *connector = intel_dp->attached_connector;
> - struct edid *edid;
> + const struct drm_edid *drm_edid;
> + const struct edid *edid;
> bool vrr_capable;
>
> intel_dp_unset_edid(intel_dp);
> - edid = intel_dp_get_edid(intel_dp);
> - connector->detect_edid = edid;
> + drm_edid = intel_dp_get_edid(intel_dp);
> + connector->detect_edid = drm_edid;
> +
> + /* Below we depend on display info having been updated */
> + drm_edid_connector_update(&connector->base, drm_edid);
>
> vrr_capable = intel_vrr_is_capable(connector);
> drm_dbg_kms(&i915->drm, "[CONNECTOR:%d:%s] VRR capable: %s\n",
> connector->base.base.id, connector->base.name, str_yes_no(vrr_capable));
> drm_connector_set_vrr_capable_property(&connector->base, vrr_capable);
>
> - intel_dp_update_dfp(intel_dp, edid);
> + intel_dp_update_dfp(intel_dp, drm_edid);
> intel_dp_update_420(intel_dp);
>
> + /* FIXME: Get rid of drm_edid_raw() */
> + edid = drm_edid_raw(drm_edid);
> if (edid && edid->input & DRM_EDID_INPUT_DIGITAL) {
> intel_dp->has_hdmi_sink = drm_detect_hdmi_monitor(edid);
> intel_dp->has_audio = drm_detect_monitor_audio(edid);
> @@ -4626,7 +4635,7 @@ intel_dp_unset_edid(struct intel_dp *intel_dp)
> struct intel_connector *connector = intel_dp->attached_connector;
>
> drm_dp_cec_unset_edid(&intel_dp->aux);
> - kfree(connector->detect_edid);
> + drm_edid_free(connector->detect_edid);
> connector->detect_edid = NULL;
>
> intel_dp->has_hdmi_sink = false;
> @@ -4790,12 +4799,10 @@ intel_dp_force(struct drm_connector *connector)
> static int intel_dp_get_modes(struct drm_connector *connector)
> {
> struct intel_connector *intel_connector = to_intel_connector(connector);
> - struct edid *edid;
> - int num_modes = 0;
> + int num_modes;
>
> - edid = intel_connector->detect_edid;
> - if (edid)
> - num_modes = intel_connector_update_modes(connector, edid);
> + /* drm_edid_connector_update() done in ->detect() or ->force() */
> + num_modes = drm_edid_connector_add_modes(connector);
>
> /* Also add fixed mode, which may or may not be present in EDID */
> if (intel_dp_is_edp(intel_attached_dp(intel_connector)))
> @@ -4804,7 +4811,7 @@ static int intel_dp_get_modes(struct drm_connector *connector)
> if (num_modes)
> return num_modes;
>
> - if (!edid) {
> + if (!intel_connector->detect_edid) {
> struct intel_dp *intel_dp = intel_attached_dp(intel_connector);
> struct drm_display_mode *mode;
>
> @@ -5240,7 +5247,7 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp,
> struct drm_display_mode *fixed_mode;
> struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
> bool has_dpcd;
> - struct edid *edid;
> + const struct drm_edid *drm_edid;
>
> if (!intel_dp_is_edp(intel_dp))
> return true;
> @@ -5287,29 +5294,35 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp,
> }
>
> mutex_lock(&dev_priv->drm.mode_config.mutex);
> - edid = drm_get_edid(connector, &intel_dp->aux.ddc);
> - if (!edid) {
> + drm_edid = drm_edid_read_ddc(connector, &intel_dp->aux.ddc);
> + if (!drm_edid) {
> + const struct edid *edid;
> +
> /* Fallback to EDID from ACPI OpRegion, if any */
> + /* FIXME: Make intel_opregion_get_edid() return drm_edid */
> edid = intel_opregion_get_edid(intel_connector);
> - if (edid)
> + if (edid) {
> + drm_edid = drm_edid_alloc(edid, (edid->extensions + 1) * EDID_LENGTH);
> drm_dbg_kms(&dev_priv->drm,
> "[CONNECTOR:%d:%s] Using OpRegion EDID\n",
> connector->base.id, connector->name);
> - }
> - if (edid) {
> - if (drm_add_edid_modes(connector, edid)) {
> - drm_connector_update_edid_property(connector, edid);
> - } else {
> kfree(edid);
> - edid = ERR_PTR(-EINVAL);
> + }
> + }
> + if (drm_edid) {
> + if (drm_edid_connector_update(connector, drm_edid) ||
> + !drm_edid_connector_add_modes(connector)) {
> + drm_edid_connector_update(connector, NULL);
> + drm_edid_free(drm_edid);
> + drm_edid = ERR_PTR(-EINVAL);
> }
> } else {
> - edid = ERR_PTR(-ENOENT);
> + drm_edid = ERR_PTR(-ENOENT);
> }
> - intel_connector->edid = edid;
> + intel_connector->edid = drm_edid;
>
> - intel_bios_init_panel_late(dev_priv, &intel_connector->panel,
> - encoder->devdata, IS_ERR(edid) ? NULL : edid);
> + intel_bios_init_panel_late(dev_priv, &intel_connector->panel, encoder->devdata,
> + IS_ERR_OR_NULL(drm_edid) ? NULL : drm_edid_raw(drm_edid));
>
> intel_panel_add_edid_fixed_modes(intel_connector, true);
>
> diff --git a/drivers/gpu/drm/i915/display/intel_hdmi.c b/drivers/gpu/drm/i915/display/intel_hdmi.c
> index 6a2ee342eab5..3431193f0b47 100644
> --- a/drivers/gpu/drm/i915/display/intel_hdmi.c
> +++ b/drivers/gpu/drm/i915/display/intel_hdmi.c
> @@ -2360,7 +2360,7 @@ intel_hdmi_unset_edid(struct drm_connector *connector)
> intel_hdmi->dp_dual_mode.type = DRM_DP_DUAL_MODE_NONE;
> intel_hdmi->dp_dual_mode.max_tmds_clock = 0;
>
> - kfree(to_intel_connector(connector)->detect_edid);
> + drm_edid_free(to_intel_connector(connector)->detect_edid);
> to_intel_connector(connector)->detect_edid = NULL;
> }
>
> @@ -2421,7 +2421,8 @@ intel_hdmi_set_edid(struct drm_connector *connector)
> struct drm_i915_private *dev_priv = to_i915(connector->dev);
> struct intel_hdmi *intel_hdmi = intel_attached_hdmi(to_intel_connector(connector));
> intel_wakeref_t wakeref;
> - struct edid *edid;
> + const struct drm_edid *drm_edid;
> + const struct edid *edid;
> bool connected = false;
> struct i2c_adapter *i2c;
>
> @@ -2429,17 +2430,23 @@ intel_hdmi_set_edid(struct drm_connector *connector)
>
> i2c = intel_gmbus_get_adapter(dev_priv, intel_hdmi->ddc_bus);
>
> - edid = drm_get_edid(connector, i2c);
> + drm_edid = drm_edid_read_ddc(connector, i2c);
>
> - if (!edid && !intel_gmbus_is_forced_bit(i2c)) {
> + if (!drm_edid && !intel_gmbus_is_forced_bit(i2c)) {
> drm_dbg_kms(&dev_priv->drm,
> "HDMI GMBUS EDID read failed, retry using GPIO bit-banging\n");
> intel_gmbus_force_bit(i2c, true);
> - edid = drm_get_edid(connector, i2c);
> + drm_edid = drm_edid_read_ddc(connector, i2c);
> intel_gmbus_force_bit(i2c, false);
> }
>
> - to_intel_connector(connector)->detect_edid = edid;
> + /* Below we depend on display info having been updated */
> + drm_edid_connector_update(connector, drm_edid);
> +
> + to_intel_connector(connector)->detect_edid = drm_edid;
> +
> + /* FIXME: Get rid of drm_edid_raw() */
> + edid = drm_edid_raw(drm_edid);
> if (edid && edid->input & DRM_EDID_INPUT_DIGITAL) {
> intel_hdmi->has_audio = drm_detect_monitor_audio(edid);
> intel_hdmi->has_hdmi_sink = drm_detect_hdmi_monitor(edid);
> @@ -2515,13 +2522,8 @@ intel_hdmi_force(struct drm_connector *connector)
>
> static int intel_hdmi_get_modes(struct drm_connector *connector)
> {
> - struct edid *edid;
> -
> - edid = to_intel_connector(connector)->detect_edid;
> - if (edid == NULL)
> - return 0;
> -
> - return intel_connector_update_modes(connector, edid);
> + /* drm_edid_connector_update() done in ->detect() or ->force() */
> + return drm_edid_connector_add_modes(connector);
> }
>
> static struct i2c_adapter *
> diff --git a/drivers/gpu/drm/i915/display/intel_lvds.c b/drivers/gpu/drm/i915/display/intel_lvds.c
> index aecec992cd0d..6a98787edf48 100644
> --- a/drivers/gpu/drm/i915/display/intel_lvds.c
> +++ b/drivers/gpu/drm/i915/display/intel_lvds.c
> @@ -479,8 +479,11 @@ static int intel_lvds_get_modes(struct drm_connector *connector)
> struct intel_connector *intel_connector = to_intel_connector(connector);
>
> /* use cached edid if we have one */
> - if (!IS_ERR_OR_NULL(intel_connector->edid))
> - return drm_add_edid_modes(connector, intel_connector->edid);
> + if (!IS_ERR_OR_NULL(intel_connector->edid)) {
> + drm_edid_connector_update(connector, intel_connector->edid);
Isn't this update redundant?
> +
> + return drm_edid_connector_add_modes(connector);
> + }
>
> return intel_panel_get_modes(intel_connector);
> }
> @@ -834,7 +837,7 @@ void intel_lvds_init(struct drm_i915_private *dev_priv)
> struct intel_connector *intel_connector;
> struct drm_connector *connector;
> struct drm_encoder *encoder;
> - struct edid *edid;
> + const struct drm_edid *drm_edid;
> i915_reg_t lvds_reg;
> u32 lvds;
> u8 pin;
> @@ -945,27 +948,36 @@ void intel_lvds_init(struct drm_i915_private *dev_priv)
> * preferred mode is the right one.
> */
> mutex_lock(&dev_priv->drm.mode_config.mutex);
> - if (vga_switcheroo_handler_flags() & VGA_SWITCHEROO_CAN_SWITCH_DDC)
> + if (vga_switcheroo_handler_flags() & VGA_SWITCHEROO_CAN_SWITCH_DDC) {
> + const struct edid *edid;
> +
> + /* FIXME: Make drm_get_edid_switcheroo() return drm_edid */
> edid = drm_get_edid_switcheroo(connector,
> - intel_gmbus_get_adapter(dev_priv, pin));
> - else
> - edid = drm_get_edid(connector,
> - intel_gmbus_get_adapter(dev_priv, pin));
> - if (edid) {
> - if (drm_add_edid_modes(connector, edid)) {
> - drm_connector_update_edid_property(connector,
> - edid);
> - } else {
> + intel_gmbus_get_adapter(dev_priv, pin));
> + if (edid) {
> + drm_edid = drm_edid_alloc(edid, (edid->extensions + 1) * EDID_LENGTH);
> kfree(edid);
> - edid = ERR_PTR(-EINVAL);
> + } else {
> + drm_edid = NULL;
> + }
> + } else {
> + drm_edid = drm_edid_read_ddc(connector,
> + intel_gmbus_get_adapter(dev_priv, pin));
> + }
> + if (drm_edid) {
> + if (drm_edid_connector_update(connector, drm_edid) ||
> + !drm_edid_connector_add_modes(connector)) {
> + drm_edid_connector_update(connector, NULL);
> + drm_edid_free(drm_edid);
> + drm_edid = ERR_PTR(-EINVAL);
> }
> } else {
> - edid = ERR_PTR(-ENOENT);
> + drm_edid = ERR_PTR(-ENOENT);
> }
> - intel_connector->edid = edid;
> + intel_connector->edid = drm_edid;
>
> intel_bios_init_panel_late(dev_priv, &intel_connector->panel, NULL,
> - IS_ERR(edid) ? NULL : edid);
> + IS_ERR_OR_NULL(drm_edid) ? NULL : drm_edid_raw(drm_edid));
>
> /* Try EDID first */
> intel_panel_add_edid_fixed_modes(intel_connector, true);
> --
> 2.34.1
--
Ville Syrjälä
Intel
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [Intel-gfx] [PATCH v8 6/8] drm/i915/bios: convert intel_bios_init_panel() to drm_edid
2023-01-19 16:18 ` [Intel-gfx] [PATCH v8 6/8] drm/i915/bios: convert intel_bios_init_panel() " Jani Nikula
@ 2023-01-20 18:48 ` Ville Syrjälä
0 siblings, 0 replies; 18+ messages in thread
From: Ville Syrjälä @ 2023-01-20 18:48 UTC (permalink / raw)
To: Jani Nikula; +Cc: intel-gfx, dri-devel
On Thu, Jan 19, 2023 at 06:18:59PM +0200, Jani Nikula wrote:
> Try to use struct drm_edid where possible, even if having to fall back
> to looking into struct edid down low via drm_edid_raw().
>
> v2: Rebase
>
> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> ---
> drivers/gpu/drm/i915/display/intel_bios.c | 23 ++++++++++++-----------
> drivers/gpu/drm/i915/display/intel_bios.h | 4 ++--
> drivers/gpu/drm/i915/display/intel_dp.c | 2 +-
> drivers/gpu/drm/i915/display/intel_lvds.c | 2 +-
> 4 files changed, 16 insertions(+), 15 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_bios.c b/drivers/gpu/drm/i915/display/intel_bios.c
> index 78abe34c7a42..e6ca51232dcf 100644
> --- a/drivers/gpu/drm/i915/display/intel_bios.c
> +++ b/drivers/gpu/drm/i915/display/intel_bios.c
> @@ -619,14 +619,14 @@ static void dump_pnp_id(struct drm_i915_private *i915,
>
> static int opregion_get_panel_type(struct drm_i915_private *i915,
> const struct intel_bios_encoder_data *devdata,
> - const struct edid *edid, bool use_fallback)
> + const struct drm_edid *drm_edid, bool use_fallback)
> {
> return intel_opregion_get_panel_type(i915);
> }
>
> static int vbt_get_panel_type(struct drm_i915_private *i915,
> const struct intel_bios_encoder_data *devdata,
> - const struct edid *edid, bool use_fallback)
> + const struct drm_edid *drm_edid, bool use_fallback)
> {
> const struct bdb_lvds_options *lvds_options;
>
> @@ -651,12 +651,13 @@ static int vbt_get_panel_type(struct drm_i915_private *i915,
>
> static int pnpid_get_panel_type(struct drm_i915_private *i915,
> const struct intel_bios_encoder_data *devdata,
> - const struct edid *edid, bool use_fallback)
> + const struct drm_edid *drm_edid, bool use_fallback)
> {
> const struct bdb_lvds_lfp_data *data;
> const struct bdb_lvds_lfp_data_ptrs *ptrs;
> const struct lvds_pnp_id *edid_id;
> struct lvds_pnp_id edid_id_nodate;
> + const struct edid *edid = drm_edid_raw(drm_edid); /* FIXME */
> int i, best = -1;
>
> if (!edid)
> @@ -700,7 +701,7 @@ static int pnpid_get_panel_type(struct drm_i915_private *i915,
>
> static int fallback_get_panel_type(struct drm_i915_private *i915,
> const struct intel_bios_encoder_data *devdata,
> - const struct edid *edid, bool use_fallback)
> + const struct drm_edid *drm_edid, bool use_fallback)
> {
> return use_fallback ? 0 : -1;
> }
> @@ -714,13 +715,13 @@ enum panel_type {
>
> static int get_panel_type(struct drm_i915_private *i915,
> const struct intel_bios_encoder_data *devdata,
> - const struct edid *edid, bool use_fallback)
> + const struct drm_edid *drm_edid, bool use_fallback)
> {
> struct {
> const char *name;
> int (*get_panel_type)(struct drm_i915_private *i915,
> const struct intel_bios_encoder_data *devdata,
> - const struct edid *edid, bool use_fallback);
> + const struct drm_edid *drm_edid, bool use_fallback);
> int panel_type;
> } panel_types[] = {
> [PANEL_TYPE_OPREGION] = {
> @@ -744,7 +745,7 @@ static int get_panel_type(struct drm_i915_private *i915,
>
> for (i = 0; i < ARRAY_SIZE(panel_types); i++) {
> panel_types[i].panel_type = panel_types[i].get_panel_type(i915, devdata,
> - edid, use_fallback);
> + drm_edid, use_fallback);
>
> drm_WARN_ON(&i915->drm, panel_types[i].panel_type > 0xf &&
> panel_types[i].panel_type != 0xff);
> @@ -3186,7 +3187,7 @@ void intel_bios_init(struct drm_i915_private *i915)
> static void intel_bios_init_panel(struct drm_i915_private *i915,
> struct intel_panel *panel,
> const struct intel_bios_encoder_data *devdata,
> - const struct edid *edid,
> + const struct drm_edid *drm_edid,
> bool use_fallback)
> {
> /* already have it? */
> @@ -3196,7 +3197,7 @@ static void intel_bios_init_panel(struct drm_i915_private *i915,
> }
>
> panel->vbt.panel_type = get_panel_type(i915, devdata,
> - edid, use_fallback);
> + drm_edid, use_fallback);
> if (panel->vbt.panel_type < 0) {
> drm_WARN_ON(&i915->drm, use_fallback);
> return;
> @@ -3227,9 +3228,9 @@ void intel_bios_init_panel_early(struct drm_i915_private *i915,
> void intel_bios_init_panel_late(struct drm_i915_private *i915,
> struct intel_panel *panel,
> const struct intel_bios_encoder_data *devdata,
> - const struct edid *edid)
> + const struct drm_edid *drm_edid)
> {
> - intel_bios_init_panel(i915, panel, devdata, edid, true);
> + intel_bios_init_panel(i915, panel, devdata, drm_edid, true);
> }
>
> /**
> diff --git a/drivers/gpu/drm/i915/display/intel_bios.h b/drivers/gpu/drm/i915/display/intel_bios.h
> index ff1fdd2e0c1c..d221f784aa88 100644
> --- a/drivers/gpu/drm/i915/display/intel_bios.h
> +++ b/drivers/gpu/drm/i915/display/intel_bios.h
> @@ -32,8 +32,8 @@
>
> #include <linux/types.h>
>
> +struct drm_edid;
> struct drm_i915_private;
> -struct edid;
> struct intel_bios_encoder_data;
> struct intel_crtc_state;
> struct intel_encoder;
> @@ -238,7 +238,7 @@ void intel_bios_init_panel_early(struct drm_i915_private *dev_priv,
> void intel_bios_init_panel_late(struct drm_i915_private *dev_priv,
> struct intel_panel *panel,
> const struct intel_bios_encoder_data *devdata,
> - const struct edid *edid);
> + const struct drm_edid *drm_edid);
> void intel_bios_fini_panel(struct intel_panel *panel);
> void intel_bios_driver_remove(struct drm_i915_private *dev_priv);
> bool intel_bios_is_valid_vbt(const void *buf, size_t size);
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
> index cd7fae1b7543..4cc7c04b9bda 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> @@ -5322,7 +5322,7 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp,
> intel_connector->edid = drm_edid;
>
> intel_bios_init_panel_late(dev_priv, &intel_connector->panel, encoder->devdata,
> - IS_ERR_OR_NULL(drm_edid) ? NULL : drm_edid_raw(drm_edid));
> + IS_ERR(drm_edid) ? NULL : drm_edid);
>
> intel_panel_add_edid_fixed_modes(intel_connector, true);
>
> diff --git a/drivers/gpu/drm/i915/display/intel_lvds.c b/drivers/gpu/drm/i915/display/intel_lvds.c
> index 6a98787edf48..9f6910bba2e9 100644
> --- a/drivers/gpu/drm/i915/display/intel_lvds.c
> +++ b/drivers/gpu/drm/i915/display/intel_lvds.c
> @@ -977,7 +977,7 @@ void intel_lvds_init(struct drm_i915_private *dev_priv)
> intel_connector->edid = drm_edid;
>
> intel_bios_init_panel_late(dev_priv, &intel_connector->panel, NULL,
> - IS_ERR_OR_NULL(drm_edid) ? NULL : drm_edid_raw(drm_edid));
> + IS_ERR(drm_edid) ? NULL : drm_edid);
>
> /* Try EDID first */
> intel_panel_add_edid_fixed_modes(intel_connector, true);
> --
> 2.34.1
--
Ville Syrjälä
Intel
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [Intel-gfx] [PATCH v8 7/8] drm/i915/opregion: convert intel_opregion_get_edid() to struct drm_edid
2023-01-19 16:19 ` [Intel-gfx] [PATCH v8 7/8] drm/i915/opregion: convert intel_opregion_get_edid() to struct drm_edid Jani Nikula
@ 2023-01-20 18:49 ` Ville Syrjälä
0 siblings, 0 replies; 18+ messages in thread
From: Ville Syrjälä @ 2023-01-20 18:49 UTC (permalink / raw)
To: Jani Nikula; +Cc: intel-gfx, dri-devel
On Thu, Jan 19, 2023 at 06:19:00PM +0200, Jani Nikula wrote:
> Simplify validation and use by converting to drm_edid.
>
> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> ---
> drivers/gpu/drm/i915/display/intel_dp.c | 10 ++-----
> drivers/gpu/drm/i915/display/intel_opregion.c | 29 +++++++------------
> drivers/gpu/drm/i915/display/intel_opregion.h | 4 +--
> 3 files changed, 15 insertions(+), 28 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
> index 4cc7c04b9bda..a44eefb97e8d 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> @@ -5296,18 +5296,12 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp,
> mutex_lock(&dev_priv->drm.mode_config.mutex);
> drm_edid = drm_edid_read_ddc(connector, &intel_dp->aux.ddc);
> if (!drm_edid) {
> - const struct edid *edid;
> -
> /* Fallback to EDID from ACPI OpRegion, if any */
> - /* FIXME: Make intel_opregion_get_edid() return drm_edid */
> - edid = intel_opregion_get_edid(intel_connector);
> - if (edid) {
> - drm_edid = drm_edid_alloc(edid, (edid->extensions + 1) * EDID_LENGTH);
> + drm_edid = intel_opregion_get_edid(intel_connector);
> + if (drm_edid)
> drm_dbg_kms(&dev_priv->drm,
> "[CONNECTOR:%d:%s] Using OpRegion EDID\n",
> connector->base.id, connector->name);
> - kfree(edid);
> - }
> }
> if (drm_edid) {
> if (drm_edid_connector_update(connector, drm_edid) ||
> diff --git a/drivers/gpu/drm/i915/display/intel_opregion.c b/drivers/gpu/drm/i915/display/intel_opregion.c
> index e0184745632c..b8dce0576512 100644
> --- a/drivers/gpu/drm/i915/display/intel_opregion.c
> +++ b/drivers/gpu/drm/i915/display/intel_opregion.c
> @@ -1101,41 +1101,34 @@ intel_opregion_get_panel_type(struct drm_i915_private *dev_priv)
> * The EDID in the OpRegion, or NULL if there is none or it's invalid.
> *
> */
> -struct edid *intel_opregion_get_edid(struct intel_connector *intel_connector)
> +const struct drm_edid *intel_opregion_get_edid(struct intel_connector *intel_connector)
> {
> struct drm_connector *connector = &intel_connector->base;
> struct drm_i915_private *i915 = to_i915(connector->dev);
> struct intel_opregion *opregion = &i915->display.opregion;
> - const void *in_edid;
> - const struct edid *edid;
> - struct edid *new_edid;
> + const struct drm_edid *drm_edid;
> + const void *edid;
> int len;
>
> if (!opregion->asle_ext)
> return NULL;
>
> - in_edid = opregion->asle_ext->bddc;
> + edid = opregion->asle_ext->bddc;
>
> /* Validity corresponds to number of 128-byte blocks */
> len = (opregion->asle_ext->phed & ASLE_PHED_EDID_VALID_MASK) * 128;
> - if (!len || !memchr_inv(in_edid, 0, len))
> + if (!len || !memchr_inv(edid, 0, len))
> return NULL;
>
> - edid = in_edid;
> + drm_edid = drm_edid_alloc(edid, len);
>
> - if (len < EDID_LENGTH * (1 + edid->extensions)) {
> - drm_dbg_kms(&i915->drm, "Invalid EDID in ACPI OpRegion (Mailbox #5): too short\n");
> - return NULL;
> - }
> - new_edid = drm_edid_duplicate(edid);
> - if (!new_edid)
> - return NULL;
> - if (!drm_edid_is_valid(new_edid)) {
> - kfree(new_edid);
> + if (!drm_edid_valid(drm_edid)) {
> drm_dbg_kms(&i915->drm, "Invalid EDID in ACPI OpRegion (Mailbox #5)\n");
> - return NULL;
> + drm_edid_free(drm_edid);
> + drm_edid = NULL;
> }
> - return new_edid;
> +
> + return drm_edid;
> }
>
> bool intel_opregion_headless_sku(struct drm_i915_private *i915)
> diff --git a/drivers/gpu/drm/i915/display/intel_opregion.h b/drivers/gpu/drm/i915/display/intel_opregion.h
> index 2f261f985400..d02e6696a050 100644
> --- a/drivers/gpu/drm/i915/display/intel_opregion.h
> +++ b/drivers/gpu/drm/i915/display/intel_opregion.h
> @@ -74,7 +74,7 @@ int intel_opregion_notify_encoder(struct intel_encoder *intel_encoder,
> int intel_opregion_notify_adapter(struct drm_i915_private *dev_priv,
> pci_power_t state);
> int intel_opregion_get_panel_type(struct drm_i915_private *dev_priv);
> -struct edid *intel_opregion_get_edid(struct intel_connector *connector);
> +const struct drm_edid *intel_opregion_get_edid(struct intel_connector *connector);
>
> bool intel_opregion_headless_sku(struct drm_i915_private *i915);
>
> @@ -123,7 +123,7 @@ static inline int intel_opregion_get_panel_type(struct drm_i915_private *dev)
> return -ENODEV;
> }
>
> -static inline struct edid *
> +static inline const struct drm_edid *
> intel_opregion_get_edid(struct intel_connector *connector)
> {
> return NULL;
> --
> 2.34.1
--
Ville Syrjälä
Intel
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [Intel-gfx] [PATCH v8 8/8] drm/i915/panel: move panel fixed EDID to struct intel_panel
2023-01-19 16:19 ` [Intel-gfx] [PATCH v8 8/8] drm/i915/panel: move panel fixed EDID to struct intel_panel Jani Nikula
@ 2023-01-20 18:49 ` Ville Syrjälä
0 siblings, 0 replies; 18+ messages in thread
From: Ville Syrjälä @ 2023-01-20 18:49 UTC (permalink / raw)
To: Jani Nikula; +Cc: intel-gfx, dri-devel
On Thu, Jan 19, 2023 at 06:19:01PM +0200, Jani Nikula wrote:
> It's a bit confusing to have two cached EDIDs in struct intel_connector
> with slightly different purposes. Make the distinction a bit clearer by
> moving the EDID cached for eDP and LVDS panels at connector init time to
> struct intel_panel, and name it fixed_edid. That's what it is, a fixed
> EDID for the panels.
>
> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> ---
> drivers/gpu/drm/i915/display/icl_dsi.c | 2 +-
> .../gpu/drm/i915/display/intel_connector.c | 3 ---
> .../drm/i915/display/intel_display_types.h | 6 ++++--
> drivers/gpu/drm/i915/display/intel_dp.c | 20 +++++++++----------
> drivers/gpu/drm/i915/display/intel_dvo.c | 2 +-
> drivers/gpu/drm/i915/display/intel_lvds.c | 11 +++++-----
> drivers/gpu/drm/i915/display/intel_panel.c | 10 +++++++++-
> drivers/gpu/drm/i915/display/intel_panel.h | 4 +++-
> drivers/gpu/drm/i915/display/intel_sdvo.c | 2 +-
> drivers/gpu/drm/i915/display/vlv_dsi.c | 2 +-
> 10 files changed, 35 insertions(+), 27 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/icl_dsi.c b/drivers/gpu/drm/i915/display/icl_dsi.c
> index ae14c794c4bc..d56d01f07bb7 100644
> --- a/drivers/gpu/drm/i915/display/icl_dsi.c
> +++ b/drivers/gpu/drm/i915/display/icl_dsi.c
> @@ -2054,7 +2054,7 @@ void icl_dsi_init(struct drm_i915_private *dev_priv)
> goto err;
> }
>
> - intel_panel_init(intel_connector);
> + intel_panel_init(intel_connector, NULL);
>
> intel_backlight_setup(intel_connector, INVALID_PIPE);
>
> diff --git a/drivers/gpu/drm/i915/display/intel_connector.c b/drivers/gpu/drm/i915/display/intel_connector.c
> index 4814d4e2f7f9..257afac34839 100644
> --- a/drivers/gpu/drm/i915/display/intel_connector.c
> +++ b/drivers/gpu/drm/i915/display/intel_connector.c
> @@ -99,9 +99,6 @@ void intel_connector_destroy(struct drm_connector *connector)
>
> intel_hdcp_cleanup(intel_connector);
>
> - if (!IS_ERR_OR_NULL(intel_connector->edid))
> - drm_edid_free(intel_connector->edid);
> -
> intel_panel_fini(intel_connector);
>
> drm_connector_cleanup(connector);
> diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
> index 34dc850340b8..6feb232bb1c2 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_types.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_types.h
> @@ -351,6 +351,9 @@ struct intel_vbt_panel_data {
> };
>
> struct intel_panel {
> + /* Fixed EDID for eDP and LVDS. May hold ERR_PTR for invalid EDID. */
> + const struct drm_edid *fixed_edid;
> +
> struct list_head fixed_modes;
>
> /* backlight */
> @@ -591,8 +594,7 @@ struct intel_connector {
> /* Panel info for eDP and LVDS */
> struct intel_panel panel;
>
> - /* Cached EDID for eDP and LVDS. May hold ERR_PTR for invalid EDID. */
> - const struct drm_edid *edid;
> + /* Cached EDID for detect. */
> const struct drm_edid *detect_edid;
>
> /* Number of times hotplug detection was tried after an HPD interrupt */
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
> index a44eefb97e8d..e14c13444643 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> @@ -4477,18 +4477,19 @@ bool intel_digital_port_connected(struct intel_encoder *encoder)
> static const struct drm_edid *
> intel_dp_get_edid(struct intel_dp *intel_dp)
> {
> - struct intel_connector *intel_connector = intel_dp->attached_connector;
> + struct intel_connector *connector = intel_dp->attached_connector;
> + const struct drm_edid *fixed_edid = connector->panel.fixed_edid;
>
> - /* use cached edid if we have one */
> - if (intel_connector->edid) {
> + /* Use panel fixed edid if we have one */
> + if (fixed_edid) {
> /* invalid edid */
> - if (IS_ERR(intel_connector->edid))
> + if (IS_ERR(fixed_edid))
> return NULL;
>
> - return drm_edid_dup(intel_connector->edid);
> - } else
> - return drm_edid_read_ddc(&intel_connector->base,
> - &intel_dp->aux.ddc);
> + return drm_edid_dup(fixed_edid);
> + }
> +
> + return drm_edid_read_ddc(&connector->base, &intel_dp->aux.ddc);
> }
>
> static void
> @@ -5313,7 +5314,6 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp,
> } else {
> drm_edid = ERR_PTR(-ENOENT);
> }
> - intel_connector->edid = drm_edid;
>
> intel_bios_init_panel_late(dev_priv, &intel_connector->panel, encoder->devdata,
> IS_ERR(drm_edid) ? NULL : drm_edid);
> @@ -5340,7 +5340,7 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp,
> goto out_vdd_off;
> }
>
> - intel_panel_init(intel_connector);
> + intel_panel_init(intel_connector, drm_edid);
>
> intel_edp_backlight_setup(intel_dp, intel_connector);
>
> diff --git a/drivers/gpu/drm/i915/display/intel_dvo.c b/drivers/gpu/drm/i915/display/intel_dvo.c
> index 4aeae0f3ac91..0be8105cb18a 100644
> --- a/drivers/gpu/drm/i915/display/intel_dvo.c
> +++ b/drivers/gpu/drm/i915/display/intel_dvo.c
> @@ -554,6 +554,6 @@ void intel_dvo_init(struct drm_i915_private *i915)
> */
> intel_panel_add_encoder_fixed_mode(connector, encoder);
>
> - intel_panel_init(connector);
> + intel_panel_init(connector, NULL);
> }
> }
> diff --git a/drivers/gpu/drm/i915/display/intel_lvds.c b/drivers/gpu/drm/i915/display/intel_lvds.c
> index 9f6910bba2e9..a1557d84ce0a 100644
> --- a/drivers/gpu/drm/i915/display/intel_lvds.c
> +++ b/drivers/gpu/drm/i915/display/intel_lvds.c
> @@ -477,10 +477,11 @@ static int intel_lvds_compute_config(struct intel_encoder *intel_encoder,
> static int intel_lvds_get_modes(struct drm_connector *connector)
> {
> struct intel_connector *intel_connector = to_intel_connector(connector);
> + const struct drm_edid *fixed_edid = intel_connector->panel.fixed_edid;
>
> - /* use cached edid if we have one */
> - if (!IS_ERR_OR_NULL(intel_connector->edid)) {
> - drm_edid_connector_update(connector, intel_connector->edid);
> + /* Use panel fixed edid if we have one */
> + if (!IS_ERR_OR_NULL(fixed_edid)) {
> + drm_edid_connector_update(connector, fixed_edid);
>
> return drm_edid_connector_add_modes(connector);
> }
> @@ -974,8 +975,6 @@ void intel_lvds_init(struct drm_i915_private *dev_priv)
> } else {
> drm_edid = ERR_PTR(-ENOENT);
> }
> - intel_connector->edid = drm_edid;
> -
> intel_bios_init_panel_late(dev_priv, &intel_connector->panel, NULL,
> IS_ERR(drm_edid) ? NULL : drm_edid);
>
> @@ -1000,7 +999,7 @@ void intel_lvds_init(struct drm_i915_private *dev_priv)
> if (!intel_panel_preferred_fixed_mode(intel_connector))
> goto failed;
>
> - intel_panel_init(intel_connector);
> + intel_panel_init(intel_connector, drm_edid);
>
> intel_backlight_setup(intel_connector, INVALID_PIPE);
>
> diff --git a/drivers/gpu/drm/i915/display/intel_panel.c b/drivers/gpu/drm/i915/display/intel_panel.c
> index 3b1004b019a8..42aa04bac261 100644
> --- a/drivers/gpu/drm/i915/display/intel_panel.c
> +++ b/drivers/gpu/drm/i915/display/intel_panel.c
> @@ -31,6 +31,8 @@
> #include <linux/kernel.h>
> #include <linux/pwm.h>
>
> +#include <drm/drm_edid.h>
> +
> #include "i915_reg.h"
> #include "intel_backlight.h"
> #include "intel_connector.h"
> @@ -670,10 +672,13 @@ void intel_panel_init_alloc(struct intel_connector *connector)
> INIT_LIST_HEAD(&panel->fixed_modes);
> }
>
> -int intel_panel_init(struct intel_connector *connector)
> +int intel_panel_init(struct intel_connector *connector,
> + const struct drm_edid *fixed_edid)
> {
> struct intel_panel *panel = &connector->panel;
>
> + panel->fixed_edid = fixed_edid;
> +
> intel_backlight_init_funcs(panel);
>
> if (!has_drrs_modes(connector))
> @@ -692,6 +697,9 @@ void intel_panel_fini(struct intel_connector *connector)
> struct intel_panel *panel = &connector->panel;
> struct drm_display_mode *fixed_mode, *next;
>
> + if (!IS_ERR_OR_NULL(panel->fixed_edid))
> + drm_edid_free(panel->fixed_edid);
> +
> intel_backlight_destroy(panel);
>
> intel_bios_fini_panel(panel);
> diff --git a/drivers/gpu/drm/i915/display/intel_panel.h b/drivers/gpu/drm/i915/display/intel_panel.h
> index 4b51e1c51da6..15a8c897b33f 100644
> --- a/drivers/gpu/drm/i915/display/intel_panel.h
> +++ b/drivers/gpu/drm/i915/display/intel_panel.h
> @@ -13,13 +13,15 @@ enum drrs_type;
> struct drm_connector;
> struct drm_connector_state;
> struct drm_display_mode;
> +struct drm_edid;
> struct drm_i915_private;
> struct intel_connector;
> struct intel_crtc_state;
> struct intel_encoder;
>
> void intel_panel_init_alloc(struct intel_connector *connector);
> -int intel_panel_init(struct intel_connector *connector);
> +int intel_panel_init(struct intel_connector *connector,
> + const struct drm_edid *fixed_edid);
> void intel_panel_fini(struct intel_connector *connector);
> enum drm_connector_status
> intel_panel_detect(struct drm_connector *connector, bool force);
> diff --git a/drivers/gpu/drm/i915/display/intel_sdvo.c b/drivers/gpu/drm/i915/display/intel_sdvo.c
> index 21805c15d5eb..c58e5cfa8e88 100644
> --- a/drivers/gpu/drm/i915/display/intel_sdvo.c
> +++ b/drivers/gpu/drm/i915/display/intel_sdvo.c
> @@ -2903,7 +2903,7 @@ intel_sdvo_lvds_init(struct intel_sdvo *intel_sdvo, u16 type)
> mutex_unlock(&i915->drm.mode_config.mutex);
> }
>
> - intel_panel_init(intel_connector);
> + intel_panel_init(intel_connector, NULL);
>
> if (!intel_panel_preferred_fixed_mode(intel_connector))
> goto err;
> diff --git a/drivers/gpu/drm/i915/display/vlv_dsi.c b/drivers/gpu/drm/i915/display/vlv_dsi.c
> index 662bdb656aa3..2289f6b1b4eb 100644
> --- a/drivers/gpu/drm/i915/display/vlv_dsi.c
> +++ b/drivers/gpu/drm/i915/display/vlv_dsi.c
> @@ -1983,7 +1983,7 @@ void vlv_dsi_init(struct drm_i915_private *dev_priv)
> goto err_cleanup_connector;
> }
>
> - intel_panel_init(intel_connector);
> + intel_panel_init(intel_connector, NULL);
>
> intel_backlight_setup(intel_connector, INVALID_PIPE);
>
> --
> 2.34.1
--
Ville Syrjälä
Intel
^ permalink raw reply [flat|nested] 18+ messages in thread
* [Intel-gfx] ✓ Fi.CI.IGT: success for drm/edid: info & modes parsing and drm_edid refactors (rev3)
2023-01-19 16:18 [Intel-gfx] [PATCH v8 0/8] drm/edid: info & modes parsing and drm_edid refactors Jani Nikula
` (8 preceding siblings ...)
2023-01-19 18:14 ` [Intel-gfx] ✓ Fi.CI.BAT: success for drm/edid: info & modes parsing and drm_edid refactors (rev3) Patchwork
@ 2023-01-20 21:51 ` Patchwork
9 siblings, 0 replies; 18+ messages in thread
From: Patchwork @ 2023-01-20 21:51 UTC (permalink / raw)
To: Jani Nikula; +Cc: intel-gfx
[-- Attachment #1: Type: text/plain, Size: 17701 bytes --]
== Series Details ==
Series: drm/edid: info & modes parsing and drm_edid refactors (rev3)
URL : https://patchwork.freedesktop.org/series/112392/
State : success
== Summary ==
CI Bug Log - changes from CI_DRM_12613_full -> Patchwork_112392v3_full
====================================================
Summary
-------
**SUCCESS**
No regressions found.
External URL: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_112392v3/index.html
Participating hosts (12 -> 10)
------------------------------
Missing (2): pig-skl-6260u pig-kbl-iris
Known issues
------------
Here are the changes found in Patchwork_112392v3_full that come from known issues:
### IGT changes ###
#### Issues hit ####
* igt@gem_exec_fair@basic-none@rcs0:
- shard-glk: [PASS][1] -> [FAIL][2] ([i915#2842])
[1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12613/shard-glk5/igt@gem_exec_fair@basic-none@rcs0.html
[2]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_112392v3/shard-glk6/igt@gem_exec_fair@basic-none@rcs0.html
* igt@kms_cursor_legacy@flip-vs-cursor@atomic-transitions:
- shard-glk: [PASS][3] -> [FAIL][4] ([i915#2346])
[3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12613/shard-glk8/igt@kms_cursor_legacy@flip-vs-cursor@atomic-transitions.html
[4]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_112392v3/shard-glk9/igt@kms_cursor_legacy@flip-vs-cursor@atomic-transitions.html
* igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@ac-hdmi-a1-hdmi-a2:
- shard-glk: [PASS][5] -> [FAIL][6] ([i915#79])
[5]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12613/shard-glk1/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@ac-hdmi-a1-hdmi-a2.html
[6]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_112392v3/shard-glk2/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@ac-hdmi-a1-hdmi-a2.html
#### Possible fixes ####
* igt@drm_fdinfo@most-busy-check-all@rcs0:
- {shard-rkl}: [FAIL][7] ([i915#7742]) -> [PASS][8]
[7]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12613/shard-rkl-3/igt@drm_fdinfo@most-busy-check-all@rcs0.html
[8]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_112392v3/shard-rkl-4/igt@drm_fdinfo@most-busy-check-all@rcs0.html
* igt@feature_discovery@psr2:
- {shard-rkl}: [SKIP][9] ([i915#658]) -> [PASS][10]
[9]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12613/shard-rkl-5/igt@feature_discovery@psr2.html
[10]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_112392v3/shard-rkl-6/igt@feature_discovery@psr2.html
* igt@gem_exec_fair@basic-pace-share@rcs0:
- shard-glk: [FAIL][11] ([i915#2842]) -> [PASS][12]
[11]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12613/shard-glk1/igt@gem_exec_fair@basic-pace-share@rcs0.html
[12]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_112392v3/shard-glk2/igt@gem_exec_fair@basic-pace-share@rcs0.html
- {shard-tglu}: [FAIL][13] ([i915#2842]) -> [PASS][14]
[13]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12613/shard-tglu-5/igt@gem_exec_fair@basic-pace-share@rcs0.html
[14]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_112392v3/shard-tglu-6/igt@gem_exec_fair@basic-pace-share@rcs0.html
* igt@gem_exec_reloc@basic-wc:
- {shard-rkl}: [SKIP][15] ([i915#3281]) -> [PASS][16] +6 similar issues
[15]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12613/shard-rkl-1/igt@gem_exec_reloc@basic-wc.html
[16]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_112392v3/shard-rkl-5/igt@gem_exec_reloc@basic-wc.html
* igt@gem_pread@self:
- {shard-rkl}: [SKIP][17] ([i915#3282]) -> [PASS][18]
[17]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12613/shard-rkl-1/igt@gem_pread@self.html
[18]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_112392v3/shard-rkl-5/igt@gem_pread@self.html
* igt@gen9_exec_parse@bb-start-param:
- {shard-rkl}: [SKIP][19] ([i915#2527]) -> [PASS][20] +2 similar issues
[19]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12613/shard-rkl-1/igt@gen9_exec_parse@bb-start-param.html
[20]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_112392v3/shard-rkl-5/igt@gen9_exec_parse@bb-start-param.html
* igt@i915_pm_sseu@full-enable:
- {shard-rkl}: [SKIP][21] ([i915#4387]) -> [PASS][22]
[21]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12613/shard-rkl-1/igt@i915_pm_sseu@full-enable.html
[22]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_112392v3/shard-rkl-5/igt@i915_pm_sseu@full-enable.html
* igt@i915_selftest@live@gt_heartbeat:
- shard-glk: [DMESG-FAIL][23] ([i915#5334]) -> [PASS][24]
[23]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12613/shard-glk2/igt@i915_selftest@live@gt_heartbeat.html
[24]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_112392v3/shard-glk2/igt@i915_selftest@live@gt_heartbeat.html
* igt@kms_frontbuffer_tracking@fbc-1p-pri-indfb-multidraw:
- {shard-rkl}: [SKIP][25] ([i915#1849] / [i915#4098]) -> [PASS][26] +18 similar issues
[25]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12613/shard-rkl-5/igt@kms_frontbuffer_tracking@fbc-1p-pri-indfb-multidraw.html
[26]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_112392v3/shard-rkl-6/igt@kms_frontbuffer_tracking@fbc-1p-pri-indfb-multidraw.html
* igt@kms_psr@cursor_blt:
- {shard-rkl}: [SKIP][27] ([i915#1072]) -> [PASS][28] +1 similar issue
[27]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12613/shard-rkl-5/igt@kms_psr@cursor_blt.html
[28]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_112392v3/shard-rkl-6/igt@kms_psr@cursor_blt.html
* igt@kms_vblank@pipe-b-ts-continuation-idle:
- {shard-rkl}: [SKIP][29] ([i915#1845] / [i915#4098]) -> [PASS][30] +23 similar issues
[29]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12613/shard-rkl-3/igt@kms_vblank@pipe-b-ts-continuation-idle.html
[30]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_112392v3/shard-rkl-6/igt@kms_vblank@pipe-b-ts-continuation-idle.html
* igt@perf@gen12-oa-tlb-invalidate:
- {shard-rkl}: [SKIP][31] ([fdo#109289]) -> [PASS][32]
[31]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12613/shard-rkl-5/igt@perf@gen12-oa-tlb-invalidate.html
[32]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_112392v3/shard-rkl-1/igt@perf@gen12-oa-tlb-invalidate.html
* igt@prime_vgem@basic-fence-read:
- {shard-rkl}: [SKIP][33] ([fdo#109295] / [i915#3291] / [i915#3708]) -> [PASS][34]
[33]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12613/shard-rkl-1/igt@prime_vgem@basic-fence-read.html
[34]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_112392v3/shard-rkl-5/igt@prime_vgem@basic-fence-read.html
{name}: This element is suppressed. This means it is ignored when computing
the status of the difference (SUCCESS, WARNING, or FAILURE).
[fdo#109274]: https://bugs.freedesktop.org/show_bug.cgi?id=109274
[fdo#109279]: https://bugs.freedesktop.org/show_bug.cgi?id=109279
[fdo#109280]: https://bugs.freedesktop.org/show_bug.cgi?id=109280
[fdo#109283]: https://bugs.freedesktop.org/show_bug.cgi?id=109283
[fdo#109285]: https://bugs.freedesktop.org/show_bug.cgi?id=109285
[fdo#109289]: https://bugs.freedesktop.org/show_bug.cgi?id=109289
[fdo#109295]: https://bugs.freedesktop.org/show_bug.cgi?id=109295
[fdo#109303]: https://bugs.freedesktop.org/show_bug.cgi?id=109303
[fdo#109307]: https://bugs.freedesktop.org/show_bug.cgi?id=109307
[fdo#109308]: https://bugs.freedesktop.org/show_bug.cgi?id=109308
[fdo#109314]: https://bugs.freedesktop.org/show_bug.cgi?id=109314
[fdo#109315]: https://bugs.freedesktop.org/show_bug.cgi?id=109315
[fdo#109506]: https://bugs.freedesktop.org/show_bug.cgi?id=109506
[fdo#109642]: https://bugs.freedesktop.org/show_bug.cgi?id=109642
[fdo#110189]: https://bugs.freedesktop.org/show_bug.cgi?id=110189
[fdo#110542]: https://bugs.freedesktop.org/show_bug.cgi?id=110542
[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#111644]: https://bugs.freedesktop.org/show_bug.cgi?id=111644
[fdo#111656]: https://bugs.freedesktop.org/show_bug.cgi?id=111656
[fdo#111825]: https://bugs.freedesktop.org/show_bug.cgi?id=111825
[fdo#111827]: https://bugs.freedesktop.org/show_bug.cgi?id=111827
[fdo#112054]: https://bugs.freedesktop.org/show_bug.cgi?id=112054
[fdo#112283]: https://bugs.freedesktop.org/show_bug.cgi?id=112283
[i915#1072]: https://gitlab.freedesktop.org/drm/intel/issues/1072
[i915#132]: https://gitlab.freedesktop.org/drm/intel/issues/132
[i915#1397]: https://gitlab.freedesktop.org/drm/intel/issues/1397
[i915#1722]: https://gitlab.freedesktop.org/drm/intel/issues/1722
[i915#1769]: https://gitlab.freedesktop.org/drm/intel/issues/1769
[i915#1825]: https://gitlab.freedesktop.org/drm/intel/issues/1825
[i915#1839]: https://gitlab.freedesktop.org/drm/intel/issues/1839
[i915#1845]: https://gitlab.freedesktop.org/drm/intel/issues/1845
[i915#1849]: https://gitlab.freedesktop.org/drm/intel/issues/1849
[i915#1850]: https://gitlab.freedesktop.org/drm/intel/issues/1850
[i915#2346]: https://gitlab.freedesktop.org/drm/intel/issues/2346
[i915#2434]: https://gitlab.freedesktop.org/drm/intel/issues/2434
[i915#2436]: https://gitlab.freedesktop.org/drm/intel/issues/2436
[i915#2527]: https://gitlab.freedesktop.org/drm/intel/issues/2527
[i915#2575]: https://gitlab.freedesktop.org/drm/intel/issues/2575
[i915#2582]: https://gitlab.freedesktop.org/drm/intel/issues/2582
[i915#2587]: https://gitlab.freedesktop.org/drm/intel/issues/2587
[i915#2658]: https://gitlab.freedesktop.org/drm/intel/issues/2658
[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#284]: https://gitlab.freedesktop.org/drm/intel/issues/284
[i915#2842]: https://gitlab.freedesktop.org/drm/intel/issues/2842
[i915#2856]: https://gitlab.freedesktop.org/drm/intel/issues/2856
[i915#2920]: https://gitlab.freedesktop.org/drm/intel/issues/2920
[i915#2994]: https://gitlab.freedesktop.org/drm/intel/issues/2994
[i915#3116]: https://gitlab.freedesktop.org/drm/intel/issues/3116
[i915#315]: https://gitlab.freedesktop.org/drm/intel/issues/315
[i915#3281]: https://gitlab.freedesktop.org/drm/intel/issues/3281
[i915#3282]: https://gitlab.freedesktop.org/drm/intel/issues/3282
[i915#3291]: https://gitlab.freedesktop.org/drm/intel/issues/3291
[i915#3297]: https://gitlab.freedesktop.org/drm/intel/issues/3297
[i915#3299]: https://gitlab.freedesktop.org/drm/intel/issues/3299
[i915#3301]: https://gitlab.freedesktop.org/drm/intel/issues/3301
[i915#3318]: https://gitlab.freedesktop.org/drm/intel/issues/3318
[i915#3359]: https://gitlab.freedesktop.org/drm/intel/issues/3359
[i915#3361]: https://gitlab.freedesktop.org/drm/intel/issues/3361
[i915#3458]: https://gitlab.freedesktop.org/drm/intel/issues/3458
[i915#3469]: https://gitlab.freedesktop.org/drm/intel/issues/3469
[i915#3539]: https://gitlab.freedesktop.org/drm/intel/issues/3539
[i915#3546]: https://gitlab.freedesktop.org/drm/intel/issues/3546
[i915#3555]: https://gitlab.freedesktop.org/drm/intel/issues/3555
[i915#3558]: https://gitlab.freedesktop.org/drm/intel/issues/3558
[i915#3637]: https://gitlab.freedesktop.org/drm/intel/issues/3637
[i915#3638]: https://gitlab.freedesktop.org/drm/intel/issues/3638
[i915#3689]: https://gitlab.freedesktop.org/drm/intel/issues/3689
[i915#3708]: https://gitlab.freedesktop.org/drm/intel/issues/3708
[i915#3734]: https://gitlab.freedesktop.org/drm/intel/issues/3734
[i915#3742]: https://gitlab.freedesktop.org/drm/intel/issues/3742
[i915#3825]: https://gitlab.freedesktop.org/drm/intel/issues/3825
[i915#3826]: https://gitlab.freedesktop.org/drm/intel/issues/3826
[i915#3840]: https://gitlab.freedesktop.org/drm/intel/issues/3840
[i915#3886]: https://gitlab.freedesktop.org/drm/intel/issues/3886
[i915#404]: https://gitlab.freedesktop.org/drm/intel/issues/404
[i915#4070]: https://gitlab.freedesktop.org/drm/intel/issues/4070
[i915#4077]: https://gitlab.freedesktop.org/drm/intel/issues/4077
[i915#4078]: https://gitlab.freedesktop.org/drm/intel/issues/4078
[i915#4083]: https://gitlab.freedesktop.org/drm/intel/issues/4083
[i915#4098]: https://gitlab.freedesktop.org/drm/intel/issues/4098
[i915#4103]: https://gitlab.freedesktop.org/drm/intel/issues/4103
[i915#426]: https://gitlab.freedesktop.org/drm/intel/issues/426
[i915#4270]: https://gitlab.freedesktop.org/drm/intel/issues/4270
[i915#4281]: https://gitlab.freedesktop.org/drm/intel/issues/4281
[i915#4312]: https://gitlab.freedesktop.org/drm/intel/issues/4312
[i915#4349]: https://gitlab.freedesktop.org/drm/intel/issues/4349
[i915#4387]: https://gitlab.freedesktop.org/drm/intel/issues/4387
[i915#4538]: https://gitlab.freedesktop.org/drm/intel/issues/4538
[i915#4613]: https://gitlab.freedesktop.org/drm/intel/issues/4613
[i915#4767]: https://gitlab.freedesktop.org/drm/intel/issues/4767
[i915#4771]: https://gitlab.freedesktop.org/drm/intel/issues/4771
[i915#4812]: https://gitlab.freedesktop.org/drm/intel/issues/4812
[i915#4818]: https://gitlab.freedesktop.org/drm/intel/issues/4818
[i915#4833]: https://gitlab.freedesktop.org/drm/intel/issues/4833
[i915#4852]: https://gitlab.freedesktop.org/drm/intel/issues/4852
[i915#4860]: https://gitlab.freedesktop.org/drm/intel/issues/4860
[i915#4880]: https://gitlab.freedesktop.org/drm/intel/issues/4880
[i915#4881]: https://gitlab.freedesktop.org/drm/intel/issues/4881
[i915#4983]: https://gitlab.freedesktop.org/drm/intel/issues/4983
[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#5288]: https://gitlab.freedesktop.org/drm/intel/issues/5288
[i915#5289]: https://gitlab.freedesktop.org/drm/intel/issues/5289
[i915#5325]: https://gitlab.freedesktop.org/drm/intel/issues/5325
[i915#5327]: https://gitlab.freedesktop.org/drm/intel/issues/5327
[i915#533]: https://gitlab.freedesktop.org/drm/intel/issues/533
[i915#5334]: https://gitlab.freedesktop.org/drm/intel/issues/5334
[i915#5439]: https://gitlab.freedesktop.org/drm/intel/issues/5439
[i915#5461]: https://gitlab.freedesktop.org/drm/intel/issues/5461
[i915#5563]: https://gitlab.freedesktop.org/drm/intel/issues/5563
[i915#5723]: https://gitlab.freedesktop.org/drm/intel/issues/5723
[i915#6095]: https://gitlab.freedesktop.org/drm/intel/issues/6095
[i915#6117]: https://gitlab.freedesktop.org/drm/intel/issues/6117
[i915#6227]: https://gitlab.freedesktop.org/drm/intel/issues/6227
[i915#6245]: https://gitlab.freedesktop.org/drm/intel/issues/6245
[i915#6247]: https://gitlab.freedesktop.org/drm/intel/issues/6247
[i915#6248]: https://gitlab.freedesktop.org/drm/intel/issues/6248
[i915#6252]: https://gitlab.freedesktop.org/drm/intel/issues/6252
[i915#6259]: https://gitlab.freedesktop.org/drm/intel/issues/6259
[i915#6268]: https://gitlab.freedesktop.org/drm/intel/issues/6268
[i915#6301]: https://gitlab.freedesktop.org/drm/intel/issues/6301
[i915#6335]: https://gitlab.freedesktop.org/drm/intel/issues/6335
[i915#6344]: https://gitlab.freedesktop.org/drm/intel/issues/6344
[i915#6403]: https://gitlab.freedesktop.org/drm/intel/issues/6403
[i915#6433]: https://gitlab.freedesktop.org/drm/intel/issues/6433
[i915#6463]: https://gitlab.freedesktop.org/drm/intel/issues/6463
[i915#6497]: https://gitlab.freedesktop.org/drm/intel/issues/6497
[i915#6524]: https://gitlab.freedesktop.org/drm/intel/issues/6524
[i915#658]: https://gitlab.freedesktop.org/drm/intel/issues/658
[i915#6768]: https://gitlab.freedesktop.org/drm/intel/issues/6768
[i915#6944]: https://gitlab.freedesktop.org/drm/intel/issues/6944
[i915#6946]: https://gitlab.freedesktop.org/drm/intel/issues/6946
[i915#7116]: https://gitlab.freedesktop.org/drm/intel/issues/7116
[i915#7118]: https://gitlab.freedesktop.org/drm/intel/issues/7118
[i915#7128]: https://gitlab.freedesktop.org/drm/intel/issues/7128
[i915#7561]: https://gitlab.freedesktop.org/drm/intel/issues/7561
[i915#7651]: https://gitlab.freedesktop.org/drm/intel/issues/7651
[i915#7697]: https://gitlab.freedesktop.org/drm/intel/issues/7697
[i915#7701]: https://gitlab.freedesktop.org/drm/intel/issues/7701
[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
Build changes
-------------
* Linux: CI_DRM_12613 -> Patchwork_112392v3
* Piglit: piglit_4509 -> None
CI-20190529: 20190529
CI_DRM_12613: c79a53a6143abdc789b46eb24cd7ce00924be491 @ git://anongit.freedesktop.org/gfx-ci/linux
IGT_7126: 3aa9364a1e478010aba0d3dfe9183486560ecc60 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
Patchwork_112392v3: c79a53a6143abdc789b46eb24cd7ce00924be491 @ 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_112392v3/index.html
[-- Attachment #2: Type: text/html, Size: 10037 bytes --]
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [Intel-gfx] [PATCH v8 4/8] drm/edid: remove redundant _drm_connector_update_edid_property()
2023-01-19 16:18 ` [Intel-gfx] [PATCH v8 4/8] drm/edid: remove redundant _drm_connector_update_edid_property() Jani Nikula
@ 2023-01-23 9:59 ` Jani Nikula
0 siblings, 0 replies; 18+ messages in thread
From: Jani Nikula @ 2023-01-23 9:59 UTC (permalink / raw)
To: intel-gfx, dri-devel
On Thu, 19 Jan 2023, Jani Nikula <jani.nikula@intel.com> wrote:
> Realize that drm_edid_connector_update() and
> _drm_connector_update_edid_property() are now the same thing. Drop the
> latter.
>
> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Thanks for the reviews, pushed 1-4 to drm-misc-next.
BR,
Jani.
> ---
> drivers/gpu/drm/drm_edid.c | 21 +--------------------
> 1 file changed, 1 insertion(+), 20 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
> index d0c21d27b978..3d0a4da661bc 100644
> --- a/drivers/gpu/drm/drm_edid.c
> +++ b/drivers/gpu/drm/drm_edid.c
> @@ -6784,24 +6784,6 @@ int drm_edid_connector_add_modes(struct drm_connector *connector)
> }
> EXPORT_SYMBOL(drm_edid_connector_add_modes);
>
> -static int _drm_connector_update_edid_property(struct drm_connector *connector,
> - const struct drm_edid *drm_edid)
> -{
> - /*
> - * Set the display info, using edid if available, otherwise resetting
> - * the values to defaults. This duplicates the work done in
> - * drm_add_edid_modes, but that function is not consistently called
> - * before this one in all drivers and the computation is cheap enough
> - * that it seems better to duplicate it rather than attempt to ensure
> - * some arbitrary ordering of calls.
> - */
> - update_display_info(connector, drm_edid);
> -
> - _drm_update_tile_info(connector, drm_edid);
> -
> - return _drm_edid_connector_property_update(connector, drm_edid);
> -}
> -
> /**
> * drm_connector_update_edid_property - update the edid property of a connector
> * @connector: drm connector
> @@ -6823,8 +6805,7 @@ int drm_connector_update_edid_property(struct drm_connector *connector,
> {
> struct drm_edid drm_edid;
>
> - return _drm_connector_update_edid_property(connector,
> - drm_edid_legacy_init(&drm_edid, edid));
> + return drm_edid_connector_update(connector, drm_edid_legacy_init(&drm_edid, edid));
> }
> EXPORT_SYMBOL(drm_connector_update_edid_property);
--
Jani Nikula, Intel Open Source Graphics Center
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [Intel-gfx] [PATCH v8 5/8] drm/i915/edid: convert DP, HDMI and LVDS to drm_edid
2023-01-20 18:48 ` Ville Syrjälä
@ 2023-01-23 10:15 ` Jani Nikula
2023-01-23 18:22 ` Ville Syrjälä
0 siblings, 1 reply; 18+ messages in thread
From: Jani Nikula @ 2023-01-23 10:15 UTC (permalink / raw)
To: Ville Syrjälä; +Cc: intel-gfx, dri-devel
On Fri, 20 Jan 2023, Ville Syrjälä <ville.syrjala@linux.intel.com> wrote:
> On Thu, Jan 19, 2023 at 06:18:58PM +0200, Jani Nikula wrote:
>> diff --git a/drivers/gpu/drm/i915/display/intel_lvds.c b/drivers/gpu/drm/i915/display/intel_lvds.c
>> index aecec992cd0d..6a98787edf48 100644
>> --- a/drivers/gpu/drm/i915/display/intel_lvds.c
>> +++ b/drivers/gpu/drm/i915/display/intel_lvds.c
>> @@ -479,8 +479,11 @@ static int intel_lvds_get_modes(struct drm_connector *connector)
>> struct intel_connector *intel_connector = to_intel_connector(connector);
>>
>> /* use cached edid if we have one */
>> - if (!IS_ERR_OR_NULL(intel_connector->edid))
>> - return drm_add_edid_modes(connector, intel_connector->edid);
>> + if (!IS_ERR_OR_NULL(intel_connector->edid)) {
>> + drm_edid_connector_update(connector, intel_connector->edid);
>
> Isn't this update redundant?
Maybe far fetched, but if the user does connector force disable via
debugfs, drm_helper_probe_single_connector_modes() will clear the EDID
property and display info. And after that, nobody's going to do the
connector update again unless we do it here.
BR,
Jani.
>
>> +
>> + return drm_edid_connector_add_modes(connector);
>> + }
>>
>> return intel_panel_get_modes(intel_connector);
>> }
>> @@ -834,7 +837,7 @@ void intel_lvds_init(struct drm_i915_private *dev_priv)
>> struct intel_connector *intel_connector;
>> struct drm_connector *connector;
>> struct drm_encoder *encoder;
>> - struct edid *edid;
>> + const struct drm_edid *drm_edid;
>> i915_reg_t lvds_reg;
>> u32 lvds;
>> u8 pin;
>> @@ -945,27 +948,36 @@ void intel_lvds_init(struct drm_i915_private *dev_priv)
>> * preferred mode is the right one.
>> */
>> mutex_lock(&dev_priv->drm.mode_config.mutex);
>> - if (vga_switcheroo_handler_flags() & VGA_SWITCHEROO_CAN_SWITCH_DDC)
>> + if (vga_switcheroo_handler_flags() & VGA_SWITCHEROO_CAN_SWITCH_DDC) {
>> + const struct edid *edid;
>> +
>> + /* FIXME: Make drm_get_edid_switcheroo() return drm_edid */
>> edid = drm_get_edid_switcheroo(connector,
>> - intel_gmbus_get_adapter(dev_priv, pin));
>> - else
>> - edid = drm_get_edid(connector,
>> - intel_gmbus_get_adapter(dev_priv, pin));
>> - if (edid) {
>> - if (drm_add_edid_modes(connector, edid)) {
>> - drm_connector_update_edid_property(connector,
>> - edid);
>> - } else {
>> + intel_gmbus_get_adapter(dev_priv, pin));
>> + if (edid) {
>> + drm_edid = drm_edid_alloc(edid, (edid->extensions + 1) * EDID_LENGTH);
>> kfree(edid);
>> - edid = ERR_PTR(-EINVAL);
>> + } else {
>> + drm_edid = NULL;
>> + }
>> + } else {
>> + drm_edid = drm_edid_read_ddc(connector,
>> + intel_gmbus_get_adapter(dev_priv, pin));
>> + }
>> + if (drm_edid) {
>> + if (drm_edid_connector_update(connector, drm_edid) ||
>> + !drm_edid_connector_add_modes(connector)) {
>> + drm_edid_connector_update(connector, NULL);
>> + drm_edid_free(drm_edid);
>> + drm_edid = ERR_PTR(-EINVAL);
>> }
>> } else {
>> - edid = ERR_PTR(-ENOENT);
>> + drm_edid = ERR_PTR(-ENOENT);
>> }
>> - intel_connector->edid = edid;
>> + intel_connector->edid = drm_edid;
>>
>> intel_bios_init_panel_late(dev_priv, &intel_connector->panel, NULL,
>> - IS_ERR(edid) ? NULL : edid);
>> + IS_ERR_OR_NULL(drm_edid) ? NULL : drm_edid_raw(drm_edid));
>>
>> /* Try EDID first */
>> intel_panel_add_edid_fixed_modes(intel_connector, true);
>> --
>> 2.34.1
--
Jani Nikula, Intel Open Source Graphics Center
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [Intel-gfx] [PATCH v8 5/8] drm/i915/edid: convert DP, HDMI and LVDS to drm_edid
2023-01-23 10:15 ` Jani Nikula
@ 2023-01-23 18:22 ` Ville Syrjälä
0 siblings, 0 replies; 18+ messages in thread
From: Ville Syrjälä @ 2023-01-23 18:22 UTC (permalink / raw)
To: Jani Nikula; +Cc: intel-gfx, dri-devel
On Mon, Jan 23, 2023 at 12:15:04PM +0200, Jani Nikula wrote:
> On Fri, 20 Jan 2023, Ville Syrjälä <ville.syrjala@linux.intel.com> wrote:
> > On Thu, Jan 19, 2023 at 06:18:58PM +0200, Jani Nikula wrote:
> >> diff --git a/drivers/gpu/drm/i915/display/intel_lvds.c b/drivers/gpu/drm/i915/display/intel_lvds.c
> >> index aecec992cd0d..6a98787edf48 100644
> >> --- a/drivers/gpu/drm/i915/display/intel_lvds.c
> >> +++ b/drivers/gpu/drm/i915/display/intel_lvds.c
> >> @@ -479,8 +479,11 @@ static int intel_lvds_get_modes(struct drm_connector *connector)
> >> struct intel_connector *intel_connector = to_intel_connector(connector);
> >>
> >> /* use cached edid if we have one */
> >> - if (!IS_ERR_OR_NULL(intel_connector->edid))
> >> - return drm_add_edid_modes(connector, intel_connector->edid);
> >> + if (!IS_ERR_OR_NULL(intel_connector->edid)) {
> >> + drm_edid_connector_update(connector, intel_connector->edid);
> >
> > Isn't this update redundant?
>
> Maybe far fetched, but if the user does connector force disable via
> debugfs, drm_helper_probe_single_connector_modes() will clear the EDID
> property and display info. And after that, nobody's going to do the
> connector update again unless we do it here.
Right, DP/HDMI take care of that in .force(), we have no
.force() for LVDS atm. And I take the encoder types not handled
in this patch will keep using some older get_edid() thingy that
will do the update for them also from .get_modes()? Hmm, apart
from the encoders using intel_panel_get_modes() which I suppose
must already be busted...
I guess we should think about unifying the behaviour for all
the encoder types, including using detect_edid for everything...
Anyways, that's something for the future. For the time being
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
>
> BR,
> Jani.
>
>
>
> >
> >> +
> >> + return drm_edid_connector_add_modes(connector);
> >> + }
> >>
> >> return intel_panel_get_modes(intel_connector);
> >> }
> >> @@ -834,7 +837,7 @@ void intel_lvds_init(struct drm_i915_private *dev_priv)
> >> struct intel_connector *intel_connector;
> >> struct drm_connector *connector;
> >> struct drm_encoder *encoder;
> >> - struct edid *edid;
> >> + const struct drm_edid *drm_edid;
> >> i915_reg_t lvds_reg;
> >> u32 lvds;
> >> u8 pin;
> >> @@ -945,27 +948,36 @@ void intel_lvds_init(struct drm_i915_private *dev_priv)
> >> * preferred mode is the right one.
> >> */
> >> mutex_lock(&dev_priv->drm.mode_config.mutex);
> >> - if (vga_switcheroo_handler_flags() & VGA_SWITCHEROO_CAN_SWITCH_DDC)
> >> + if (vga_switcheroo_handler_flags() & VGA_SWITCHEROO_CAN_SWITCH_DDC) {
> >> + const struct edid *edid;
> >> +
> >> + /* FIXME: Make drm_get_edid_switcheroo() return drm_edid */
> >> edid = drm_get_edid_switcheroo(connector,
> >> - intel_gmbus_get_adapter(dev_priv, pin));
> >> - else
> >> - edid = drm_get_edid(connector,
> >> - intel_gmbus_get_adapter(dev_priv, pin));
> >> - if (edid) {
> >> - if (drm_add_edid_modes(connector, edid)) {
> >> - drm_connector_update_edid_property(connector,
> >> - edid);
> >> - } else {
> >> + intel_gmbus_get_adapter(dev_priv, pin));
> >> + if (edid) {
> >> + drm_edid = drm_edid_alloc(edid, (edid->extensions + 1) * EDID_LENGTH);
> >> kfree(edid);
> >> - edid = ERR_PTR(-EINVAL);
> >> + } else {
> >> + drm_edid = NULL;
> >> + }
> >> + } else {
> >> + drm_edid = drm_edid_read_ddc(connector,
> >> + intel_gmbus_get_adapter(dev_priv, pin));
> >> + }
> >> + if (drm_edid) {
> >> + if (drm_edid_connector_update(connector, drm_edid) ||
> >> + !drm_edid_connector_add_modes(connector)) {
> >> + drm_edid_connector_update(connector, NULL);
> >> + drm_edid_free(drm_edid);
> >> + drm_edid = ERR_PTR(-EINVAL);
> >> }
> >> } else {
> >> - edid = ERR_PTR(-ENOENT);
> >> + drm_edid = ERR_PTR(-ENOENT);
> >> }
> >> - intel_connector->edid = edid;
> >> + intel_connector->edid = drm_edid;
> >>
> >> intel_bios_init_panel_late(dev_priv, &intel_connector->panel, NULL,
> >> - IS_ERR(edid) ? NULL : edid);
> >> + IS_ERR_OR_NULL(drm_edid) ? NULL : drm_edid_raw(drm_edid));
> >>
> >> /* Try EDID first */
> >> intel_panel_add_edid_fixed_modes(intel_connector, true);
> >> --
> >> 2.34.1
>
> --
> Jani Nikula, Intel Open Source Graphics Center
--
Ville Syrjälä
Intel
^ permalink raw reply [flat|nested] 18+ messages in thread
end of thread, other threads:[~2023-01-23 18:22 UTC | newest]
Thread overview: 18+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-01-19 16:18 [Intel-gfx] [PATCH v8 0/8] drm/edid: info & modes parsing and drm_edid refactors Jani Nikula
2023-01-19 16:18 ` [Intel-gfx] [PATCH v8 1/8] drm/edid: split HDMI VSDB info and mode parsing Jani Nikula
2023-01-19 16:18 ` [Intel-gfx] [PATCH v8 2/8] drm/edid: refactor _drm_edid_connector_update() and rename Jani Nikula
2023-01-19 16:18 ` [Intel-gfx] [PATCH v8 3/8] drm/edid: add separate drm_edid_connector_add_modes() Jani Nikula
2023-01-19 16:18 ` [Intel-gfx] [PATCH v8 4/8] drm/edid: remove redundant _drm_connector_update_edid_property() Jani Nikula
2023-01-23 9:59 ` Jani Nikula
2023-01-19 16:18 ` [Intel-gfx] [PATCH v8 5/8] drm/i915/edid: convert DP, HDMI and LVDS to drm_edid Jani Nikula
2023-01-20 18:48 ` Ville Syrjälä
2023-01-23 10:15 ` Jani Nikula
2023-01-23 18:22 ` Ville Syrjälä
2023-01-19 16:18 ` [Intel-gfx] [PATCH v8 6/8] drm/i915/bios: convert intel_bios_init_panel() " Jani Nikula
2023-01-20 18:48 ` Ville Syrjälä
2023-01-19 16:19 ` [Intel-gfx] [PATCH v8 7/8] drm/i915/opregion: convert intel_opregion_get_edid() to struct drm_edid Jani Nikula
2023-01-20 18:49 ` Ville Syrjälä
2023-01-19 16:19 ` [Intel-gfx] [PATCH v8 8/8] drm/i915/panel: move panel fixed EDID to struct intel_panel Jani Nikula
2023-01-20 18:49 ` Ville Syrjälä
2023-01-19 18:14 ` [Intel-gfx] ✓ Fi.CI.BAT: success for drm/edid: info & modes parsing and drm_edid refactors (rev3) Patchwork
2023-01-20 21:51 ` [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