[PATCH 03/35] drm/i915/bios: Indicate which VBT structures are based on EDID
Jani Nikula
jani.nikula at linux.intel.com
Mon May 6 09:14:19 UTC 2024
On Fri, 03 May 2024, Ville Syrjala <ville.syrjala at linux.intel.com> wrote:
> From: Ville Syrjälä <ville.syrjala at linux.intel.com>
>
> 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 at linux.intel.com>
Reviewed-by: Jani Nikula <jani.nikula at intel.com>
> ---
> 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
More information about the Intel-gfx
mailing list