Add an i915_hdmi_force_bit_banging debugfs control for HDMI connectors to allow EDID reads to be forced over GPIO bit-banging.
Assisted-by: Claude:claude-opus-5 Signed-off-by: Naladala Ramanaidu <[email protected]> --- .../drm/i915/display/intel_display_debugfs.c | 1 + .../drm/i915/display/intel_display_types.h | 3 ++ drivers/gpu/drm/i915/display/intel_hdmi.c | 51 +++++++++++++++++++ drivers/gpu/drm/i915/display/intel_hdmi.h | 2 + 4 files changed, 57 insertions(+) diff --git a/drivers/gpu/drm/i915/display/intel_display_debugfs.c b/drivers/gpu/drm/i915/display/intel_display_debugfs.c index 3e302f23f247..c991f224b4be 100644 --- a/drivers/gpu/drm/i915/display/intel_display_debugfs.c +++ b/drivers/gpu/drm/i915/display/intel_display_debugfs.c @@ -1335,6 +1335,7 @@ void intel_connector_debugfs_add(struct intel_connector *connector) intel_dp_link_training_debugfs_add(connector); intel_dp_link_caps_debugfs_add(connector); intel_link_bw_connector_debugfs_add(connector); + intel_hdmi_connector_debugfs_add(connector); if (DISPLAY_VER(display) >= 11 && ((connector_type == DRM_MODE_CONNECTOR_DisplayPort && !connector->mst.dp) || diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h index 20a07ea06b5e..58983e31c5ef 100644 --- a/drivers/gpu/drm/i915/display/intel_display_types.h +++ b/drivers/gpu/drm/i915/display/intel_display_types.h @@ -1689,6 +1689,9 @@ struct intel_hdmi { } dp_dual_mode; struct intel_connector *attached_connector; struct cec_notifier *cec_notifier; + + /* Debugfs knob to force EDID reads over GPIO bit-banging. */ + bool force_bit_banging; }; struct intel_dp_mst_encoder; diff --git a/drivers/gpu/drm/i915/display/intel_hdmi.c b/drivers/gpu/drm/i915/display/intel_hdmi.c index 9b637e38a1a5..38915f19d3e5 100644 --- a/drivers/gpu/drm/i915/display/intel_hdmi.c +++ b/drivers/gpu/drm/i915/display/intel_hdmi.c @@ -26,6 +26,7 @@ * Jesse Barnes <[email protected]> */ +#include <linux/debugfs.h> #include <linux/delay.h> #include <linux/hdmi.h> #include <linux/i2c.h> @@ -3112,6 +3113,56 @@ void intel_infoframe_init(struct intel_digital_port *dig_port) } } +static int i915_hdmi_force_bit_banging_show(void *data, u64 *val) +{ + struct intel_connector *connector = to_intel_connector(data); + + *val = READ_ONCE(intel_attached_hdmi(connector)->force_bit_banging); + + return 0; +} + +static int i915_hdmi_force_bit_banging_write(void *data, u64 val) +{ + struct intel_connector *connector = to_intel_connector(data); + struct intel_display *display = to_intel_display(connector); + struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector); + + if (val > 1) + return -EINVAL; + + drm_dbg_kms(display->drm, + "[CONNECTOR:%d:%s] %sabling forced GPIO bit-banging for EDID reads\n", + connector->base.base.id, connector->base.name, + val ? "en" : "dis"); + + WRITE_ONCE(intel_hdmi->force_bit_banging, val); + + return 0; +} +DEFINE_DEBUGFS_ATTRIBUTE(i915_hdmi_force_bit_banging_fops, + i915_hdmi_force_bit_banging_show, + i915_hdmi_force_bit_banging_write, "%llu\n"); + +/** + * intel_hdmi_connector_debugfs_add - add HDMI specific connector debugfs files + * @connector: pointer to a registered intel_connector + * + * Cleanup will be done by drm_connector_unregister() through a call to + * drm_debugfs_connector_remove(). + */ +void intel_hdmi_connector_debugfs_add(struct intel_connector *connector) +{ + struct dentry *root = connector->base.debugfs_entry; + + if (connector->base.connector_type != DRM_MODE_CONNECTOR_HDMIA && + connector->base.connector_type != DRM_MODE_CONNECTOR_HDMIB) + return; + + debugfs_create_file("i915_hdmi_force_bit_banging", 0644, root, + connector, &i915_hdmi_force_bit_banging_fops); +} + bool intel_hdmi_init_connector(struct intel_digital_port *dig_port, struct intel_connector *intel_connector) { diff --git a/drivers/gpu/drm/i915/display/intel_hdmi.h b/drivers/gpu/drm/i915/display/intel_hdmi.h index c95ed37bcc0c..752cccf5ccee 100644 --- a/drivers/gpu/drm/i915/display/intel_hdmi.h +++ b/drivers/gpu/drm/i915/display/intel_hdmi.h @@ -78,4 +78,6 @@ void intel_hdmi_poll_for_scrambling_enable(const struct intel_crtc_state *crtc_s int intel_hdmi_sink_max_frl_rate(struct drm_connector *connector); int intel_hdmi_sink_dsc_max_frl_rate(struct drm_connector *connector); +void intel_hdmi_connector_debugfs_add(struct intel_connector *connector); + #endif /* __INTEL_HDMI_H__ */ -- 2.43.0
