1  /*
2   * Copyright © 2006-2016 Intel Corporation
3   *
4   * Permission is hereby granted, free of charge, to any person obtaining a
5   * copy of this software and associated documentation files (the "Software"),
6   * to deal in the Software without restriction, including without limitation
7   * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8   * and/or sell copies of the Software, and to permit persons to whom the
9   * Software is furnished to do so, subject to the following conditions:
10   *
11   * The above copyright notice and this permission notice (including the next
12   * paragraph) shall be included in all copies or substantial portions of the
13   * Software.
14   *
15   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18   * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21   * SOFTWARE.
22   *
23   * Authors:
24   *    Eric Anholt <eric@anholt.net>
25   *
26   */
27  
28  /*
29   * This information is private to VBT parsing in intel_bios.c.
30   *
31   * Please do NOT include anywhere else.
32   */
33  #ifndef _INTEL_BIOS_PRIVATE
34  #error "intel_vbt_defs.h is private to intel_bios.c"
35  #endif
36  
37  #ifndef _INTEL_VBT_DEFS_H_
38  #define _INTEL_VBT_DEFS_H_
39  
40  #include "intel_bios.h"
41  
42  /* EDID derived structures */
43  struct bdb_edid_pnp_id {
44  	u16 mfg_name;
45  	u16 product_code;
46  	u32 serial;
47  	u8 mfg_week;
48  	u8 mfg_year;
49  } __packed;
50  
51  struct bdb_edid_product_name {
52  	char name[13];
53  } __packed;
54  
55  struct bdb_edid_dtd {
56  	u16 clock;		/**< In 10khz */
57  	u8 hactive_lo;
58  	u8 hblank_lo;
59  	u8 hblank_hi:4;
60  	u8 hactive_hi:4;
61  	u8 vactive_lo;
62  	u8 vblank_lo;
63  	u8 vblank_hi:4;
64  	u8 vactive_hi:4;
65  	u8 hsync_off_lo;
66  	u8 hsync_pulse_width_lo;
67  	u8 vsync_pulse_width_lo:4;
68  	u8 vsync_off_lo:4;
69  	u8 vsync_pulse_width_hi:2;
70  	u8 vsync_off_hi:2;
71  	u8 hsync_pulse_width_hi:2;
72  	u8 hsync_off_hi:2;
73  	u8 himage_lo;
74  	u8 vimage_lo;
75  	u8 vimage_hi:4;
76  	u8 himage_hi:4;
77  	u8 h_border;
78  	u8 v_border;
79  	u8 rsvd1:3;
80  	u8 digital:2;
81  	u8 vsync_positive:1;
82  	u8 hsync_positive:1;
83  	u8 non_interlaced:1;
84  } __packed;
85  
86  /**
87   * struct vbt_header - VBT Header structure
88   * @signature:		VBT signature, always starts with "$VBT"
89   * @version:		Version of this structure
90   * @header_size:	Size of this structure
91   * @vbt_size:		Size of VBT (VBT Header, BDB Header and data blocks)
92   * @vbt_checksum:	Checksum
93   * @reserved0:		Reserved
94   * @bdb_offset:		Offset of &struct bdb_header from beginning of VBT
95   * @aim_offset:		Offsets of add-in data blocks from beginning of VBT
96   */
97  struct vbt_header {
98  	u8 signature[20];
99  	u16 version;
100  	u16 header_size;
101  	u16 vbt_size;
102  	u8 vbt_checksum;
103  	u8 reserved0;
104  	u32 bdb_offset;
105  	u32 aim_offset[4];
106  } __packed;
107  
108  /**
109   * struct bdb_header - BDB Header structure
110   * @signature:		BDB signature "BIOS_DATA_BLOCK"
111   * @version:		Version of the data block definitions
112   * @header_size:	Size of this structure
113   * @bdb_size:		Size of BDB (BDB Header and data blocks)
114   */
115  struct bdb_header {
116  	u8 signature[16];
117  	u16 version;
118  	u16 header_size;
119  	u16 bdb_size;
120  } __packed;
121  
122  /*
123   * BDB version number dependencies are documented as:
124   *
125   * <start>+
126   *    indicates the field was introduced in version <start>
127   *    and is still valid
128   *
129   * <start>-<end>
130   *    indicates the field was introduced in version <start>
131   *    and obsoleted in version <end>+1.
132   *
133   * ??? indicates the specific version number is unknown
134   */
135  
136  /*
137   * There are several types of BIOS data blocks (BDBs), each block has
138   * an ID and size in the first 3 bytes (ID in first, size in next 2).
139   * Known types are listed below.
140   */
141  enum bdb_block_id {
142  	BDB_GENERAL_FEATURES		= 1,
143  	BDB_GENERAL_DEFINITIONS		= 2,
144  	BDB_DISPLAY_TOGGLE		= 3,
145  	BDB_MODE_SUPPORT_LIST		= 4,
146  	BDB_GENERIC_MODE_TABLE		= 5,
147  	BDB_EXT_MMIO_REGS		= 6, /* VBIOS only */
148  	BDB_SWF_IO			= 7, /* VBIOS only */
149  	BDB_SWF_MMIO			= 8, /* VBIOS only */
150  	BDB_DOT_CLOCK_OVERRIDE_ALM	= 9,
151  	BDB_PSR				= 9, /* 165+ */
152  	BDB_MODE_REMOVAL_TABLE		= 10,
153  	BDB_CHILD_DEVICE_TABLE		= 11,
154  	BDB_DRIVER_FEATURES		= 12,
155  	BDB_DRIVER_PERSISTENCE		= 13,
156  	BDB_EXT_TABLE_PTRS		= 14, /* VBIOS only */
157  	BDB_DOT_CLOCK_OVERRIDE		= 15,
158  	BDB_DISPLAY_SELECT_OLD		= 16,
159  	BDB_SV_TEST_FUNCTIONS		= 17,
160  	BDB_DRIVER_ROTATION		= 18,
161  	BDB_DISPLAY_REMOVE_OLD		= 19,
162  	BDB_OEM_CUSTOM			= 20,
163  	BDB_EFP_LIST			= 21, /* workarounds for VGA hsync/vsync */
164  	BDB_SDVO_LVDS_OPTIONS		= 22,
165  	BDB_SDVO_LVDS_DTD		= 23,
166  	BDB_SDVO_LVDS_PNP_ID		= 24,
167  	BDB_SDVO_LVDS_PPS		= 25,
168  	BDB_TV_OPTIONS			= 26,
169  	BDB_EDP				= 27,
170  	BDB_EFP_DTD			= 28, /* 161+ */
171  	BDB_DISPLAY_SELECT_IVB		= 29, /* 164+ */
172  	BDB_DISPLAY_REMOVE_IVB		= 30, /* 164+ */
173  	BDB_DISPLAY_SELECT_HSW		= 31, /* 166+ */
174  	BDB_DISPLAY_REMOVE_HSW		= 32, /* 166+ */
175  	BDB_LFP_OPTIONS			= 40,
176  	BDB_LFP_DATA_PTRS		= 41,
177  	BDB_LFP_DATA			= 42,
178  	BDB_LFP_BACKLIGHT		= 43,
179  	BDB_LFP_POWER			= 44,
180  	BDB_EDP_BFI			= 45, /* 160+ */
181  	BDB_CHROMATICITY		= 46, /* 169+ */
182  	BDB_MIPI			= 50, /* 170-172 */
183  	BDB_FIXED_SET_MODE		= 51, /* 172+ */
184  	BDB_MIPI_CONFIG			= 52, /* 175+ */
185  	BDB_MIPI_SEQUENCE		= 53, /* 177+ */
186  	BDB_RGB_PALETTE			= 54, /* 180+ */
187  	BDB_COMPRESSION_PARAMETERS_OLD	= 55, /* 198-212 */
188  	BDB_COMPRESSION_PARAMETERS	= 56, /* 213+ */
189  	BDB_VSWING_PREEMPH		= 57, /* 218+ */
190  	BDB_GENERIC_DTD			= 58, /* 229+ */
191  	BDB_INT15_HOOK			= 252, /* VBIOS only */
192  	BDB_PRD_TABLE			= 253,
193  	BDB_SKIP			= 254, /* VBIOS only */
194  };
195  
196  /*
197   * Block 1 - General Bit Definitions
198   */
199  
200  struct bdb_general_features {
201          /* bits 1 */
202  	u8 panel_fitting:2;
203  	u8 flexaim:1;
204  	u8 msg_enable:1;
205  	u8 clear_screen:3;
206  	u8 color_flip:1;
207  
208          /* bits 2 */
209  	u8 download_ext_vbt:1;
210  	u8 enable_ssc:1;
211  	u8 ssc_freq:1;
212  	u8 enable_lfp_on_override:1;
213  	u8 disable_ssc_ddt:1;
214  	u8 underscan_vga_timings:1;
215  	u8 display_clock_mode:1;
216  	u8 vbios_hotplug_support:1;
217  
218          /* bits 3 */
219  	u8 disable_smooth_vision:1;
220  	u8 single_dvi:1;
221  	u8 rotate_180:1;					/* 181+ */
222  	u8 fdi_rx_polarity_inverted:1;
223  	u8 vbios_extended_mode:1;				/* 160+ */
224  	u8 copy_ilfp_dtd_to_sdvo_lvds_dtd:1;			/* 160+ */
225  	u8 panel_best_fit_timing:1;				/* 160+ */
226  	u8 ignore_strap_state:1;				/* 160+ */
227  
228          /* bits 4 */
229  	u8 legacy_monitor_detect;
230  
231          /* bits 5 */
232  	u8 int_crt_support:1;
233  	u8 int_tv_support:1;
234  	u8 int_efp_support:1;
235  	u8 dp_ssc_enable:1;	/* PCH attached eDP supports SSC */
236  	u8 dp_ssc_freq:1;	/* SSC freq for PCH attached eDP */
237  	u8 dp_ssc_dongle_supported:1;
238  	u8 rsvd11:2; /* finish byte */
239  
240  	/* bits 6 */
241  	u8 tc_hpd_retry_timeout:7;				/* 242+ */
242  	u8 rsvd12:1;
243  
244  	/* bits 7 */
245  	u8 afc_startup_config:2;				/* 249+ */
246  	u8 rsvd13:6;
247  } __packed;
248  
249  /*
250   * Block 2 - General Bytes Definition
251   */
252  
253  /* pre-915 */
254  #define GPIO_PIN_DVI_LVDS	0x03 /* "DVI/LVDS DDC GPIO pins" */
255  #define GPIO_PIN_ADD_I2C	0x05 /* "ADDCARD I2C GPIO pins" */
256  #define GPIO_PIN_ADD_DDC	0x04 /* "ADDCARD DDC GPIO pins" */
257  #define GPIO_PIN_ADD_DDC_I2C	0x06 /* "ADDCARD DDC/I2C GPIO pins" */
258  
259  /* Device handle */
260  #define DEVICE_HANDLE_CRT	0x0001
261  #define DEVICE_HANDLE_TV	0x0002 /* ???-214 */
262  #define DEVICE_HANDLE_EFP1	0x0004
263  #define DEVICE_HANDLE_EFP2	0x0040
264  #define DEVICE_HANDLE_EFP3	0x0020
265  #define DEVICE_HANDLE_EFP4	0x0010
266  #define DEVICE_HANDLE_EFP5	0x0002 /* 215+ */
267  #define DEVICE_HANDLE_EFP6	0x0001 /* 217+ */
268  #define DEVICE_HANDLE_EFP7	0x0100 /* 217+ */
269  #define DEVICE_HANDLE_EFP8	0x0200 /* 217+ */
270  #define DEVICE_HANDLE_LFP1	0x0008
271  #define DEVICE_HANDLE_LFP2	0x0080
272  
273  /* Pre 915 */
274  #define DEVICE_TYPE_NONE	0x00
275  #define DEVICE_TYPE_CRT		0x01
276  #define DEVICE_TYPE_TV		0x09
277  #define DEVICE_TYPE_EFP		0x12
278  #define DEVICE_TYPE_LFP		0x22
279  /* On 915+ */
280  #define DEVICE_TYPE_CRT_DPMS		0x6001
281  #define DEVICE_TYPE_CRT_DPMS_HOTPLUG	0x4001
282  #define DEVICE_TYPE_TV_COMPOSITE	0x0209
283  #define DEVICE_TYPE_TV_MACROVISION	0x0289
284  #define DEVICE_TYPE_TV_RF_COMPOSITE	0x020c
285  #define DEVICE_TYPE_TV_SVIDEO_COMPOSITE	0x0609
286  #define DEVICE_TYPE_TV_SCART		0x0209
287  #define DEVICE_TYPE_TV_CODEC_HOTPLUG_PWR 0x6009
288  #define DEVICE_TYPE_EFP_HOTPLUG_PWR	0x6012
289  #define DEVICE_TYPE_EFP_DVI_HOTPLUG_PWR	0x6052
290  #define DEVICE_TYPE_EFP_DVI_I		0x6053
291  #define DEVICE_TYPE_EFP_DVI_D_DUAL	0x6152
292  #define DEVICE_TYPE_EFP_DVI_D_HDCP	0x60d2
293  #define DEVICE_TYPE_OPENLDI_HOTPLUG_PWR	0x6062
294  #define DEVICE_TYPE_OPENLDI_DUALPIX	0x6162
295  #define DEVICE_TYPE_LFP_PANELLINK	0x5012
296  #define DEVICE_TYPE_LFP_CMOS_PWR	0x5042
297  #define DEVICE_TYPE_LFP_LVDS_PWR	0x5062
298  #define DEVICE_TYPE_LFP_LVDS_DUAL	0x5162
299  #define DEVICE_TYPE_LFP_LVDS_DUAL_HDCP	0x51e2
300  
301  /* Add the device class for LFP, TV, HDMI */
302  #define DEVICE_TYPE_INT_LFP		0x1022
303  #define DEVICE_TYPE_INT_TV		0x1009
304  #define DEVICE_TYPE_HDMI		0x60D2
305  #define DEVICE_TYPE_DP			0x68C6
306  #define DEVICE_TYPE_DP_DUAL_MODE	0x60D6
307  #define DEVICE_TYPE_eDP			0x78C6
308  
309  #define DEVICE_TYPE_CLASS_EXTENSION	(1 << 15)
310  #define DEVICE_TYPE_POWER_MANAGEMENT	(1 << 14)
311  #define DEVICE_TYPE_HOTPLUG_SIGNALING	(1 << 13)
312  #define DEVICE_TYPE_INTERNAL_CONNECTOR	(1 << 12)
313  #define DEVICE_TYPE_NOT_HDMI_OUTPUT	(1 << 11)
314  #define DEVICE_TYPE_MIPI_OUTPUT		(1 << 10)
315  #define DEVICE_TYPE_COMPOSITE_OUTPUT	(1 << 9)
316  #define DEVICE_TYPE_DUAL_CHANNEL	(1 << 8)
317  #define DEVICE_TYPE_HIGH_SPEED_LINK	(1 << 6)
318  #define DEVICE_TYPE_LVDS_SIGNALING	(1 << 5)
319  #define DEVICE_TYPE_TMDS_DVI_SIGNALING	(1 << 4)
320  #define DEVICE_TYPE_VIDEO_SIGNALING	(1 << 3)
321  #define DEVICE_TYPE_DISPLAYPORT_OUTPUT	(1 << 2)
322  #define DEVICE_TYPE_DIGITAL_OUTPUT	(1 << 1)
323  #define DEVICE_TYPE_ANALOG_OUTPUT	(1 << 0)
324  
325  #define DEVICE_CFG_NONE		0x00
326  #define DEVICE_CFG_12BIT_DVOB	0x01
327  #define DEVICE_CFG_12BIT_DVOC	0x02
328  #define DEVICE_CFG_24BIT_DVOBC	0x09
329  #define DEVICE_CFG_24BIT_DVOCB	0x0a
330  #define DEVICE_CFG_DUAL_DVOB	0x11
331  #define DEVICE_CFG_DUAL_DVOC	0x12
332  #define DEVICE_CFG_DUAL_DVOBC	0x13
333  #define DEVICE_CFG_DUAL_LINK_DVOBC	0x19
334  #define DEVICE_CFG_DUAL_LINK_DVOCB	0x1a
335  
336  #define DEVICE_WIRE_NONE	0x00
337  #define DEVICE_WIRE_DVOB	0x01
338  #define DEVICE_WIRE_DVOC	0x02
339  #define DEVICE_WIRE_DVOBC	0x03
340  #define DEVICE_WIRE_DVOBB	0x05
341  #define DEVICE_WIRE_DVOCC	0x06
342  #define DEVICE_WIRE_DVOB_MASTER 0x0d
343  #define DEVICE_WIRE_DVOC_MASTER 0x0e
344  
345  /* dvo_port pre BDB 155 */
346  #define DEVICE_PORT_DVOA	0x00 /* none on 845+ */
347  #define DEVICE_PORT_DVOB	0x01
348  #define DEVICE_PORT_DVOC	0x02
349  
350  /* dvo_port BDB 155+ */
351  #define DVO_PORT_HDMIA		0
352  #define DVO_PORT_HDMIB		1
353  #define DVO_PORT_HDMIC		2
354  #define DVO_PORT_HDMID		3
355  #define DVO_PORT_LVDS		4
356  #define DVO_PORT_TV		5
357  #define DVO_PORT_CRT		6
358  #define DVO_PORT_DPB		7
359  #define DVO_PORT_DPC		8
360  #define DVO_PORT_DPD		9
361  #define DVO_PORT_DPA		10
362  #define DVO_PORT_DPE		11				/* 193+ */
363  #define DVO_PORT_HDMIE		12				/* 193+ */
364  #define DVO_PORT_DPF		13				/* N/A */
365  #define DVO_PORT_HDMIF		14				/* N/A */
366  #define DVO_PORT_DPG		15				/* 217+ */
367  #define DVO_PORT_HDMIG		16				/* 217+ */
368  #define DVO_PORT_DPH		17				/* 217+ */
369  #define DVO_PORT_HDMIH		18				/* 217+ */
370  #define DVO_PORT_DPI		19				/* 217+ */
371  #define DVO_PORT_HDMII		20				/* 217+ */
372  #define DVO_PORT_MIPIA		21				/* 171+ */
373  #define DVO_PORT_MIPIB		22				/* 171+ */
374  #define DVO_PORT_MIPIC		23				/* 171+ */
375  #define DVO_PORT_MIPID		24				/* 171+ */
376  
377  #define HDMI_MAX_DATA_RATE_PLATFORM	0			/* 204+ */
378  #define HDMI_MAX_DATA_RATE_297		1			/* 204+ */
379  #define HDMI_MAX_DATA_RATE_165		2			/* 204+ */
380  #define HDMI_MAX_DATA_RATE_594		3			/* 249+ */
381  #define HDMI_MAX_DATA_RATE_340		4			/* 249+ */
382  #define HDMI_MAX_DATA_RATE_300		5			/* 249+ */
383  
384  #define LEGACY_CHILD_DEVICE_CONFIG_SIZE		33
385  
386  /* DDC Bus DDI Type 155+ */
387  enum vbt_gmbus_ddi {
388  	DDC_BUS_DDI_B = 0x1,
389  	DDC_BUS_DDI_C,
390  	DDC_BUS_DDI_D,
391  	DDC_BUS_DDI_F,
392  	ICL_DDC_BUS_DDI_A = 0x1,
393  	ICL_DDC_BUS_DDI_B,
394  	TGL_DDC_BUS_DDI_C,
395  	RKL_DDC_BUS_DDI_D = 0x3,
396  	RKL_DDC_BUS_DDI_E,
397  	ICL_DDC_BUS_PORT_1 = 0x4,
398  	ICL_DDC_BUS_PORT_2,
399  	ICL_DDC_BUS_PORT_3,
400  	ICL_DDC_BUS_PORT_4,
401  	TGL_DDC_BUS_PORT_5,
402  	TGL_DDC_BUS_PORT_6,
403  	ADLS_DDC_BUS_PORT_TC1 = 0x2,
404  	ADLS_DDC_BUS_PORT_TC2,
405  	ADLS_DDC_BUS_PORT_TC3,
406  	ADLS_DDC_BUS_PORT_TC4,
407  	ADLP_DDC_BUS_PORT_TC1 = 0x3,
408  	ADLP_DDC_BUS_PORT_TC2,
409  	ADLP_DDC_BUS_PORT_TC3,
410  	ADLP_DDC_BUS_PORT_TC4
411  
412  };
413  
414  #define DP_AUX_A 0x40
415  #define DP_AUX_B 0x10
416  #define DP_AUX_C 0x20
417  #define DP_AUX_D 0x30
418  #define DP_AUX_E 0x50
419  #define DP_AUX_F 0x60
420  #define DP_AUX_G 0x70
421  #define DP_AUX_H 0x80
422  #define DP_AUX_I 0x90
423  
424  /* DP max link rate 216+ */
425  #define BDB_216_VBT_DP_MAX_LINK_RATE_HBR3	0
426  #define BDB_216_VBT_DP_MAX_LINK_RATE_HBR2	1
427  #define BDB_216_VBT_DP_MAX_LINK_RATE_HBR	2
428  #define BDB_216_VBT_DP_MAX_LINK_RATE_LBR	3
429  
430  /* DP max link rate 230+ */
431  #define BDB_230_VBT_DP_MAX_LINK_RATE_DEF	0
432  #define BDB_230_VBT_DP_MAX_LINK_RATE_LBR	1
433  #define BDB_230_VBT_DP_MAX_LINK_RATE_HBR	2
434  #define BDB_230_VBT_DP_MAX_LINK_RATE_HBR2	3
435  #define BDB_230_VBT_DP_MAX_LINK_RATE_HBR3	4
436  #define BDB_230_VBT_DP_MAX_LINK_RATE_UHBR10	5
437  #define BDB_230_VBT_DP_MAX_LINK_RATE_UHBR13P5	6
438  #define BDB_230_VBT_DP_MAX_LINK_RATE_UHBR20	7
439  
440  /*
441   * The child device config, aka the display device data structure, provides a
442   * description of a port and its configuration on the platform.
443   *
444   * The child device config size has been increased, and fields have been added
445   * and their meaning has changed over time. Care must be taken when accessing
446   * basically any of the fields to ensure the correct interpretation for the BDB
447   * version in question.
448   *
449   * When we copy the child device configs to dev_priv->display.vbt.child_dev, we
450   * reserve space for the full structure below, and initialize the tail not
451   * actually present in VBT to zeros. Accessing those fields is fine, as long as
452   * the default zero is taken into account, again according to the BDB version.
453   *
454   * BDB versions 155 and below are considered legacy, and version 155 seems to be
455   * a baseline for some of the VBT documentation. When adding new fields, please
456   * include the BDB version when the field was added, if it's above that.
457   */
458  struct child_device_config {
459  	u16 handle;
460  	u16 device_type; /* See DEVICE_TYPE_* above */
461  
462  	union {
463  		u8  device_id[10]; /* ascii string */
464  		struct {
465  			u8 i2c_speed;
466  			u8 dp_onboard_redriver_preemph:3;	/* 158+ */
467  			u8 dp_onboard_redriver_vswing:3;	/* 158+ */
468  			u8 dp_onboard_redriver_present:1;	/* 158+ */
469  			u8 reserved0:1;
470  			u8 dp_ondock_redriver_preemph:3;	/* 158+ */
471  			u8 dp_ondock_redriver_vswing:3;		/* 158+ */
472  			u8 dp_ondock_redriver_present:1;	/* 158+ */
473  			u8 reserved1:1;
474  			u8 hdmi_level_shifter_value:5;		/* 158+ */
475  			u8 hdmi_max_data_rate:3;		/* 204+ */
476  			u16 dtd_buf_ptr;			/* 161+ */
477  			u8 edidless_efp:1;			/* 161+ */
478  			u8 compression_enable:1;		/* 198+ */
479  			u8 compression_method_cps:1;		/* 198+ */
480  			u8 ganged_edp:1;			/* 202+ */
481  			u8 lttpr_non_transparent:1;		/* 235+ */
482  			u8 disable_compression_for_ext_disp:1;	/* 251+ */
483  			u8 reserved2:2;
484  			u8 compression_structure_index:4;	/* 198+ */
485  			u8 reserved3:4;
486  			u8 hdmi_max_frl_rate:4;			/* 237+ */
487  			u8 hdmi_max_frl_rate_valid:1;		/* 237+ */
488  			u8 reserved4:3;				/* 237+ */
489  			u8 reserved5;
490  		} __packed;
491  	} __packed;
492  
493  	u16 addin_offset;
494  	u8 dvo_port; /* See DEVICE_PORT_* and DVO_PORT_* above */
495  	u8 i2c_pin;
496  	u8 target_addr;
497  	u8 ddc_pin;
498  	u16 edid_ptr;
499  	u8 dvo_cfg; /* See DEVICE_CFG_* above */
500  
501  	union {
502  		struct {
503  			u8 dvo2_port;
504  			u8 i2c2_pin;
505  			u8 target2_addr;
506  			u8 ddc2_pin;
507  		} __packed;
508  		struct {
509  			u8 efp_routed:1;			/* 158+ */
510  			u8 lane_reversal:1;			/* 184+ */
511  			u8 lspcon:1;				/* 192+ */
512  			u8 iboost:1;				/* 196+ */
513  			u8 hpd_invert:1;			/* 196+ */
514  			u8 use_vbt_vswing:1;			/* 218+ */
515  			u8 dp_max_lane_count:2;			/* 244+ */
516  			u8 hdmi_support:1;			/* 158+ */
517  			u8 dp_support:1;			/* 158+ */
518  			u8 tmds_support:1;			/* 158+ */
519  			u8 support_reserved:5;
520  			u8 aux_channel;
521  			u8 dongle_detect;
522  		} __packed;
523  	} __packed;
524  
525  	u8 pipe_cap:2;
526  	u8 sdvo_stall:1;					/* 158+ */
527  	u8 hpd_status:2;
528  	u8 integrated_encoder:1;
529  	u8 capabilities_reserved:2;
530  	u8 dvo_wiring; /* See DEVICE_WIRE_* above */
531  
532  	union {
533  		u8 dvo2_wiring;
534  		u8 mipi_bridge_type;				/* 171+ */
535  	} __packed;
536  
537  	u16 extended_type;
538  	u8 dvo_function;
539  	u8 dp_usb_type_c:1;					/* 195+ */
540  	u8 tbt:1;						/* 209+ */
541  	u8 flags2_reserved:2;					/* 195+ */
542  	u8 dp_port_trace_length:4;				/* 209+ */
543  	u8 dp_gpio_index;					/* 195+ */
544  	u16 dp_gpio_pin_num;					/* 195+ */
545  	u8 dp_iboost_level:4;					/* 196+ */
546  	u8 hdmi_iboost_level:4;					/* 196+ */
547  	u8 dp_max_link_rate:3;					/* 216+ */
548  	u8 dp_max_link_rate_reserved:5;				/* 216+ */
549  	u8 efp_index;						/* 256+ */
550  } __packed;
551  
552  struct bdb_general_definitions {
553  	/* DDC GPIO */
554  	u8 crt_ddc_gmbus_pin;
555  
556  	/* DPMS bits */
557  	u8 dpms_non_acpi:1;
558  	u8 skip_boot_crt_detect:1;
559  	u8 dpms_aim:1;
560  	u8 rsvd1:5; /* finish byte */
561  
562  	/* boot device bits */
563  	u8 boot_display[2];
564  	u8 child_dev_size;
565  
566  	/*
567  	 * Device info:
568  	 * If TV is present, it'll be at devices[0].
569  	 * LVDS will be next, either devices[0] or [1], if present.
570  	 * On some platforms the number of device is 6. But could be as few as
571  	 * 4 if both TV and LVDS are missing.
572  	 * And the device num is related with the size of general definition
573  	 * block. It is obtained by using the following formula:
574  	 * number = (block_size - sizeof(bdb_general_definitions))/
575  	 *	     defs->child_dev_size;
576  	 */
577  	u8 devices[];
578  } __packed;
579  
580  /*
581   * Block 3 - Display Toggle Option Block
582   */
583  
584  struct bdb_display_toggle {
585  	u8 feature_bits;
586  	u16 num_entries;					/* ALM only */
587  	u16 list[];						/* ALM only */
588  } __packed;
589  
590  /*
591   * Block 4 - Mode Support List
592   */
593  
594  struct bdb_mode_support_list {
595  	u8 intel_mode_number[0];
596  	u16 mode_list_length;
597  } __packed;
598  
599  /*
600   * Block 5 - Generic Mode Table
601   */
602  
603  struct generic_mode_table {
604  	u16 x_res;
605  	u16 y_res;
606  	u8 color_depths;
607  	u8 refresh_rate[3];
608  	u8 reserved;
609  	u8 text_cols;
610  	u8 text_rows;
611  	u8 font_height;
612  	u16 page_size;
613  	u8 misc;
614  } __packed;
615  
616  struct generic_mode_timings {
617  	u32 dotclock_khz;
618  	u16 hdisplay;
619  	u16 htotal;
620  	u16 hblank_start;
621  	u16 hblank_end;
622  	u16 hsync_start;
623  	u16 hsync_end;
624  	u16 vdisplay;
625  	u16 vtotal;
626  	u16 vblank_start;
627  	u16 vblank_end;
628  	u16 vsync_start;
629  	u16 vsync_end;
630  } __packed;
631  
632  struct generic_mode_timings_alm {
633  	struct generic_mode_timings timings;
634  	u8 wm_8bpp;
635  	u8 burst_8bpp;
636  	u8 wm_16bpp;
637  	u8 burst_16bpp;
638  	u8 wm_32bpp;
639  	u8 burst_32bpp;
640  } __packed;
641  
642  struct bdb_generic_mode_table_alm {
643  	struct generic_mode_table table;
644  	struct generic_mode_timings_alm timings[3];
645  } __packed;
646  
647  struct bdb_generic_mode_table_mgm {
648  	u16 mode_flag;
649  	struct generic_mode_table table;
650  	struct generic_mode_timings timings[3];
651  } __packed;
652  
653  /*
654   * Block 6 - Extended MMIO Register Table, VBIOS only
655   * Block 7 - IO Software Flag Table, VBIOS only
656   * Block 8 - MMIO SWF Register Table, VBIOS only
657   */
658  struct bdb_reg_table {
659  	u16 table_id;
660  	u8 data_access_size;
661  	/*
662  	 * offset,value tuples:
663  	 * data_access_size==0xce -> u8,u8
664  	 * data_access_size==0x02 -> u32,u32
665  	 */
666  	/* u16 table_end_marker; */
667  } __packed;
668  
669  /*
670   * Block 9 - Undocumented table (ALM only)
671   */
672  
673  struct dot_clock_override_entry_gen2 {
674  	u32 dotclock;
675  	u8 n;
676  	u8 m1;
677  	u8 m2;
678  	u8 p1:5;
679  	u8 p1_div_by_2:1;
680  	u8 reserved:1;
681  	u8 p2_div_by_4:1;
682  } __packed;
683  
684  struct bdb_dot_clock_override_alm {
685  	struct dot_clock_override_entry_gen2 t[0];
686  } __packed;
687  
688  /*
689   * Block 9 - SRD Feature Block
690   */
691  
692  struct psr_table {
693  	/* Feature bits */
694  	u8 full_link:1;						/* 165+ */
695  	u8 require_aux_to_wakeup:1;				/* 165+ */
696  	u8 feature_bits_rsvd:6;
697  
698  	/* Wait times */
699  	u8 idle_frames:4;					/* 165+ */
700  	u8 lines_to_wait:3;					/* 165+ */
701  	u8 wait_times_rsvd:1;
702  
703  	/* TP wake up time in multiple of 100 */
704  	u16 tp1_wakeup_time;					/* 165+ */
705  	u16 tp2_tp3_wakeup_time;				/* 165+ */
706  } __packed;
707  
708  struct bdb_psr {
709  	struct psr_table psr_table[16];
710  
711  	/* PSR2 TP2/TP3 wakeup time for 16 panels */
712  	u32 psr2_tp2_tp3_wakeup_time;				/* 226+ */
713  } __packed;
714  
715  /*
716   * Block 10 - Mode Removal Table
717   */
718  
719  struct mode_removal_table {
720  	u16 x_res;
721  	u16 y_res;
722  	u8 bpp;
723  	u16 refresh_rate;
724  	u8 removal_flags;
725  	u16 panel_flags;
726  } __packed;
727  
728  struct bdb_mode_removal {
729  	u8 row_size; /* 8 or 10 bytes */
730  	/*
731  	 * VBT spec says this is always 20 entries,
732  	 * but ALM seems to have only 15 entries.
733  	 */
734  	struct mode_removal_table modes[];
735  	/* u16 terminator; 0x0000 */
736  } __packed;
737  
738  /*
739   * Block 12 - Driver Features Data Block
740   */
741  
742  #define BDB_DRIVER_FEATURE_NO_LVDS		0
743  #define BDB_DRIVER_FEATURE_INT_LVDS		1
744  #define BDB_DRIVER_FEATURE_SDVO_LVDS		2
745  #define BDB_DRIVER_FEATURE_INT_SDVO_LVDS	3
746  
747  struct bdb_driver_features {
748  	/* Driver bits */
749  	u8 boot_dev_algorithm:1;
750  	u8 allow_display_switch_dvd:1;
751  	u8 allow_display_switch_dos:1;
752  	u8 hotplug_dvo:1;
753  	u8 dual_view_zoom:1;
754  	u8 int15h_hook:1;
755  	u8 sprite_in_clone:1;
756  	u8 primary_lfp_id:1;
757  
758  	u16 boot_mode_x;
759  	u16 boot_mode_y;
760  	u8 boot_mode_bpp;
761  	u8 boot_mode_refresh;
762  
763  	/* Extended Driver Bits 1 */
764  	u16 enable_lfp_primary:1;
765  	u16 selective_mode_pruning:1;
766  	u16 dual_frequency:1;
767  	u16 render_clock_freq:1; /* 0: high freq; 1: low freq */
768  	u16 nt_clone_support:1;
769  	u16 power_scheme_ui:1; /* 0: CUI; 1: 3rd party */
770  	u16 sprite_display_assign:1; /* 0: secondary; 1: primary */
771  	u16 cui_aspect_scaling:1;
772  	u16 preserve_aspect_ratio:1;
773  	u16 sdvo_device_power_down:1;
774  	u16 crt_hotplug:1;
775  	u16 lvds_config:2;
776  	u16 tv_hotplug:1;
777  	u16 hdmi_config:2;
778  
779  	/* Driver Flags 1 */
780  	u8 static_display:1;					/* 163+ */
781  	u8 embedded_platform:1;					/* 163+ */
782  	u8 display_subsystem_enable:1;				/* 163+ */
783  	u8 reserved0:5;
784  
785  	u16 legacy_crt_max_x;
786  	u16 legacy_crt_max_y;
787  	u8 legacy_crt_max_refresh;
788  
789  	/* Extended Driver Bits 2 */
790  	u8 hdmi_termination:1;
791  	u8 cea861d_hdmi_support:1;
792  	u8 self_refresh_enable:1;
793  	u8 reserved1:5;
794  
795  	u8 custom_vbt_version;					/* 155+ */
796  
797  	/* Driver Feature Flags */
798  	u16 rmpm_enabled:1;					/* 159+ */
799  	u16 s2ddt_enabled:1;					/* 159+ */
800  	u16 dpst_enabled:1;					/* 159-227 */
801  	u16 bltclt_enabled:1;					/* 159+ */
802  	u16 adb_enabled:1;					/* 159-227 */
803  	u16 drrs_enabled:1;					/* 159-227 */
804  	u16 grs_enabled:1;					/* 159+ */
805  	u16 gpmt_enabled:1;					/* 159+ */
806  	u16 tbt_enabled:1;					/* 159+ */
807  	u16 psr_enabled:1;					/* 165-227 */
808  	u16 ips_enabled:1;					/* 165+ */
809  	u16 dfps_enabled:1;					/* 165+ */
810  	u16 dmrrs_enabled:1;					/* 174-227 */
811  	u16 adt_enabled:1;					/* ???-228 */
812  	u16 hpd_wake:1;						/* 201-240 */
813  	u16 pc_feature_valid:1;					/* 159+ */
814  } __packed;
815  
816  /*
817   * Block 13 - Driver Persistent Algorithm
818   */
819  
820  struct bdb_driver_persistence {
821  	u16 hotkey_persistent_algorithm:1;
822  	u16 lid_switch_persistent_algorithm:1;
823  	u16 power_management_persistent_algorithm:1;
824  	u16 hotkey_persistent_on_mds_twin:1;
825  	u16 hotkey_persistent_on_refresh_rate:1;
826  	u16 hotkey_persistent_on_restore_pipe:1;
827  	u16 hotkey_persistent_on_mode:1;
828  	u16 edid_persistent_on_mode:1;
829  	u16 dvo_hotplug_persistent_on_mode:1;
830  	u16 docking_persistent_algorithm:1;
831  	u16 rsvd:6;
832  	u8 persistent_max_config;
833  } __packed;
834  
835  /*
836   * Block 15 - Dot Clock Override Table
837   */
838  
839  struct dot_clock_override_entry_gen3 {
840  	u32 dotclock;
841  	u8 n;
842  	u8 m1;
843  	u8 m2;
844  	u8 p1;
845  	u8 p2;
846  } __packed;
847  
848  struct bdb_dot_clock_override {
849  	u8 row_size; /* 8 == gen2, 9 == gen3+ */
850  	u8 num_rows;
851  	struct dot_clock_override_entry_gen3 table[]; /* or _gen2 */
852  } __packed;
853  
854  /*
855   * Block 16 - Toggle List Block (pre-HSW)
856   */
857  
858  struct toggle_list_entry_old {
859  	u8 display_select_pipe_a;
860  	u8 display_select_pipe_b;
861  	u8 caps;
862  } __packed;
863  
864  struct toggle_list_table_old {
865  	u16 num_entries;
866  	u8 entry_size;
867  	struct toggle_list_entry_old list[];
868  } __packed;
869  
870  struct bdb_display_select_old {
871  	/* each table has variable size! */
872  	struct toggle_list_table_old tables[4];
873  } __packed;
874  
875  /*
876   * Block 17 - SV Test Functions
877   */
878  
879  struct bdb_sv_test_functions {
880  	u8 sv_bits[8];
881  } __packed;
882  
883  /*
884   * Block 18 - Driver Rotation
885   */
886  
887  struct bdb_driver_rotation {
888  	u8 rotation_enable;
889  	u8 rotation_flags_1;
890  	u16 rotation_flags_2;
891  	u32 rotation_flags_3;
892  	u32 rotation_flags_4;
893  } __packed;
894  
895  /*
896   * Block 19 - Display Configuration Removal Table (pre-IVB)
897   */
898  
899  struct display_remove_entry_old {
900  	u8 display_select_pipe_a;
901  	u8 display_select_pipe_b;
902  } __packed;
903  
904  struct bdb_display_remove_old {
905  	u8 num_entries;
906  	u8 entry_size;
907  	struct display_remove_entry_old table[];
908  } __packed;
909  
910  /*
911   * Block 20 - OEM Customizable Modes
912   */
913  
914  struct oem_mode {
915  	u8 enable_in_vbios:1;
916  	u8 enable_in_os:1;
917  	u8 enable_in_gop:1;					/* 207+ */
918  	u8 reserved:5;
919  	u8 display_flags;					/* ???-216 */
920  	u16 x_res;
921  	u16 y_res;
922  	u8 color_depth;
923  	u8 refresh_rate;
924  	struct bdb_edid_dtd dtd;
925  	u16 display_flags_2;					/* 217+ */
926  } __packed;
927  
928  struct bdb_oem_custom {
929  	u8 num_entries;
930  	u8 entry_size;
931  	struct oem_mode modes[];
932  } __packed;
933  
934  /*
935   * Block 21 - EFP List
936   */
937  
938  struct efp_entry {
939  	u16 mfg_name;
940  	u16 product_code;
941  } __packed;
942  
943  struct bdb_efp_list {
944  	u8 num_entries;
945  	u8 entry_size;
946  	struct efp_entry efp[];
947  } __packed;
948  
949  /*
950   * Block 22 - SDVO LVDS General Options
951   */
952  
953  struct bdb_sdvo_lvds_options {
954  	u8 panel_backlight;
955  	u8 h40_set_panel_type;
956  	u8 panel_type;
957  	u8 ssc_clk_freq;
958  	u16 als_low_trip;
959  	u16 als_high_trip;
960  	u8 sclalarcoeff_tab_row_num;
961  	u8 sclalarcoeff_tab_row_size;
962  	u8 coefficient[8];
963  	u8 panel_misc_bits_1;
964  	u8 panel_misc_bits_2;
965  	u8 panel_misc_bits_3;
966  	u8 panel_misc_bits_4;
967  } __packed;
968  
969  /*
970   * Block 23 - SDVO LVDS DTD
971   */
972  
973  struct bdb_sdvo_lvds_dtd {
974  	struct bdb_edid_dtd dtd[4];
975  } __packed;
976  
977  /*
978   * Block 24 - SDVO LVDS PnP ID
979   */
980  
981  struct bdb_sdvo_lvds_pnp_id {
982  	struct bdb_edid_pnp_id pnp_id[4];
983  } __packed;
984  
985  /*
986   * Block 25 - SDVO LVDS PPS
987   */
988  
989  struct sdvo_lvds_pps {
990  	u16 t0; /* power on */
991  	u16 t1; /* backlight on */
992  	u16 t2; /* backlight off */
993  	u16 t3; /* power off */
994  	u16 t4; /* power cycle */
995  } __packed;
996  
997  struct bdb_sdvo_lvds_pps {
998  	struct sdvo_lvds_pps pps[4];
999  } __packed;
1000  
1001  /*
1002   * Block 26 - TV Options Block
1003   */
1004  
1005  struct bdb_tv_options {
1006  	u16 underscan_overscan_hdtv_component:2;
1007  	u16 rsvd1:10;
1008  	u16 underscan_overscan_hdtv_dvi:2;
1009  	u16 add_modes_to_avoid_overscan_issue:1;
1010  	u16 d_connector_support:1;
1011  } __packed;
1012  
1013  /*
1014   * Block 27 - eDP VBT Block
1015   */
1016  
1017  #define EDP_18BPP	0
1018  #define EDP_24BPP	1
1019  #define EDP_30BPP	2
1020  #define EDP_RATE_1_62	0
1021  #define EDP_RATE_2_7	1
1022  #define EDP_RATE_5_4	2
1023  #define EDP_LANE_1	0
1024  #define EDP_LANE_2	1
1025  #define EDP_LANE_4	3
1026  #define EDP_PREEMPHASIS_NONE	0
1027  #define EDP_PREEMPHASIS_3_5dB	1
1028  #define EDP_PREEMPHASIS_6dB	2
1029  #define EDP_PREEMPHASIS_9_5dB	3
1030  #define EDP_VSWING_0_4V		0
1031  #define EDP_VSWING_0_6V		1
1032  #define EDP_VSWING_0_8V		2
1033  #define EDP_VSWING_1_2V		3
1034  
1035  
1036  struct edp_fast_link_params {
1037  	u8 rate:4;						/* ???-223 */
1038  	u8 lanes:4;
1039  	u8 preemphasis:4;
1040  	u8 vswing:4;
1041  } __packed;
1042  
1043  struct edp_pwm_delays {
1044  	u16 pwm_on_to_backlight_enable;
1045  	u16 backlight_disable_to_pwm_off;
1046  } __packed;
1047  
1048  struct edp_full_link_params {
1049  	u8 preemphasis:4;
1050  	u8 vswing:4;
1051  } __packed;
1052  
1053  struct edp_apical_params {
1054  	u32 panel_oui;
1055  	u32 dpcd_base_address;
1056  	u32 dpcd_idridix_control_0;
1057  	u32 dpcd_option_select;
1058  	u32 dpcd_backlight;
1059  	u32 ambient_light;
1060  	u32 backlight_scale;
1061  } __packed;
1062  
1063  struct bdb_edp {
1064  	struct edp_power_seq power_seqs[16];
1065  	u32 color_depth;
1066  	struct edp_fast_link_params fast_link_params[16];
1067  	u32 sdrrs_msa_timing_delay;
1068  
1069  	/* ith bit indicates enabled/disabled for (i+1)th panel */
1070  	u16 edp_s3d_feature;					/* 162+ */
1071  	u16 edp_t3_optimization;				/* 165+ */
1072  	u64 edp_vswing_preemph;					/* 173+ */
1073  	u16 fast_link_training;					/* 182+ */
1074  	u16 dpcd_600h_write_required;				/* 185+ */
1075  	struct edp_pwm_delays pwm_delays[16];			/* 186+ */
1076  	u16 full_link_params_provided;				/* 199+ */
1077  	struct edp_full_link_params full_link_params[16];	/* 199+ */
1078  	u16 apical_enable;					/* 203+ */
1079  	struct edp_apical_params apical_params[16];		/* 203+ */
1080  	u16 edp_fast_link_training_rate[16];			/* 224+ */
1081  	u16 edp_max_port_link_rate[16];				/* 244+ */
1082  	u16 edp_dsc_disable;					/* 251+ */
1083  	u16 t6_delay_support;					/* 260+ */
1084  	u16 link_idle_time[16];					/* 260+ */
1085  } __packed;
1086  
1087  /*
1088   * Block 28 - EFP DTD Block
1089   */
1090  
1091  struct bdb_efp_dtd {
1092  	struct bdb_edid_dtd dtd[3];
1093  } __packed;
1094  
1095  /*
1096   * Block 29 - Toggle List Block (IVB)
1097   */
1098  
1099  struct toggle_list_entry_ivb {
1100  	u8 display_select;
1101  } __packed;
1102  
1103  struct toggle_list_table_ivb {
1104  	u16 num_entries;
1105  	u8 entry_size;
1106  	struct toggle_list_entry_ivb list[];
1107  } __packed;
1108  
1109  struct bdb_display_select_ivb {
1110  	/* each table has variable size! */
1111  	struct toggle_list_table_ivb tables[4];
1112  } __packed;
1113  
1114  /*
1115   * Block 30 - Display Configuration Removal Table (IVB)
1116   */
1117  
1118  struct display_remove_entry_ivb {
1119  	u8 display_select;
1120  } __packed;
1121  
1122  struct bdb_display_remove_ivb {
1123  	u8 num_entries;
1124  	u8 entry_size;
1125  	struct display_remove_entry_ivb table[];
1126  } __packed;
1127  
1128  /*
1129   * Block 31 - Toggle List Block (HSW+)
1130   */
1131  
1132  struct toggle_list_entry_hsw {
1133  	u16 display_select;
1134  } __packed;
1135  
1136  struct toggle_list_table_hsw {
1137  	u16 num_entries;
1138  	u8 entry_size;
1139  	struct toggle_list_entry_hsw list[];
1140  } __packed;
1141  
1142  struct bdb_display_select_hsw {
1143  	/* each table has variable size! */
1144  	struct toggle_list_table_hsw tables[4];
1145  } __packed;
1146  
1147  /*
1148   * Block 32 - Display Configuration Removal Table (HSW+)
1149   */
1150  
1151  struct display_remove_entry_hsw {
1152  	u16 display_select;
1153  } __packed;
1154  
1155  struct bdb_display_remove_hsw {
1156  	u8 num_entries;
1157  	u8 entry_size;
1158  	struct display_remove_entry_hsw table[];
1159  } __packed;
1160  
1161  /*
1162   * Block 40 - LFP Data Block
1163   */
1164  
1165  struct bdb_lfp_options {
1166  	u8 panel_type;
1167  	u8 panel_type2;						/* 212+ */
1168  	/* LVDS capabilities, stored in a dword */
1169  	u8 pfit_mode:2;
1170  	u8 pfit_text_mode_enhanced:1;
1171  	u8 pfit_gfx_mode_enhanced:1;
1172  	u8 pfit_ratio_auto:1;
1173  	u8 pixel_dither:1;
1174  	u8 lvds_edid:1;						/* ???-240 */
1175  	u8 rsvd2:1;
1176  	u8 rsvd4;
1177  	/* LVDS Panel channel bits stored here */
1178  	u32 lvds_panel_channel_bits;
1179  	/* LVDS SSC (Spread Spectrum Clock) bits stored here. */
1180  	u16 ssc_bits;
1181  	u16 ssc_freq;
1182  	u16 ssc_ddt;
1183  	/* Panel color depth defined here */
1184  	u16 panel_color_depth;
1185  	/* LVDS panel type bits stored here */
1186  	u32 dps_panel_type_bits;
1187  	/* LVDS backlight control type bits stored here */
1188  	u32 blt_control_type_bits;				/* ???-240 */
1189  
1190  	u16 lcdvcc_s0_enable;					/* 200+ */
1191  	u32 rotation;						/* 228+ */
1192  	u32 position;						/* 240+ */
1193  } __packed;
1194  
1195  /*
1196   * Block 41 - LFP Data Table Pointers
1197   */
1198  struct lfp_data_ptr_table {
1199  	u16 offset; /* offsets are from start of bdb */
1200  	u8 table_size;
1201  } __packed;
1202  
1203  /* LFP pointer table contains entries to the struct below */
1204  struct lfp_data_ptr {
1205  	struct lfp_data_ptr_table fp_timing;
1206  	struct lfp_data_ptr_table dvo_timing;
1207  	struct lfp_data_ptr_table panel_pnp_id;
1208  } __packed;
1209  
1210  struct bdb_lfp_data_ptrs {
1211  	u8 num_entries;
1212  	struct lfp_data_ptr ptr[16];
1213  	struct lfp_data_ptr_table panel_name;		/* (156-163?)+ */
1214  } __packed;
1215  
1216  /*
1217   * Block 42 - LFP Data Tables
1218   */
1219  
1220  /* LFP data has 3 blocks per entry */
1221  struct fp_timing {
1222  	u16 x_res;
1223  	u16 y_res;
1224  	u32 lvds_reg;
1225  	u32 lvds_reg_val;
1226  	u32 pp_on_reg;
1227  	u32 pp_on_reg_val;
1228  	u32 pp_off_reg;
1229  	u32 pp_off_reg_val;
1230  	u32 pp_cycle_reg;
1231  	u32 pp_cycle_reg_val;
1232  	u32 pfit_reg;
1233  	u32 pfit_reg_val;
1234  	u16 terminator;
1235  } __packed;
1236  
1237  /*
1238   * For reference only. fp_timing has variable size so
1239   * the data must be accessed using the data table pointers.
1240   * Do not use this directly!
1241   */
1242  struct lfp_data_entry {
1243  	struct fp_timing fp_timing;
1244  	struct bdb_edid_dtd dvo_timing;
1245  	struct bdb_edid_pnp_id pnp_id;
1246  } __packed;
1247  
1248  struct bdb_lfp_data {
1249  	struct lfp_data_entry data[16];
1250  } __packed;
1251  
1252  struct lfp_black_border {
1253  	u8 top;		/* 227+ */
1254  	u8 bottom;	/* 227+ */
1255  	u8 left;	/* 238+ */
1256  	u8 right;	/* 238+ */
1257  } __packed;
1258  
1259  struct bdb_lfp_data_tail {
1260  	struct bdb_edid_product_name panel_name[16];		/* (156-163?)+ */
1261  	u16 scaling_enable;					/* 187+ */
1262  	u8 seamless_drrs_min_refresh_rate[16];			/* 188+ */
1263  	u8 pixel_overlap_count[16];				/* 208+ */
1264  	struct lfp_black_border black_border[16];		/* 227+ */
1265  	u16 dual_lfp_port_sync_enable;				/* 231+ */
1266  	u16 gpu_dithering_for_banding_artifacts;		/* 245+ */
1267  } __packed;
1268  
1269  /*
1270   * Block 43 - LFP Backlight Control Data Block
1271   */
1272  
1273  #define BDB_BACKLIGHT_TYPE_NONE	0
1274  #define BDB_BACKLIGHT_TYPE_PWM	2
1275  
1276  struct lfp_backlight_data_entry {
1277  	u8 type:2;
1278  	u8 active_low_pwm:1;
1279  	u8 i2c_pin:3;						/* obsolete since ? */
1280  	u8 i2c_speed:2;						/* obsolete since ? */
1281  	u16 pwm_freq_hz;
1282  	u8 min_brightness;					/* ???-233 */
1283  	u8 i2c_address;						/* obsolete since ? */
1284  	u8 i2c_command;						/* obsolete since ? */
1285  } __packed;
1286  
1287  struct lfp_backlight_control_method {
1288  	u8 type:4;
1289  	u8 controller:4;
1290  } __packed;
1291  
1292  struct lfp_brightness_level {
1293  	u16 level;
1294  	u16 reserved;
1295  } __packed;
1296  
1297  struct bdb_lfp_backlight {
1298  	u8 entry_size;
1299  	struct lfp_backlight_data_entry data[16];
1300  	u8 level[16];							/* 162-233 */
1301  	struct lfp_backlight_control_method backlight_control[16];	/* 191+ */
1302  	struct lfp_brightness_level brightness_level[16];		/* 234+ */
1303  	struct lfp_brightness_level brightness_min_level[16];		/* 234+ */
1304  	u8 brightness_precision_bits[16];				/* 236+ */
1305  	u16 hdr_dpcd_refresh_timeout[16];				/* 239+ */
1306  } __packed;
1307  
1308  /*
1309   * Block 44 - LFP Power Conservation Features Block
1310   */
1311  struct lfp_power_features {
1312  	u8 dpst_support:1;						/* ???-159 */
1313  	u8 power_conservation_pref:3;
1314  	u8 reserved2:1;
1315  	u8 lace_enabled_status:1;					/* 210+ */
1316  	u8 lace_support:1;						/* 210+ */
1317  	u8 als_enable:1;
1318  } __packed;
1319  
1320  struct als_data_entry {
1321  	u16 backlight_adjust;
1322  	u16 lux;
1323  } __packed;
1324  
1325  struct aggressiveness_profile_entry {
1326  	u8 dpst_aggressiveness : 4;		/* (228/252)-256 */
1327  	u8 lace_aggressiveness : 4;
1328  } __packed;
1329  
1330  struct aggressiveness_profile2_entry {
1331  	u8 opst_aggressiveness : 4;
1332  	u8 elp_aggressiveness : 4;
1333  } __packed;
1334  
1335  struct aggressiveness_profile3_entry {
1336  	u8 apd_aggressiveness:4;
1337  	u8 pixoptix_aggressiveness:4;
1338  } __packed;
1339  
1340  struct aggressiveness_profile4_entry {
1341  	u8 xpst_aggressiveness:4;
1342  	u8 tcon_aggressiveness:4;
1343  } __packed;
1344  
1345  struct panel_identification {
1346  	u8 panel_technology:4;
1347  	u8 reserved:4;
1348  } __packed;
1349  
1350  struct bdb_lfp_power {
1351  	struct lfp_power_features features;				/* ???-227 */
1352  	struct als_data_entry als[5];
1353  	u8 lace_aggressiveness_profile:3;				/* 210-227 */
1354  	u8 reserved1:5;
1355  	u16 dpst;							/* 228-256 */
1356  	u16 psr;							/* 228+ */
1357  	u16 drrs;							/* 228+ */
1358  	u16 lace_support;						/* 228+ */
1359  	u16 adt;							/* 228+ */
1360  	u16 dmrrs;							/* 228+ */
1361  	u16 adb;							/* 228+ */
1362  	u16 lace_enabled_status;					/* 228+ */
1363  	struct aggressiveness_profile_entry aggressiveness[16];
1364  	u16 hobl;							/* 232+ */
1365  	u16 vrr_feature_enabled;					/* 233+ */
1366  	u16 elp;							/* 247-256 */
1367  	u16 opst;							/* 247-256 */
1368  	struct aggressiveness_profile2_entry aggressiveness2[16];	/* 247-256 */
1369  	u16 apd;							/* 253-256 */
1370  	u16 pixoptix;							/* 253-256 */
1371  	struct aggressiveness_profile3_entry aggressiveness3[16];	/* 253-256 */
1372  	struct panel_identification panel_identification[16];		/* 257+ */
1373  	u16 xpst_support;						/* 257+ */
1374  	u16 tcon_based_backlight_optimization;				/* 257+ */
1375  	struct aggressiveness_profile4_entry aggressiveness4[16];	/* 257+ */
1376  	u16 tcon_backlight_xpst_coexistence;				/* 257+ */
1377  } __packed;
1378  
1379  /*
1380   * Block 45 - eDP BFI Block
1381   */
1382  
1383  struct edp_bfi {
1384  	u8 enable_bfi_in_driver:1;
1385  	u8 enable_brightness_control_in_cui:1;
1386  	u8 reserved:6;
1387  	u8 brightness_percentage_when_bfi_disabled;
1388  } __packed;
1389  
1390  struct bdb_edp_bfi {
1391  	u8 bfi_structure_size;
1392  	struct edp_bfi bfi[16];
1393  } __packed;
1394  
1395  /*
1396   * Block 46 - Chromaticity For Narrow Gamut Panel Configuration Block
1397   */
1398  
1399  struct chromaticity {
1400  	u8 chromaticity_enable:1;
1401  	u8 chromaticity_from_edid_base_block:1;
1402  	u8 rsvd:6;
1403  
1404  	u8 green_y_lo:2;
1405  	u8 green_x_lo:2;
1406  	u8 red_y_lo:2;
1407  	u8 red_x_lo:2;
1408  	u8 white_y_lo:2;
1409  	u8 white_x_lo:2;
1410  	u8 blue_y_lo:2;
1411  	u8 blue_x_lo:2;
1412  
1413  	u8 red_x_hi;
1414  	u8 red_y_hi;
1415  	u8 green_x_hi;
1416  	u8 green_y_hi;
1417  	u8 blue_x_hi;
1418  	u8 blue_y_hi;
1419  	u8 white_x_hi;
1420  	u8 white_y_hi;
1421  } __packed;
1422  
1423  struct luminance_and_gamma {
1424  	u8 luminance_enable:1;						/* 211+ */
1425  	u8 gamma_enable:1;						/* 211+ */
1426  	u8 rsvd:6;
1427  
1428  	u16 min_luminance;						/* 211+ */
1429  	u16 max_luminance;						/* 211+ */
1430  	u16 one_percent_max_luminance;					/* 211+ */
1431  	u8 gamma;							/* 211+ */
1432  } __packed;
1433  
1434  struct bdb_chromaticity {
1435  	struct chromaticity chromaticity[16];
1436  	struct luminance_and_gamma luminance_and_gamma[16];		/* 211+ */
1437  } __packed;
1438  
1439  /*
1440   * Block 50 - MIPI Block
1441   */
1442  
1443  struct mipi_data {
1444  	u16 panel_identifier;
1445  	u16 bridge_revision;
1446  
1447  	u32 dithering:1;
1448  	u32 pixel_format_18bpp:1;
1449  	u32 reserved1:1;
1450  	u32 dphy_params_valid:1;
1451  	u32 reserved2:28;
1452  
1453  	u16 port_info;
1454  
1455  	u16 reserved3:2;
1456  	u16 num_lanes:2;
1457  	u16 reserved4:12;
1458  
1459  	u16 virtual_channel_num:2;
1460  	u16 video_transfer_mode:2;
1461  	u16 reserved5:12;
1462  
1463  	u32 dsi_ddr_clock;
1464  	u32 renesas_bridge_ref_clock;
1465  	u16 power_conservation;
1466  
1467  	u32 prepare_count:5;
1468  	u32 reserved6:3;
1469  	u32 clk_zero_count:8;
1470  	u32 trail_count:5;
1471  	u32 reserved7:3;
1472  	u32 exit_zero_count:6;
1473  	u32 reserved8:2;
1474  
1475  	u32 high_low_switch_count;
1476  	u32 lp_byte_clock;
1477  	u32 clock_lane_switch_time_counter;
1478  	u32 panel_color_depth;
1479  } __packed;
1480  
1481  struct bdb_mipi {
1482  	struct mipi_data mipi[16];
1483  } __packed;
1484  
1485  /*
1486   * Block 51 - Fixed Set Mode Table
1487   */
1488  
1489  struct bdb_fixed_set_mode {
1490  	u8 enable;
1491  	u32 x_res;
1492  	u32 y_res;
1493  } __packed;
1494  
1495  /*
1496   * Block 52 - MIPI Configuration Block
1497   */
1498  
1499  #define MAX_MIPI_CONFIGURATIONS	6
1500  
1501  struct bdb_mipi_config {
1502  	struct mipi_config config[MAX_MIPI_CONFIGURATIONS];		/* 175+ */
1503  	struct mipi_pps_data pps[MAX_MIPI_CONFIGURATIONS];		/* 177+ */
1504  	struct edp_pwm_delays pwm_delays[MAX_MIPI_CONFIGURATIONS];	/* 186+ */
1505  	u8 pmic_i2c_bus_number[MAX_MIPI_CONFIGURATIONS];		/* 190+ */
1506  } __packed;
1507  
1508  /*
1509   * Block 53 - MIPI Sequence Block
1510   */
1511  
1512  struct bdb_mipi_sequence {
1513  	u8 version;
1514  	u8 data[]; /* up to 6 variable length blocks */
1515  } __packed;
1516  
1517  /*
1518   * Block 55 - RGB Palette Table
1519   */
1520  
1521  struct bdb_rgb_palette {
1522  	u8 is_enabled;
1523  	u8 red[256];
1524  	u8 blue[256];
1525  	u8 green[256];
1526  } __packed;
1527  
1528  /*
1529   * Block 56 - Compression Parameters
1530   */
1531  
1532  #define VBT_RC_BUFFER_BLOCK_SIZE_1KB	0
1533  #define VBT_RC_BUFFER_BLOCK_SIZE_4KB	1
1534  #define VBT_RC_BUFFER_BLOCK_SIZE_16KB	2
1535  #define VBT_RC_BUFFER_BLOCK_SIZE_64KB	3
1536  
1537  #define VBT_DSC_LINE_BUFFER_DEPTH(vbt_value)	((vbt_value) + 8) /* bits */
1538  #define VBT_DSC_MAX_BPP(vbt_value)		(6 + (vbt_value) * 2)
1539  
1540  struct dsc_compression_parameters_entry {
1541  	u8 version_major:4;
1542  	u8 version_minor:4;
1543  
1544  	u8 rc_buffer_block_size:2;
1545  	u8 reserved1:6;
1546  
1547  	/*
1548  	 * Buffer size in bytes:
1549  	 *
1550  	 * 4 ^ rc_buffer_block_size * 1024 * (rc_buffer_size + 1) bytes
1551  	 */
1552  	u8 rc_buffer_size;
1553  	u32 slices_per_line;
1554  
1555  	u8 line_buffer_depth:4;
1556  	u8 reserved2:4;
1557  
1558  	/* Flag Bits 1 */
1559  	u8 block_prediction_enable:1;
1560  	u8 reserved3:7;
1561  
1562  	u8 max_bpp; /* mapping */
1563  
1564  	/* Color depth capabilities */
1565  	u8 reserved4:1;
1566  	u8 support_8bpc:1;
1567  	u8 support_10bpc:1;
1568  	u8 support_12bpc:1;
1569  	u8 reserved5:4;
1570  
1571  	u16 slice_height;
1572  } __packed;
1573  
1574  struct bdb_compression_parameters {
1575  	u16 entry_size;
1576  	struct dsc_compression_parameters_entry data[16];
1577  } __packed;
1578  
1579  /*
1580   * Block 57 -  Vswing PreEmphasis Table
1581   */
1582  
1583  struct bdb_vswing_preemph {
1584  	u8 num_tables;
1585  	u8 num_columns;
1586  	u32 tables[];
1587  } __packed;
1588  
1589  /*
1590   * Block 58 - Generic DTD Block
1591   */
1592  
1593  struct generic_dtd_entry {
1594  	u32 pixel_clock;
1595  	u16 hactive;
1596  	u16 hblank;
1597  	u16 hfront_porch;
1598  	u16 hsync;
1599  	u16 vactive;
1600  	u16 vblank;
1601  	u16 vfront_porch;
1602  	u16 vsync;
1603  	u16 width_mm;
1604  	u16 height_mm;
1605  
1606  	/* Flags */
1607  	u8 rsvd_flags:6;
1608  	u8 vsync_positive_polarity:1;
1609  	u8 hsync_positive_polarity:1;
1610  
1611  	u8 rsvd[3];
1612  } __packed;
1613  
1614  struct bdb_generic_dtd {
1615  	u16 gdtd_size;
1616  	struct generic_dtd_entry dtd[];	/* up to 24 DTD's */
1617  } __packed;
1618  
1619  /*
1620   * Block 253 - PRD Table
1621   */
1622  
1623  struct prd_entry_old {
1624  	u8 displays_attached;
1625  	u8 display_in_pipe_a;
1626  	u8 display_in_pipe_b;
1627  } __packed;
1628  
1629  struct bdb_prd_table_old {
1630  	struct prd_entry_old list[0];				/* ???-216 */
1631  	u16 num_entries;					/* ???-216 */
1632  } __packed;
1633  
1634  struct prd_entry_new {
1635  	u16 primary_display;
1636  	u16 secondary_display;
1637  } __packed;
1638  
1639  struct bdb_prd_table_new {
1640  	u16 num_entries;					/* 217+ */
1641  	struct prd_entry_new list[];				/* 217+ */
1642  } __packed;
1643  
1644  #endif /* _INTEL_VBT_DEFS_H_ */
1645