> -----Original Message----- > From: Lee, Shawn C <shawn.c.lee@xxxxxxxxx> > Sent: Thursday, August 12, 2021 9:13 PM > To: intel-gfx@xxxxxxxxxxxxxxxxxxxxx > Cc: Nikula, Jani <jani.nikula@xxxxxxxxx>; ville.syrjala@xxxxxxxxxxxxxxx; > Kulkarni, Vandita <vandita.kulkarni@xxxxxxxxx>; Chiou, Cooper > <cooper.chiou@xxxxxxxxx>; Tseng, William <william.tseng@xxxxxxxxx>; Lee, > Shawn C <shawn.c.lee@xxxxxxxxx>; Jani Nikula <jani.nikula@xxxxxxxxxxxxxxx> > Subject: [v4 6/7] drm/i915/dsi: Retrieve max brightness level from VBT. > > So far, DCS backlight driver hardcode (0xFF) for max brightness level. > MIPI DCS spec allow max 0xFFFF for set_display_brightness (51h) command. > And VBT brightness precision bits can support 8 ~ 16 bits. > > We should set correct precision bits in VBT that meet panel's request. > Driver can refer to this setting then configure max brightness level in DCS > backlight driver properly. > > Cc: Ville Syrjala <ville.syrjala@xxxxxxxxxxxxxxx> > Cc: Jani Nikula <jani.nikula@xxxxxxxxxxxxxxx> > Cc: Vandita Kulkarni <vandita.kulkarni@xxxxxxxxx> > Cc: Cooper Chiou <cooper.chiou@xxxxxxxxx> > Cc: William Tseng <william.tseng@xxxxxxxxx> > Signed-off-by: Lee Shawn C <shawn.c.lee@xxxxxxxxx> > --- > drivers/gpu/drm/i915/display/intel_bios.c | 3 +++ > .../gpu/drm/i915/display/intel_dsi_dcs_backlight.c | 12 +++++++++--- > drivers/gpu/drm/i915/i915_drv.h | 1 + > 3 files changed, 13 insertions(+), 3 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/intel_bios.c > b/drivers/gpu/drm/i915/display/intel_bios.c > index e86e6ed2d3bf..1affd679d1d1 100644 > --- a/drivers/gpu/drm/i915/display/intel_bios.c > +++ b/drivers/gpu/drm/i915/display/intel_bios.c > @@ -483,6 +483,9 @@ parse_lfp_backlight(struct drm_i915_private *i915, > level = 255; > } > i915->vbt.backlight.min_brightness = min_level; > + > + i915->vbt.backlight.max_brightness_level = > + (1 << backlight_data- > >brightness_precision_bits[panel_type]) - 1; > } else { > level = backlight_data->level[panel_type]; > i915->vbt.backlight.min_brightness = entry->min_brightness; > diff --git a/drivers/gpu/drm/i915/display/intel_dsi_dcs_backlight.c > b/drivers/gpu/drm/i915/display/intel_dsi_dcs_backlight.c > index 584c14c4cbd0..cd85520d36e2 100644 > --- a/drivers/gpu/drm/i915/display/intel_dsi_dcs_backlight.c > +++ b/drivers/gpu/drm/i915/display/intel_dsi_dcs_backlight.c > @@ -41,7 +41,7 @@ > #define POWER_SAVE_HIGH (3 << 0) > #define POWER_SAVE_OUTDOOR_MODE (4 << 0) > > -#define PANEL_PWM_MAX_VALUE 0xFF Shouldn't this be panel dependant too? > +#define PANEL_PWM_MAX_VALUE 0xFFFF > > static u32 dcs_get_backlight(struct intel_connector *connector, enum pipe > unused) { @@ -147,10 +147,16 @@ static void dcs_enable_backlight(const > struct intel_crtc_state *crtc_state, static int dcs_setup_backlight(struct > intel_connector *connector, > enum pipe unused) > { > + struct drm_device *dev = connector->base.dev; > + struct drm_i915_private *dev_priv = to_i915(dev); > struct intel_panel *panel = &connector->panel; > > - panel->backlight.max = PANEL_PWM_MAX_VALUE; > - panel->backlight.level = PANEL_PWM_MAX_VALUE; > + panel->backlight.max = dev_priv- > >vbt.backlight.max_brightness_level \ > + ? dev_priv->vbt.backlight.max_brightness_level \ > + : PANEL_PWM_MAX_VALUE; > + panel->backlight.level = dev_priv- > >vbt.backlight.max_brightness_level \ > + ? dev_priv- > >vbt.backlight.max_brightness_level \ > + : PANEL_PWM_MAX_VALUE; > > return 0; > } > diff --git a/drivers/gpu/drm/i915/i915_drv.h > b/drivers/gpu/drm/i915/i915_drv.h index 005b1cec7007..fbb3f18e7b8e > 100644 > --- a/drivers/gpu/drm/i915/i915_drv.h > +++ b/drivers/gpu/drm/i915/i915_drv.h > @@ -706,6 +706,7 @@ struct intel_vbt_data { > > struct { > u16 pwm_freq_hz; VBT doesn't provide max_brightness_level, instead it gives us Brightness Precision bits from version 236 onwards. > + u16 max_brightness_level; > bool present; > bool active_low_pwm; > u8 min_brightness; /* min_brightness/255 of max */ > -- > 2.17.1