Commit 7234f948 authored by Ville Syrjälä's avatar Ville Syrjälä

drm/i915/bios: Indicate which VBT structures are based on EDID

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: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240503122449.27266-4-ville.syrjala@linux.intel.comReviewed-by: default avatarJani Nikula <jani.nikula@intel.com>
parent d9981f36
...@@ -242,13 +242,13 @@ static bool validate_lfp_data_ptrs(const void *bdb, ...@@ -242,13 +242,13 @@ static bool validate_lfp_data_ptrs(const void *bdb,
/* fp_timing has variable size */ /* fp_timing has variable size */
if (fp_timing_size < 32 || if (fp_timing_size < 32 ||
dvo_timing_size != sizeof(struct lvds_dvo_timing) || dvo_timing_size != sizeof(struct bdb_edid_dtd) ||
panel_pnp_id_size != sizeof(struct lvds_pnp_id)) panel_pnp_id_size != sizeof(struct bdb_edid_pnp_id))
return false; return false;
/* panel_name is not present in old VBTs */ /* panel_name is not present in old VBTs */
if (panel_name_size != 0 && 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; return false;
lfp_data_size = ptrs->ptr[1].fp_timing.offset - ptrs->ptr[0].fp_timing.offset; 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, ...@@ -385,8 +385,8 @@ static void *generate_lfp_data_ptrs(struct drm_i915_private *i915,
block_size = get_blocksize(block); block_size = get_blocksize(block);
size = fp_timing_size + sizeof(struct lvds_dvo_timing) + size = fp_timing_size + sizeof(struct bdb_edid_dtd) +
sizeof(struct lvds_pnp_id); sizeof(struct bdb_edid_pnp_id);
if (size * 16 > block_size) if (size * 16 > block_size)
return NULL; return NULL;
...@@ -398,10 +398,10 @@ static void *generate_lfp_data_ptrs(struct drm_i915_private *i915, ...@@ -398,10 +398,10 @@ static void *generate_lfp_data_ptrs(struct drm_i915_private *i915,
*(u16 *)(ptrs_block + 1) = sizeof(*ptrs); *(u16 *)(ptrs_block + 1) = sizeof(*ptrs);
ptrs = ptrs_block + 3; 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); 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); size = make_lfp_data_ptr(&ptrs->ptr[0].dvo_timing, table_size, size);
table_size = fp_timing_size; table_size = fp_timing_size;
...@@ -419,15 +419,15 @@ static void *generate_lfp_data_ptrs(struct drm_i915_private *i915, ...@@ -419,15 +419,15 @@ static void *generate_lfp_data_ptrs(struct drm_i915_private *i915,
return NULL; return NULL;
} }
size = fp_timing_size + sizeof(struct lvds_dvo_timing) + size = fp_timing_size + sizeof(struct bdb_edid_dtd) +
sizeof(struct lvds_pnp_id); sizeof(struct bdb_edid_pnp_id);
for (i = 1; i < 16; i++) { 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].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].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); 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) { if (16 * (size + table_size) <= block_size) {
ptrs->panel_name.table_size = table_size; ptrs->panel_name.table_size = table_size;
...@@ -525,7 +525,7 @@ static void init_bdb_blocks(struct drm_i915_private *i915, ...@@ -525,7 +525,7 @@ static void init_bdb_blocks(struct drm_i915_private *i915,
static void static void
fill_detail_timing_data(struct drm_i915_private *i915, fill_detail_timing_data(struct drm_i915_private *i915,
struct drm_display_mode *panel_fixed_mode, 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) | panel_fixed_mode->hdisplay = (dvo_timing->hactive_hi << 8) |
dvo_timing->hactive_lo; dvo_timing->hactive_lo;
...@@ -579,7 +579,7 @@ fill_detail_timing_data(struct drm_i915_private *i915, ...@@ -579,7 +579,7 @@ fill_detail_timing_data(struct drm_i915_private *i915,
drm_mode_set_name(panel_fixed_mode); 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, get_lvds_dvo_timing(const struct bdb_lvds_lfp_data *data,
const struct bdb_lvds_lfp_data_ptrs *ptrs, const struct bdb_lvds_lfp_data_ptrs *ptrs,
int index) int index)
...@@ -601,7 +601,7 @@ get_lvds_pnp_id(const struct bdb_lvds_lfp_data *data, ...@@ -601,7 +601,7 @@ get_lvds_pnp_id(const struct bdb_lvds_lfp_data *data,
int index) int index)
{ {
/* These two are supposed to have the same layout in memory. */ /* 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; return (const void *)data + ptrs->ptr[index].panel_pnp_id.offset;
} }
...@@ -835,7 +835,7 @@ parse_lfp_panel_dtd(struct drm_i915_private *i915, ...@@ -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 *lvds_lfp_data,
const struct bdb_lvds_lfp_data_ptrs *lvds_lfp_data_ptrs) 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; const struct lvds_fp_timing *fp_timing;
struct drm_display_mode *panel_fixed_mode; struct drm_display_mode *panel_fixed_mode;
int panel_type = panel->vbt.panel_type; int panel_type = panel->vbt.panel_type;
......
...@@ -39,6 +39,50 @@ ...@@ -39,6 +39,50 @@
#include "intel_bios.h" #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 * struct vbt_header - VBT Header structure
* @signature: VBT signature, always starts with "$VBT" * @signature: VBT signature, always starts with "$VBT"
...@@ -645,39 +689,8 @@ struct bdb_sdvo_lvds_options { ...@@ -645,39 +689,8 @@ struct bdb_sdvo_lvds_options {
* Block 23 - SDVO LVDS Panel DTDs * 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 bdb_sdvo_panel_dtds {
struct lvds_dvo_timing dtds[4]; struct bdb_edid_dtd dtds[4];
} __packed; } __packed;
/* /*
...@@ -828,14 +841,6 @@ struct lvds_fp_timing { ...@@ -828,14 +841,6 @@ struct lvds_fp_timing {
u16 terminator; u16 terminator;
} __packed; } __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 * For reference only. fp_timing has variable size so
* the data must be accessed using the data table pointers. * the data must be accessed using the data table pointers.
...@@ -843,18 +848,14 @@ struct lvds_pnp_id { ...@@ -843,18 +848,14 @@ struct lvds_pnp_id {
*/ */
struct lvds_lfp_data_entry { struct lvds_lfp_data_entry {
struct lvds_fp_timing fp_timing; struct lvds_fp_timing fp_timing;
struct lvds_dvo_timing dvo_timing; struct bdb_edid_dtd dvo_timing;
struct lvds_pnp_id pnp_id; struct bdb_edid_pnp_id pnp_id;
} __packed; } __packed;
struct bdb_lvds_lfp_data { struct bdb_lvds_lfp_data {
struct lvds_lfp_data_entry data[16]; struct lvds_lfp_data_entry data[16];
} __packed; } __packed;
struct lvds_lfp_panel_name {
u8 name[13];
} __packed;
struct lvds_lfp_black_border { struct lvds_lfp_black_border {
u8 top; /* 227+ */ u8 top; /* 227+ */
u8 bottom; /* 227+ */ u8 bottom; /* 227+ */
...@@ -863,7 +864,7 @@ struct lvds_lfp_black_border { ...@@ -863,7 +864,7 @@ struct lvds_lfp_black_border {
} __packed; } __packed;
struct bdb_lvds_lfp_data_tail { 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+ */ u16 scaling_enable; /* 187+ */
u8 seamless_drrs_min_refresh_rate[16]; /* 188+ */ u8 seamless_drrs_min_refresh_rate[16]; /* 188+ */
u8 pixel_overlap_count[16]; /* 208+ */ u8 pixel_overlap_count[16]; /* 208+ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment