[TRYBOT #2 06/10] drm/edid: add separate drm_edid_connector_add_modes()
Jani Nikula
jani.nikula at intel.com
Thu Dec 15 22:47:57 UTC 2022
The goal was to have a single drm_edid_connector_update() without a
separate call for adding modes, but that turned out to be problematic
for drivers that wish to have a connector update in the ->detect()
hook. Turns out ->detect() is called so many times that the probed mode
list fills up without bounds, in part because add_alternate_cea_modes()
duplicates modes.
Kudos to Imre Deak <imre.deak at intel.com> for explaining this to me.
Split out drm_edid_connector_add_modes() from
drm_edid_connector_update(). However, add the modes from the EDID
property that is expected to have been set by
drm_edid_connector_update() beforehands to enforce the order of the
function calls.
Signed-off-by: Jani Nikula <jani.nikula at intel.com>
---
drivers/gpu/drm/drm_edid.c | 39 +++++++++++++++++++++++-------
drivers/gpu/drm/drm_probe_helper.c | 4 ++-
include/drm/drm_edid.h | 2 ++
3 files changed, 35 insertions(+), 10 deletions(-)
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index a1e66bfa1652..84a59c055e20 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -6673,30 +6673,51 @@ 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 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 mode list from EDID
+ * @connector: Connector
+ *
+ * Update the connector mode list from the EDID previously updated with
+ * drm_edid_connector_update().
+ *
+ * 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)
diff --git a/drivers/gpu/drm/drm_probe_helper.c b/drivers/gpu/drm/drm_probe_helper.c
index 1ea053cef557..26844befc6f5 100644
--- a/drivers/gpu/drm/drm_probe_helper.c
+++ b/drivers/gpu/drm/drm_probe_helper.c
@@ -1139,7 +1139,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
More information about the Intel-gfx-trybot
mailing list