On Thu, 2021-09-30 at 15:46 +0200, Lukasz Majczak wrote: > With patch "drm/i915/vbt: Fix backlight parsing for VBT 234+" > the size of bdb_lfp_backlight_data structure has been increased, > causing if-statement in the parse_lfp_backlight function > that comapres this structure size to the one retrieved from BDB, > always to fail for older revisions. > This patch calculates expected size of the structure for a given > BDB version and compares it with the value gathered from BDB. > Tested on Chromebook Pixelbook (Nocturne) (reports bdb->version = 221) Reviewed-by: José Roberto de Souza <jose.souza@xxxxxxxxx> > > Tested-by: Lukasz Majczak <lma@xxxxxxxxxxxx> > Signed-off-by: Lukasz Majczak <lma@xxxxxxxxxxxx> > --- > drivers/gpu/drm/i915/display/intel_bios.c | 22 ++++++++++++++----- > drivers/gpu/drm/i915/display/intel_vbt_defs.h | 5 +++++ > 2 files changed, 21 insertions(+), 6 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/intel_bios.c b/drivers/gpu/drm/i915/display/intel_bios.c > index 3c25926092de..f9776ca85de3 100644 > --- a/drivers/gpu/drm/i915/display/intel_bios.c > +++ b/drivers/gpu/drm/i915/display/intel_bios.c > @@ -451,13 +451,23 @@ parse_lfp_backlight(struct drm_i915_private *i915, > } > > i915->vbt.backlight.type = INTEL_BACKLIGHT_DISPLAY_DDI; > - if (bdb->version >= 191 && > - get_blocksize(backlight_data) >= sizeof(*backlight_data)) { > - const struct lfp_backlight_control_method *method; > + if (bdb->version >= 191) { > + size_t exp_size; > > - method = &backlight_data->backlight_control[panel_type]; > - i915->vbt.backlight.type = method->type; > - i915->vbt.backlight.controller = method->controller; > + if (bdb->version >= 236) > + exp_size = sizeof(struct bdb_lfp_backlight_data); > + else if (bdb->version >= 234) > + exp_size = EXP_BDB_LFP_BL_DATA_SIZE_REV_234; > + else > + exp_size = EXP_BDB_LFP_BL_DATA_SIZE_REV_191; > + > + if (get_blocksize(backlight_data) >= exp_size) { > + const struct lfp_backlight_control_method *method; > + > + method = &backlight_data->backlight_control[panel_type]; > + i915->vbt.backlight.type = method->type; > + i915->vbt.backlight.controller = method->controller; > + } > } > > i915->vbt.backlight.pwm_freq_hz = entry->pwm_freq_hz; > diff --git a/drivers/gpu/drm/i915/display/intel_vbt_defs.h b/drivers/gpu/drm/i915/display/intel_vbt_defs.h > index 330077c2e588..a2108a8f544d 100644 > --- a/drivers/gpu/drm/i915/display/intel_vbt_defs.h > +++ b/drivers/gpu/drm/i915/display/intel_vbt_defs.h > @@ -814,6 +814,11 @@ struct lfp_brightness_level { > u16 reserved; > } __packed; > > +#define EXP_BDB_LFP_BL_DATA_SIZE_REV_191 \ > + offsetof(struct bdb_lfp_backlight_data, brightness_level) > +#define EXP_BDB_LFP_BL_DATA_SIZE_REV_234 \ > + offsetof(struct bdb_lfp_backlight_data, brightness_precision_bits) > + > struct bdb_lfp_backlight_data { > u8 entry_size; > struct lfp_backlight_data_entry data[16];