On Fri, Aug 08, 2025 at 09:40:00AM +0000, Imre Deak C wrote: >On Fri, Aug 08, 2025 at 09:16:02AM +0000, Lee Shawn C wrote: >> While performing HDMI compliance testing, test equipment may request >> different bpc output for signal measurement. However, display driver >> typically determines the maximum available bpc based on HW bandwidth. >> >> Introduce a new debugfs that allows user to configure dedicated bpc >> manually, and making HDMI compliance test much easier. >> >> v2: Using exist variable max_requested_bpc. > >How come this doesn't get reset after a hotplug as you described for the case >when the property is used, >even though both the property and this debug entries use the same state >variable? (Not saying that the reset >happing after a hotplug is a valid justification for a new debugfs entry, the >hotplug could be also handled by the user, >but you could argue the debugfs entry is more convenient.) >
Hi Imre, thank you for the prompt response. https://elixir.bootlin.com/linux/v6.16/source/drivers/gpu/drm/i915/display/intel_hdmi.c#L2672 The max_bpc_property and max_bpc values are initialized during connector initialization process. https://elixir.bootlin.com/linux/v6.16/source/drivers/gpu/drm/drm_atomic.c#L468 The max_bpc will be restored to info->bpc (from EDID) at drm_atomic_connector_check() everytime. When max_bpc_property is available, this funciton also compares max_bpc with max_requested_bpc and updates max_bpc to the smaller of the two values. The i915 display driver then relies on this max_bpc value to determine whether to update the pipe bpp value in compute_sink_pipe_bpp(). Therefore, we can simply update max_requested_bpc to affect pipe bpp output. And no additional driver changes are required. Best regards, Shawn >Have you also considered enabling the force_link_bpp debugfs entry for all >HDMI connectors instead? > >> Cc: Shankar Uma <uma.shan...@intel.com> >> Cc: Jani Nikula <jani.nik...@intel.com> >> Cc: Imre Deak <imre.d...@intel.com> >> Cc: Vidya Srinivas <vidya.srini...@intel.com> >> Signed-off-by: Lee Shawn C <shawn.c....@intel.com> >> --- >> .../drm/i915/display/intel_display_debugfs.c | 46 >> +++++++++++++++++++ >> 1 file changed, 46 insertions(+) >> >> diff --git a/drivers/gpu/drm/i915/display/intel_display_debugfs.c >> b/drivers/gpu/drm/i915/display/intel_display_debugfs.c >> index ce3f9810c42d..5ef2bcffefc5 100644 >> --- a/drivers/gpu/drm/i915/display/intel_display_debugfs.c >> +++ b/drivers/gpu/drm/i915/display/intel_display_debugfs.c >> @@ -1208,6 +1208,47 @@ static const struct file_operations >> i915_dsc_fractional_bpp_fops = { >> .write = i915_dsc_fractional_bpp_write }; >> >> +static int i915_force_bpc_show(struct seq_file *m, void *data) { >> + struct intel_connector *connector = m->private; >> + struct drm_connector *conn = &connector->base; >> + >> + seq_printf(m, "%u\n", conn->state->max_requested_bpc); >> + >> + return 0; >> +} >> + >> +static ssize_t i915_force_bpc_write(struct file *file, >> + const char __user *ubuf, >> + size_t len, loff_t *offp) >> +{ >> + struct seq_file *m = file->private_data; >> + struct intel_connector *connector = m->private; >> + struct intel_display *display = to_intel_display(connector); >> + struct drm_connector *conn = &connector->base; >> + int new_bpc, ret; >> + >> + ret = kstrtoint_from_user(ubuf, len, 0, &new_bpc); >> + if (ret < 0) >> + return ret; >> + >> + switch (new_bpc) { >> + case 8: >> + case 10: >> + case 12: >> + break; >> + default: >> + drm_dbg_kms(display->drm, "Invalid bpc value (%u)\n", new_bpc); >> + return -EINVAL; >> + } >> + >> + conn->state->max_requested_bpc = new_bpc; >> + >> + *offp += len; >> + return len; >> +} >> +DEFINE_SHOW_STORE_ATTRIBUTE(i915_force_bpc); >> + >> /* >> * Returns the Current CRTC's bpc. >> * Example usage: cat /sys/kernel/debug/dri/0/crtc-0/i915_current_bpc >> @@ -1359,6 +1400,11 @@ void intel_connector_debugfs_add(struct >> intel_connector *connector) >> connector_type == DRM_MODE_CONNECTOR_HDMIB) >> debugfs_create_file("i915_lpsp_capability", 0444, root, >> connector, &i915_lpsp_capability_fops); >> + >> + if (connector_type == DRM_MODE_CONNECTOR_HDMIA || >> + connector_type == DRM_MODE_CONNECTOR_HDMIB) >> + debugfs_create_file("i915_force_bpc", 0644, root, >> + connector, &i915_force_bpc_fops); >> } >> >> /** >> -- >> 2.34.1 >> >