| From f9a99131ce18d9dddcaa14ec2c436e42f0bbee5e Mon Sep 17 00:00:00 2001 |
| From: Hans de Goede <hdegoede@redhat.com> |
| Date: Fri, 24 May 2019 19:40:27 +0200 |
| Subject: drm/i915/dsi: Use a fuzzy check for burst mode clock check |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| From: Hans de Goede <hdegoede@redhat.com> |
| |
| commit f9a99131ce18d9dddcaa14ec2c436e42f0bbee5e upstream. |
| |
| Prior to this commit we fail to init the DSI panel on the GPD MicroPC: |
| https://www.indiegogo.com/projects/gpd-micropc-6-inch-handheld-industry-laptop#/ |
| |
| The problem is intel_dsi_vbt_init() failing with the following error: |
| *ERROR* Burst mode freq is less than computed |
| |
| The pclk in the VBT panel modeline is 70000, together with 24 bpp and |
| 4 lines this results in a bitrate value of 70000 * 24 / 4 = 420000. |
| But the target_burst_mode_freq in the VBT is 418000. |
| |
| This commit works around this problem by adding an intel_fuzzy_clock_check |
| when target_burst_mode_freq < bitrate and setting target_burst_mode_freq to |
| bitrate when that checks succeeds, fixing the panel not working. |
| |
| Cc: stable@vger.kernel.org |
| Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> |
| Signed-off-by: Hans de Goede <hdegoede@redhat.com> |
| Link: https://patchwork.freedesktop.org/patch/msgid/20190524174028.21659-2-hdegoede@redhat.com |
| (cherry picked from commit 2c1c55252647abd989b94f725b190c700312d053) |
| Signed-off-by: Jani Nikula <jani.nikula@intel.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/gpu/drm/i915/intel_display.c | 2 +- |
| drivers/gpu/drm/i915/intel_drv.h | 1 + |
| drivers/gpu/drm/i915/intel_dsi_vbt.c | 11 +++++++++++ |
| 3 files changed, 13 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/gpu/drm/i915/intel_display.c |
| +++ b/drivers/gpu/drm/i915/intel_display.c |
| @@ -11757,7 +11757,7 @@ encoder_retry: |
| return 0; |
| } |
| |
| -static bool intel_fuzzy_clock_check(int clock1, int clock2) |
| +bool intel_fuzzy_clock_check(int clock1, int clock2) |
| { |
| int diff; |
| |
| --- a/drivers/gpu/drm/i915/intel_drv.h |
| +++ b/drivers/gpu/drm/i915/intel_drv.h |
| @@ -1707,6 +1707,7 @@ int vlv_force_pll_on(struct drm_i915_pri |
| const struct dpll *dpll); |
| void vlv_force_pll_off(struct drm_i915_private *dev_priv, enum pipe pipe); |
| int lpt_get_iclkip(struct drm_i915_private *dev_priv); |
| +bool intel_fuzzy_clock_check(int clock1, int clock2); |
| |
| /* modesetting asserts */ |
| void assert_panel_unlocked(struct drm_i915_private *dev_priv, |
| --- a/drivers/gpu/drm/i915/intel_dsi_vbt.c |
| +++ b/drivers/gpu/drm/i915/intel_dsi_vbt.c |
| @@ -871,6 +871,17 @@ bool intel_dsi_vbt_init(struct intel_dsi |
| if (mipi_config->target_burst_mode_freq) { |
| u32 bitrate = intel_dsi_bitrate(intel_dsi); |
| |
| + /* |
| + * Sometimes the VBT contains a slightly lower clock, |
| + * then the bitrate we have calculated, in this case |
| + * just replace it with the calculated bitrate. |
| + */ |
| + if (mipi_config->target_burst_mode_freq < bitrate && |
| + intel_fuzzy_clock_check( |
| + mipi_config->target_burst_mode_freq, |
| + bitrate)) |
| + mipi_config->target_burst_mode_freq = bitrate; |
| + |
| if (mipi_config->target_burst_mode_freq < bitrate) { |
| DRM_ERROR("Burst mode freq is less than computed\n"); |
| return false; |