Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/edid: abstract debugfs override EDID set/reset

Add functions drm_edid_override_set() and drm_edid_override_reset() to
support "edid_override" connector debugfs, and to hide the details about
it in drm_edid.c. No functional changes at this time.

Also note in the connector.override_edid flag kernel-doc that this is
only supposed to be modified by the code doing debugfs EDID override
handling. Currently, it is still being modified by amdgpu in
create_eml_sink() and handle_edid_mgmt() for reasons unknown. This was
added in commit 4562236b3bc0 ("drm/amd/dc: Add dc display driver (v2)")
and later moved to amdgpu_dm.c in commit e7b07ceef2a6 ("drm/amd/display:
Merge amdgpu_dm_types and amdgpu_dm").

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/8f6b4001630cafac5f44aa5913429ac9979743d2.1656494768.git.jani.nikula@intel.com

+38 -17
+2
drivers/gpu/drm/drm_crtc_internal.h
··· 286 286 287 287 /* drm_edid.c */ 288 288 void drm_mode_fixup_1366x768(struct drm_display_mode *mode); 289 + int drm_edid_override_set(struct drm_connector *connector, const void *edid, size_t size); 290 + int drm_edid_override_reset(struct drm_connector *connector);
+5 -16
drivers/gpu/drm/drm_debugfs.c
··· 350 350 struct seq_file *m = file->private_data; 351 351 struct drm_connector *connector = m->private; 352 352 char *buf; 353 - struct edid *edid; 354 353 int ret; 355 354 356 355 buf = memdup_user(ubuf, len); 357 356 if (IS_ERR(buf)) 358 357 return PTR_ERR(buf); 359 358 360 - edid = (struct edid *) buf; 361 - 362 - if (len == 5 && !strncmp(buf, "reset", 5)) { 363 - connector->override_edid = false; 364 - ret = drm_connector_update_edid_property(connector, NULL); 365 - } else if (len < EDID_LENGTH || 366 - EDID_LENGTH * (1 + edid->extensions) > len) 367 - ret = -EINVAL; 368 - else { 369 - connector->override_edid = false; 370 - ret = drm_connector_update_edid_property(connector, edid); 371 - if (!ret) 372 - connector->override_edid = true; 373 - } 359 + if (len == 5 && !strncmp(buf, "reset", 5)) 360 + ret = drm_edid_override_reset(connector); 361 + else 362 + ret = drm_edid_override_set(connector, buf, len); 374 363 375 364 kfree(buf); 376 365 377 - return (ret) ? ret : len; 366 + return ret ? ret : len; 378 367 } 379 368 380 369 /*
+26
drivers/gpu/drm/drm_edid.c
··· 2161 2161 return IS_ERR(override) ? NULL : override; 2162 2162 } 2163 2163 2164 + /* For debugfs edid_override implementation */ 2165 + int drm_edid_override_set(struct drm_connector *connector, const void *edid, 2166 + size_t size) 2167 + { 2168 + int ret; 2169 + 2170 + if (size < EDID_LENGTH || edid_size(edid) > size) 2171 + return -EINVAL; 2172 + 2173 + connector->override_edid = false; 2174 + 2175 + ret = drm_connector_update_edid_property(connector, edid); 2176 + if (!ret) 2177 + connector->override_edid = true; 2178 + 2179 + return ret; 2180 + } 2181 + 2182 + /* For debugfs edid_override implementation */ 2183 + int drm_edid_override_reset(struct drm_connector *connector) 2184 + { 2185 + connector->override_edid = false; 2186 + 2187 + return drm_connector_update_edid_property(connector, NULL); 2188 + } 2189 + 2164 2190 /** 2165 2191 * drm_add_override_edid_modes - add modes from override/firmware EDID 2166 2192 * @connector: connector we're probing
+5 -1
include/drm/drm_connector.h
··· 1527 1527 struct drm_cmdline_mode cmdline_mode; 1528 1528 /** @force: a DRM_FORCE_<foo> state for forced mode sets */ 1529 1529 enum drm_connector_force force; 1530 - /** @override_edid: has the EDID been overwritten through debugfs for testing? */ 1530 + /** 1531 + * @override_edid: has the EDID been overwritten through debugfs for 1532 + * testing? Do not modify outside of drm_edid_override_set() and 1533 + * drm_edid_override_reset(). 1534 + */ 1531 1535 bool override_edid; 1532 1536 /** @epoch_counter: used to detect any other changes in connector, besides status */ 1533 1537 u64 epoch_counter;