On Fri, 03 May 2024, Ville Syrjala <ville.syrjala@xxxxxxxxxxxxxxx> wrote: > From: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> > > VBT reuses a bunch of EDID data structures. Flag those as such > for clarity. > > I chose "bdb_edid_" as the namespace for these. > > Signed-off-by: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> Reviewed-by: Jani Nikula <jani.nikula@xxxxxxxxx> > --- > drivers/gpu/drm/i915/display/intel_bios.c | 28 +++--- > drivers/gpu/drm/i915/display/intel_vbt_defs.h | 95 ++++++++++--------- > 2 files changed, 62 insertions(+), 61 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/intel_bios.c b/drivers/gpu/drm/i915/display/intel_bios.c > index 661842a3c2e6..9f933508be1c 100644 > --- a/drivers/gpu/drm/i915/display/intel_bios.c > +++ b/drivers/gpu/drm/i915/display/intel_bios.c > @@ -242,13 +242,13 @@ static bool validate_lfp_data_ptrs(const void *bdb, > > /* fp_timing has variable size */ > if (fp_timing_size < 32 || > - dvo_timing_size != sizeof(struct lvds_dvo_timing) || > - panel_pnp_id_size != sizeof(struct lvds_pnp_id)) > + dvo_timing_size != sizeof(struct bdb_edid_dtd) || > + panel_pnp_id_size != sizeof(struct bdb_edid_pnp_id)) > return false; > > /* panel_name is not present in old VBTs */ > if (panel_name_size != 0 && > - panel_name_size != sizeof(struct lvds_lfp_panel_name)) > + panel_name_size != sizeof(struct bdb_edid_product_name)) > return false; > > lfp_data_size = ptrs->ptr[1].fp_timing.offset - ptrs->ptr[0].fp_timing.offset; > @@ -385,8 +385,8 @@ static void *generate_lfp_data_ptrs(struct drm_i915_private *i915, > > block_size = get_blocksize(block); > > - size = fp_timing_size + sizeof(struct lvds_dvo_timing) + > - sizeof(struct lvds_pnp_id); > + size = fp_timing_size + sizeof(struct bdb_edid_dtd) + > + sizeof(struct bdb_edid_pnp_id); > if (size * 16 > block_size) > return NULL; > > @@ -398,10 +398,10 @@ static void *generate_lfp_data_ptrs(struct drm_i915_private *i915, > *(u16 *)(ptrs_block + 1) = sizeof(*ptrs); > ptrs = ptrs_block + 3; > > - table_size = sizeof(struct lvds_pnp_id); > + table_size = sizeof(struct bdb_edid_pnp_id); > size = make_lfp_data_ptr(&ptrs->ptr[0].panel_pnp_id, table_size, size); > > - table_size = sizeof(struct lvds_dvo_timing); > + table_size = sizeof(struct bdb_edid_dtd); > size = make_lfp_data_ptr(&ptrs->ptr[0].dvo_timing, table_size, size); > > table_size = fp_timing_size; > @@ -419,15 +419,15 @@ static void *generate_lfp_data_ptrs(struct drm_i915_private *i915, > return NULL; > } > > - size = fp_timing_size + sizeof(struct lvds_dvo_timing) + > - sizeof(struct lvds_pnp_id); > + size = fp_timing_size + sizeof(struct bdb_edid_dtd) + > + sizeof(struct bdb_edid_pnp_id); > for (i = 1; i < 16; i++) { > next_lfp_data_ptr(&ptrs->ptr[i].fp_timing, &ptrs->ptr[i-1].fp_timing, size); > next_lfp_data_ptr(&ptrs->ptr[i].dvo_timing, &ptrs->ptr[i-1].dvo_timing, size); > next_lfp_data_ptr(&ptrs->ptr[i].panel_pnp_id, &ptrs->ptr[i-1].panel_pnp_id, size); > } > > - table_size = sizeof(struct lvds_lfp_panel_name); > + table_size = sizeof(struct bdb_edid_product_name); > > if (16 * (size + table_size) <= block_size) { > ptrs->panel_name.table_size = table_size; > @@ -525,7 +525,7 @@ static void init_bdb_blocks(struct drm_i915_private *i915, > static void > fill_detail_timing_data(struct drm_i915_private *i915, > struct drm_display_mode *panel_fixed_mode, > - const struct lvds_dvo_timing *dvo_timing) > + const struct bdb_edid_dtd *dvo_timing) > { > panel_fixed_mode->hdisplay = (dvo_timing->hactive_hi << 8) | > dvo_timing->hactive_lo; > @@ -579,7 +579,7 @@ fill_detail_timing_data(struct drm_i915_private *i915, > drm_mode_set_name(panel_fixed_mode); > } > > -static const struct lvds_dvo_timing * > +static const struct bdb_edid_dtd * > get_lvds_dvo_timing(const struct bdb_lvds_lfp_data *data, > const struct bdb_lvds_lfp_data_ptrs *ptrs, > int index) > @@ -601,7 +601,7 @@ get_lvds_pnp_id(const struct bdb_lvds_lfp_data *data, > int index) > { > /* These two are supposed to have the same layout in memory. */ > - BUILD_BUG_ON(sizeof(struct lvds_pnp_id) != sizeof(struct drm_edid_product_id)); > + BUILD_BUG_ON(sizeof(struct bdb_edid_pnp_id) != sizeof(struct drm_edid_product_id)); > > return (const void *)data + ptrs->ptr[index].panel_pnp_id.offset; > } > @@ -835,7 +835,7 @@ parse_lfp_panel_dtd(struct drm_i915_private *i915, > const struct bdb_lvds_lfp_data *lvds_lfp_data, > const struct bdb_lvds_lfp_data_ptrs *lvds_lfp_data_ptrs) > { > - const struct lvds_dvo_timing *panel_dvo_timing; > + const struct bdb_edid_dtd *panel_dvo_timing; > const struct lvds_fp_timing *fp_timing; > struct drm_display_mode *panel_fixed_mode; > int panel_type = panel->vbt.panel_type; > diff --git a/drivers/gpu/drm/i915/display/intel_vbt_defs.h b/drivers/gpu/drm/i915/display/intel_vbt_defs.h > index eebb91f4d88b..7ad4d31f6437 100644 > --- a/drivers/gpu/drm/i915/display/intel_vbt_defs.h > +++ b/drivers/gpu/drm/i915/display/intel_vbt_defs.h > @@ -39,6 +39,50 @@ > > #include "intel_bios.h" > > +/* EDID derived structures */ > +struct bdb_edid_pnp_id { > + u16 mfg_name; > + u16 product_code; > + u32 serial; > + u8 mfg_week; > + u8 mfg_year; > +} __packed; > + > +struct bdb_edid_product_name { > + char name[13]; > +} __packed; > + > +struct bdb_edid_dtd { > + u16 clock; /**< In 10khz */ > + u8 hactive_lo; > + u8 hblank_lo; > + u8 hblank_hi:4; > + u8 hactive_hi:4; > + u8 vactive_lo; > + u8 vblank_lo; > + u8 vblank_hi:4; > + u8 vactive_hi:4; > + u8 hsync_off_lo; > + u8 hsync_pulse_width_lo; > + u8 vsync_pulse_width_lo:4; > + u8 vsync_off_lo:4; > + u8 vsync_pulse_width_hi:2; > + u8 vsync_off_hi:2; > + u8 hsync_pulse_width_hi:2; > + u8 hsync_off_hi:2; > + u8 himage_lo; > + u8 vimage_lo; > + u8 vimage_hi:4; > + u8 himage_hi:4; > + u8 h_border; > + u8 v_border; > + u8 rsvd1:3; > + u8 digital:2; > + u8 vsync_positive:1; > + u8 hsync_positive:1; > + u8 non_interlaced:1; > +} __packed; > + > /** > * struct vbt_header - VBT Header structure > * @signature: VBT signature, always starts with "$VBT" > @@ -645,39 +689,8 @@ struct bdb_sdvo_lvds_options { > * Block 23 - SDVO LVDS Panel DTDs > */ > > -struct lvds_dvo_timing { > - u16 clock; /**< In 10khz */ > - u8 hactive_lo; > - u8 hblank_lo; > - u8 hblank_hi:4; > - u8 hactive_hi:4; > - u8 vactive_lo; > - u8 vblank_lo; > - u8 vblank_hi:4; > - u8 vactive_hi:4; > - u8 hsync_off_lo; > - u8 hsync_pulse_width_lo; > - u8 vsync_pulse_width_lo:4; > - u8 vsync_off_lo:4; > - u8 vsync_pulse_width_hi:2; > - u8 vsync_off_hi:2; > - u8 hsync_pulse_width_hi:2; > - u8 hsync_off_hi:2; > - u8 himage_lo; > - u8 vimage_lo; > - u8 vimage_hi:4; > - u8 himage_hi:4; > - u8 h_border; > - u8 v_border; > - u8 rsvd1:3; > - u8 digital:2; > - u8 vsync_positive:1; > - u8 hsync_positive:1; > - u8 non_interlaced:1; > -} __packed; > - > struct bdb_sdvo_panel_dtds { > - struct lvds_dvo_timing dtds[4]; > + struct bdb_edid_dtd dtds[4]; > } __packed; > > /* > @@ -828,14 +841,6 @@ struct lvds_fp_timing { > u16 terminator; > } __packed; > > -struct lvds_pnp_id { > - u16 mfg_name; > - u16 product_code; > - u32 serial; > - u8 mfg_week; > - u8 mfg_year; > -} __packed; > - > /* > * For reference only. fp_timing has variable size so > * the data must be accessed using the data table pointers. > @@ -843,18 +848,14 @@ struct lvds_pnp_id { > */ > struct lvds_lfp_data_entry { > struct lvds_fp_timing fp_timing; > - struct lvds_dvo_timing dvo_timing; > - struct lvds_pnp_id pnp_id; > + struct bdb_edid_dtd dvo_timing; > + struct bdb_edid_pnp_id pnp_id; > } __packed; > > struct bdb_lvds_lfp_data { > struct lvds_lfp_data_entry data[16]; > } __packed; > > -struct lvds_lfp_panel_name { > - u8 name[13]; > -} __packed; > - > struct lvds_lfp_black_border { > u8 top; /* 227+ */ > u8 bottom; /* 227+ */ > @@ -863,7 +864,7 @@ struct lvds_lfp_black_border { > } __packed; > > struct bdb_lvds_lfp_data_tail { > - struct lvds_lfp_panel_name panel_name[16]; /* (156-163?)+ */ > + struct bdb_edid_product_name panel_name[16]; /* (156-163?)+ */ > u16 scaling_enable; /* 187+ */ > u8 seamless_drrs_min_refresh_rate[16]; /* 188+ */ > u8 pixel_overlap_count[16]; /* 208+ */ -- Jani Nikula, Intel