| From a44f42ba7f1ad7d3c17bc7d91013fe814a53c5dc Mon Sep 17 00:00:00 2001 |
| From: Lyude Paul <lyude@redhat.com> |
| Date: Tue, 30 Nov 2021 16:29:09 -0500 |
| Subject: [PATCH] drm/i915/dp: Perform 30ms delay after source OUI write |
| Mime-version: 1.0 |
| Content-type: text/plain; charset=UTF-8 |
| Content-transfer-encoding: 8bit |
| Git-commit: a44f42ba7f1ad7d3c17bc7d91013fe814a53c5dc |
| Patch-mainline: v5.16-rc4 |
| Alt-commit: c7c90b0b8418a97d3aa8b39aae1992908948efad |
| References: git-fixes |
| |
| While working on supporting the Intel HDR backlight interface, I noticed |
| that there's a couple of laptops that will very rarely manage to boot up |
| without detecting Intel HDR backlight support - even though it's supported |
| on the system. One example of such a laptop is the Lenovo P17 1st |
| generation. |
| |
| Following some investigation Ville Syrj채l채 did through the docs they have |
| available to them, they discovered that there's actually supposed to be a |
| 30ms wait after writing the source OUI before we begin setting up the rest |
| of the backlight interface. |
| |
| This seems to be correct, as adding this 30ms delay seems to have |
| completely fixed the probing issues I was previously seeing. So - let's |
| start performing a 30ms wait after writing the OUI, which we do in a manner |
| similar to how we keep track of PPS delays (e.g. record the timestamp of |
| the OUI write, and then wait for however many ms are left since that |
| timestamp right before we interact with the backlight) in order to avoid |
| waiting any longer then we need to. As well, this also avoids us performing |
| this delay on systems where we don't end up using the HDR backlight |
| interface. |
| |
| V3: |
| * Move last_oui_write into intel_dp |
| V2: |
| * Move panel delays into intel_pps |
| |
| Signed-off-by: Lyude Paul <lyude@redhat.com> |
| Reviewed-by: Jani Nikula <jani.nikula@intel.com> |
| Fixes: 4a8d79901d5b ("drm/i915/dp: Enable Intel's HDR backlight interface (only SDR for now)") |
| Cc: Ville Syrj채l채 <ville.syrjala@linux.intel.com> |
| Cc: <stable@vger.kernel.org> # v5.12+ |
| Signed-off-by: Jani Nikula <jani.nikula@intel.com> |
| Link: https://patchwork.freedesktop.org/patch/msgid/20211130212912.212044-1-lyude@redhat.com |
| (cherry picked from commit c7c90b0b8418a97d3aa8b39aae1992908948efad) |
| |
| Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com> |
| Acked-by: Takashi Iwai <tiwai@suse.de> |
| |
| |
| drivers/gpu/drm/i915/display/intel_display_types.h | 3 +++ |
| drivers/gpu/drm/i915/display/intel_dp.c | 11 +++++++++++ |
| drivers/gpu/drm/i915/display/intel_dp.h | 2 ++ |
| drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c | 5 +++++ |
| 4 files changed, 21 insertions(+) |
| |
| |
| |
| @@ -1639,6 +1639,9 @@ struct intel_dp { |
| struct intel_dp_pcon_frl frl; |
| |
| struct intel_psr psr; |
| + |
| + /* When we last wrote the OUI for eDP */ |
| + unsigned long last_oui_write; |
| }; |
| |
| enum lspcon_vendor { |
| |
| |
| @@ -29,6 +29,7 @@ |
| #include <linux/i2c.h> |
| #include <linux/notifier.h> |
| #include <linux/slab.h> |
| +#include <linux/timekeeping.h> |
| #include <linux/types.h> |
| |
| #include <asm/byteorder.h> |
| @@ -1895,6 +1896,16 @@ intel_edp_init_source_oui(struct intel_d |
| |
| if (drm_dp_dpcd_write(&intel_dp->aux, DP_SOURCE_OUI, oui, sizeof(oui)) < 0) |
| drm_err(&i915->drm, "Failed to write source OUI\n"); |
| + |
| + intel_dp->last_oui_write = jiffies; |
| +} |
| + |
| +void intel_dp_wait_source_oui(struct intel_dp *intel_dp) |
| +{ |
| + struct drm_i915_private *i915 = dp_to_i915(intel_dp); |
| + |
| + drm_dbg_kms(&i915->drm, "Performing OUI wait\n"); |
| + wait_remaining_ms_from_jiffies(intel_dp->last_oui_write, 30); |
| } |
| |
| /* If the device supports it, try to set the power state appropriately */ |
| |
| |
| @@ -129,4 +129,6 @@ void intel_dp_pcon_dsc_configure(struct |
| const struct intel_crtc_state *crtc_state); |
| void intel_dp_phy_test(struct intel_encoder *encoder); |
| |
| +void intel_dp_wait_source_oui(struct intel_dp *intel_dp); |
| + |
| #endif /* __INTEL_DP_H__ */ |
| |
| |
| @@ -36,6 +36,7 @@ |
| |
| #include "intel_backlight.h" |
| #include "intel_display_types.h" |
| +#include "intel_dp.h" |
| #include "intel_dp_aux_backlight.h" |
| |
| /* TODO: |
| @@ -106,6 +107,8 @@ intel_dp_aux_supports_hdr_backlight(stru |
| int ret; |
| u8 tcon_cap[4]; |
| |
| + intel_dp_wait_source_oui(intel_dp); |
| + |
| ret = drm_dp_dpcd_read(aux, INTEL_EDP_HDR_TCON_CAP0, tcon_cap, sizeof(tcon_cap)); |
| if (ret != sizeof(tcon_cap)) |
| return false; |
| @@ -204,6 +207,8 @@ intel_dp_aux_hdr_enable_backlight(const |
| int ret; |
| u8 old_ctrl, ctrl; |
| |
| + intel_dp_wait_source_oui(intel_dp); |
| + |
| ret = drm_dp_dpcd_readb(&intel_dp->aux, INTEL_EDP_HDR_GETSET_CTRL_PARAMS, &old_ctrl); |
| if (ret != 1) { |
| drm_err(&i915->drm, "Failed to read current backlight control mode: %d\n", ret); |