From: Ben Widawsky <benjamin.widaw...@intel.com> This patch enables the VBT to override the PWM left in the BLC register, or correct for VBIOS which doesn't program the BLC, with a VBT entry.
It kills the long hardcoded VLV_DEFAULT_BACKLIGHT_MOD_FREQ As of the last patch, we always will have a default VBT value provided in intel_bios.c Signed-off-by: Ben Widawsky <b...@bwidawsk.net> Signed-off-by: Wayne Boyer <wayne.bo...@intel.com> Change-Id: I4116d5fa21706e9e9ac85e41c43f7443964a822b Reviewed-on: https://chromium-review.googlesource.com/196608 Reviewed-by: Aaron Durbin <adur...@chromium.org> Tested-by: Wayne Boyer <wayne.bo...@intel.com> Commit-Queue: Wayne Boyer <wayne.bo...@intel.com> Conflicts: drivers/gpu/drm/i915/intel_panel.c --- drivers/gpu/drm/i915/intel_bios.h | 16 ---------------- drivers/gpu/drm/i915/intel_panel.c | 30 ++++++++++++++++++++---------- 2 files changed, 20 insertions(+), 26 deletions(-) diff --git a/drivers/gpu/drm/i915/intel_bios.h b/drivers/gpu/drm/i915/intel_bios.h index 62cd658..b986677 100644 --- a/drivers/gpu/drm/i915/intel_bios.h +++ b/drivers/gpu/drm/i915/intel_bios.h @@ -408,22 +408,6 @@ struct bdb_lfp_backlight_data { u8 level[16]; } __packed; -struct bdb_lfp_backlight_data_entry { - u8 type:2; - u8 active_low_pwm:1; - u8 obsolete1:5; - u16 pwm_freq_hz; - u8 min_brightness; - u8 obsolete2; - u8 obsolete3; -} __packed; - -struct bdb_lfp_backlight_data { - u8 entry_size; - struct bdb_lfp_backlight_data_entry data[16]; - u8 level[16]; -} __packed; - struct aimdb_header { char signature[16]; char oem_device[20]; diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c index 02248a5..5270a08 100644 --- a/drivers/gpu/drm/i915/intel_panel.c +++ b/drivers/gpu/drm/i915/intel_panel.c @@ -418,6 +418,14 @@ static u32 intel_panel_compute_brightness(struct intel_connector *connector, return val; } +static u16 __vlv_calculate_mod_freq(u16 hz, bool s0ix) +{ + if (!s0ix) + return 100000000 / (128 * hz); + else + return 25000000 / (16 * hz); +} + static u32 bdw_get_backlight(struct intel_connector *connector) { struct drm_device *dev = connector->base.dev; @@ -567,7 +575,6 @@ void intel_panel_set_backlight(struct intel_connector *connector, u32 level, enum pipe pipe = intel_get_pipe_from_connector(connector); u32 freq; unsigned long flags; - u64 n; if (!panel->backlight.present || pipe == INVALID_PIPE) return; @@ -1093,21 +1100,24 @@ static int vlv_setup_backlight(struct intel_connector *connector) for_each_pipe(pipe) { u32 duty = I915_READ(VLV_BLC_PWM_CTL(pipe)) & BACKLIGHT_DUTY_CYCLE_MASK; u32 freq = I915_READ(VLV_BLC_PWM_CTL(pipe)) & ~BACKLIGHT_DUTY_CYCLE_MASK; + u32 vbt_val = __vlv_calculate_mod_freq(dev_priv->vbt.backlight.pwm_freq_hz, true); if (freq) { - /* Skip if the modulation freq is already set */ - continue; - } - - if (WARN_ON(pipe == PIPE_A)) { - /* Assume BLC for pipe A is the default. Therefore, A - * must be non-zero. */ - freq = (VLV_DEFAULT_BACKLIGHT_MOD_FREQ << 16); + if (vbt_val != freq >> 16) { + DRM_DEBUG_KMS("reg doesn't match VBT value 0x%x != 0x%x\n", + freq >> 16, vbt_val); + freq = vbt_val << 16; + } else + continue; + } else if (WARN_ON(pipe == PIPE_A)) { + /* VLV will always have a vbt value, fake or other. */ + BUG_ON(IS_VALLEYVIEW(dev) && !vbt_val); + freq = vbt_val << 16; } else freq = I915_READ(VLV_BLC_PWM_CTL(PIPE_A)) & ~BACKLIGHT_DUTY_CYCLE_MASK; if (WARN_ON(freq == 0)) - freq = (VLV_DEFAULT_BACKLIGHT_MOD_FREQ << 16); + freq = vbt_val << 16; I915_WRITE(VLV_BLC_PWM_CTL(pipe), freq | duty); } -- 1.7.9.5 _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/intel-gfx