18621f407SFrançois Tigeot /* 28621f407SFrançois Tigeot * Copyright © 2006-2016 Intel Corporation 38621f407SFrançois Tigeot * 48621f407SFrançois Tigeot * Permission is hereby granted, free of charge, to any person obtaining a 58621f407SFrançois Tigeot * copy of this software and associated documentation files (the "Software"), 68621f407SFrançois Tigeot * to deal in the Software without restriction, including without limitation 78621f407SFrançois Tigeot * the rights to use, copy, modify, merge, publish, distribute, sublicense, 88621f407SFrançois Tigeot * and/or sell copies of the Software, and to permit persons to whom the 98621f407SFrançois Tigeot * Software is furnished to do so, subject to the following conditions: 108621f407SFrançois Tigeot * 118621f407SFrançois Tigeot * The above copyright notice and this permission notice (including the next 128621f407SFrançois Tigeot * paragraph) shall be included in all copies or substantial portions of the 138621f407SFrançois Tigeot * Software. 148621f407SFrançois Tigeot * 158621f407SFrançois Tigeot * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 168621f407SFrançois Tigeot * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 178621f407SFrançois Tigeot * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 188621f407SFrançois Tigeot * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 198621f407SFrançois Tigeot * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 208621f407SFrançois Tigeot * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 218621f407SFrançois Tigeot * SOFTWARE. 228621f407SFrançois Tigeot * 238621f407SFrançois Tigeot * Authors: 248621f407SFrançois Tigeot * Eric Anholt <eric@anholt.net> 258621f407SFrançois Tigeot * 268621f407SFrançois Tigeot */ 278621f407SFrançois Tigeot 288621f407SFrançois Tigeot /* 298621f407SFrançois Tigeot * This information is private to VBT parsing in intel_bios.c. 308621f407SFrançois Tigeot * 318621f407SFrançois Tigeot * Please do NOT include anywhere else. 328621f407SFrançois Tigeot */ 338621f407SFrançois Tigeot #ifndef _INTEL_BIOS_PRIVATE 348621f407SFrançois Tigeot #error "intel_vbt_defs.h is private to intel_bios.c" 358621f407SFrançois Tigeot #endif 368621f407SFrançois Tigeot 378621f407SFrançois Tigeot #ifndef _INTEL_VBT_DEFS_H_ 388621f407SFrançois Tigeot #define _INTEL_VBT_DEFS_H_ 398621f407SFrançois Tigeot 408621f407SFrançois Tigeot #include "intel_bios.h" 418621f407SFrançois Tigeot 428621f407SFrançois Tigeot /** 438621f407SFrançois Tigeot * struct vbt_header - VBT Header structure 448621f407SFrançois Tigeot * @signature: VBT signature, always starts with "$VBT" 458621f407SFrançois Tigeot * @version: Version of this structure 468621f407SFrançois Tigeot * @header_size: Size of this structure 478621f407SFrançois Tigeot * @vbt_size: Size of VBT (VBT Header, BDB Header and data blocks) 488621f407SFrançois Tigeot * @vbt_checksum: Checksum 498621f407SFrançois Tigeot * @reserved0: Reserved 508621f407SFrançois Tigeot * @bdb_offset: Offset of &struct bdb_header from beginning of VBT 518621f407SFrançois Tigeot * @aim_offset: Offsets of add-in data blocks from beginning of VBT 528621f407SFrançois Tigeot */ 538621f407SFrançois Tigeot struct vbt_header { 548621f407SFrançois Tigeot u8 signature[20]; 558621f407SFrançois Tigeot u16 version; 568621f407SFrançois Tigeot u16 header_size; 578621f407SFrançois Tigeot u16 vbt_size; 588621f407SFrançois Tigeot u8 vbt_checksum; 598621f407SFrançois Tigeot u8 reserved0; 608621f407SFrançois Tigeot u32 bdb_offset; 618621f407SFrançois Tigeot u32 aim_offset[4]; 628621f407SFrançois Tigeot } __packed; 638621f407SFrançois Tigeot 648621f407SFrançois Tigeot /** 658621f407SFrançois Tigeot * struct bdb_header - BDB Header structure 668621f407SFrançois Tigeot * @signature: BDB signature "BIOS_DATA_BLOCK" 678621f407SFrançois Tigeot * @version: Version of the data block definitions 688621f407SFrançois Tigeot * @header_size: Size of this structure 698621f407SFrançois Tigeot * @bdb_size: Size of BDB (BDB Header and data blocks) 708621f407SFrançois Tigeot */ 718621f407SFrançois Tigeot struct bdb_header { 728621f407SFrançois Tigeot u8 signature[16]; 738621f407SFrançois Tigeot u16 version; 748621f407SFrançois Tigeot u16 header_size; 758621f407SFrançois Tigeot u16 bdb_size; 768621f407SFrançois Tigeot } __packed; 778621f407SFrançois Tigeot 788621f407SFrançois Tigeot /* strictly speaking, this is a "skip" block, but it has interesting info */ 798621f407SFrançois Tigeot struct vbios_data { 808621f407SFrançois Tigeot u8 type; /* 0 == desktop, 1 == mobile */ 818621f407SFrançois Tigeot u8 relstage; 828621f407SFrançois Tigeot u8 chipset; 838621f407SFrançois Tigeot u8 lvds_present:1; 848621f407SFrançois Tigeot u8 tv_present:1; 858621f407SFrançois Tigeot u8 rsvd2:6; /* finish byte */ 868621f407SFrançois Tigeot u8 rsvd3[4]; 878621f407SFrançois Tigeot u8 signon[155]; 888621f407SFrançois Tigeot u8 copyright[61]; 898621f407SFrançois Tigeot u16 code_segment; 908621f407SFrançois Tigeot u8 dos_boot_mode; 918621f407SFrançois Tigeot u8 bandwidth_percent; 928621f407SFrançois Tigeot u8 rsvd4; /* popup memory size */ 938621f407SFrançois Tigeot u8 resize_pci_bios; 948621f407SFrançois Tigeot u8 rsvd5; /* is crt already on ddc2 */ 958621f407SFrançois Tigeot } __packed; 968621f407SFrançois Tigeot 978621f407SFrançois Tigeot /* 988621f407SFrançois Tigeot * There are several types of BIOS data blocks (BDBs), each block has 998621f407SFrançois Tigeot * an ID and size in the first 3 bytes (ID in first, size in next 2). 1008621f407SFrançois Tigeot * Known types are listed below. 1018621f407SFrançois Tigeot */ 1028621f407SFrançois Tigeot #define BDB_GENERAL_FEATURES 1 1038621f407SFrançois Tigeot #define BDB_GENERAL_DEFINITIONS 2 1048621f407SFrançois Tigeot #define BDB_OLD_TOGGLE_LIST 3 1058621f407SFrançois Tigeot #define BDB_MODE_SUPPORT_LIST 4 1068621f407SFrançois Tigeot #define BDB_GENERIC_MODE_TABLE 5 1078621f407SFrançois Tigeot #define BDB_EXT_MMIO_REGS 6 1088621f407SFrançois Tigeot #define BDB_SWF_IO 7 1098621f407SFrançois Tigeot #define BDB_SWF_MMIO 8 1108621f407SFrançois Tigeot #define BDB_PSR 9 1118621f407SFrançois Tigeot #define BDB_MODE_REMOVAL_TABLE 10 1128621f407SFrançois Tigeot #define BDB_CHILD_DEVICE_TABLE 11 1138621f407SFrançois Tigeot #define BDB_DRIVER_FEATURES 12 1148621f407SFrançois Tigeot #define BDB_DRIVER_PERSISTENCE 13 1158621f407SFrançois Tigeot #define BDB_EXT_TABLE_PTRS 14 1168621f407SFrançois Tigeot #define BDB_DOT_CLOCK_OVERRIDE 15 1178621f407SFrançois Tigeot #define BDB_DISPLAY_SELECT 16 1188621f407SFrançois Tigeot /* 17 rsvd */ 1198621f407SFrançois Tigeot #define BDB_DRIVER_ROTATION 18 1208621f407SFrançois Tigeot #define BDB_DISPLAY_REMOVE 19 1218621f407SFrançois Tigeot #define BDB_OEM_CUSTOM 20 1228621f407SFrançois Tigeot #define BDB_EFP_LIST 21 /* workarounds for VGA hsync/vsync */ 1238621f407SFrançois Tigeot #define BDB_SDVO_LVDS_OPTIONS 22 1248621f407SFrançois Tigeot #define BDB_SDVO_PANEL_DTDS 23 1258621f407SFrançois Tigeot #define BDB_SDVO_LVDS_PNP_IDS 24 1268621f407SFrançois Tigeot #define BDB_SDVO_LVDS_POWER_SEQ 25 1278621f407SFrançois Tigeot #define BDB_TV_OPTIONS 26 1288621f407SFrançois Tigeot #define BDB_EDP 27 1298621f407SFrançois Tigeot #define BDB_LVDS_OPTIONS 40 1308621f407SFrançois Tigeot #define BDB_LVDS_LFP_DATA_PTRS 41 1318621f407SFrançois Tigeot #define BDB_LVDS_LFP_DATA 42 1328621f407SFrançois Tigeot #define BDB_LVDS_BACKLIGHT 43 1338621f407SFrançois Tigeot #define BDB_LVDS_POWER 44 1348621f407SFrançois Tigeot #define BDB_MIPI_CONFIG 52 1358621f407SFrançois Tigeot #define BDB_MIPI_SEQUENCE 53 1368621f407SFrançois Tigeot #define BDB_SKIP 254 /* VBIOS private block, ignore */ 1378621f407SFrançois Tigeot 1388621f407SFrançois Tigeot struct bdb_general_features { 1398621f407SFrançois Tigeot /* bits 1 */ 1408621f407SFrançois Tigeot u8 panel_fitting:2; 1418621f407SFrançois Tigeot u8 flexaim:1; 1428621f407SFrançois Tigeot u8 msg_enable:1; 1438621f407SFrançois Tigeot u8 clear_screen:3; 1448621f407SFrançois Tigeot u8 color_flip:1; 1458621f407SFrançois Tigeot 1468621f407SFrançois Tigeot /* bits 2 */ 1478621f407SFrançois Tigeot u8 download_ext_vbt:1; 1488621f407SFrançois Tigeot u8 enable_ssc:1; 1498621f407SFrançois Tigeot u8 ssc_freq:1; 1508621f407SFrançois Tigeot u8 enable_lfp_on_override:1; 1518621f407SFrançois Tigeot u8 disable_ssc_ddt:1; 152*3f2dd94aSFrançois Tigeot u8 underscan_vga_timings:1; 1538621f407SFrançois Tigeot u8 display_clock_mode:1; 154*3f2dd94aSFrançois Tigeot u8 vbios_hotplug_support:1; 1558621f407SFrançois Tigeot 1568621f407SFrançois Tigeot /* bits 3 */ 1578621f407SFrançois Tigeot u8 disable_smooth_vision:1; 1588621f407SFrançois Tigeot u8 single_dvi:1; 159*3f2dd94aSFrançois Tigeot u8 rotate_180:1; /* 181 */ 1608621f407SFrançois Tigeot u8 fdi_rx_polarity_inverted:1; 161*3f2dd94aSFrançois Tigeot u8 vbios_extended_mode:1; /* 160 */ 162*3f2dd94aSFrançois Tigeot u8 copy_ilfp_dtd_to_sdvo_lvds_dtd:1; /* 160 */ 163*3f2dd94aSFrançois Tigeot u8 panel_best_fit_timing:1; /* 160 */ 164*3f2dd94aSFrançois Tigeot u8 ignore_strap_state:1; /* 160 */ 1658621f407SFrançois Tigeot 1668621f407SFrançois Tigeot /* bits 4 */ 1678621f407SFrançois Tigeot u8 legacy_monitor_detect; 1688621f407SFrançois Tigeot 1698621f407SFrançois Tigeot /* bits 5 */ 1708621f407SFrançois Tigeot u8 int_crt_support:1; 1718621f407SFrançois Tigeot u8 int_tv_support:1; 1728621f407SFrançois Tigeot u8 int_efp_support:1; 173*3f2dd94aSFrançois Tigeot u8 dp_ssc_enable:1; /* PCH attached eDP supports SSC */ 1748621f407SFrançois Tigeot u8 dp_ssc_freq:1; /* SSC freq for PCH attached eDP */ 175*3f2dd94aSFrançois Tigeot u8 dp_ssc_dongle_supported:1; 176*3f2dd94aSFrançois Tigeot u8 rsvd11:2; /* finish byte */ 1778621f407SFrançois Tigeot } __packed; 1788621f407SFrançois Tigeot 1798621f407SFrançois Tigeot /* pre-915 */ 1808621f407SFrançois Tigeot #define GPIO_PIN_DVI_LVDS 0x03 /* "DVI/LVDS DDC GPIO pins" */ 1818621f407SFrançois Tigeot #define GPIO_PIN_ADD_I2C 0x05 /* "ADDCARD I2C GPIO pins" */ 1828621f407SFrançois Tigeot #define GPIO_PIN_ADD_DDC 0x04 /* "ADDCARD DDC GPIO pins" */ 1838621f407SFrançois Tigeot #define GPIO_PIN_ADD_DDC_I2C 0x06 /* "ADDCARD DDC/I2C GPIO pins" */ 1848621f407SFrançois Tigeot 1858621f407SFrançois Tigeot /* Pre 915 */ 1868621f407SFrançois Tigeot #define DEVICE_TYPE_NONE 0x00 1878621f407SFrançois Tigeot #define DEVICE_TYPE_CRT 0x01 1888621f407SFrançois Tigeot #define DEVICE_TYPE_TV 0x09 1898621f407SFrançois Tigeot #define DEVICE_TYPE_EFP 0x12 1908621f407SFrançois Tigeot #define DEVICE_TYPE_LFP 0x22 1918621f407SFrançois Tigeot /* On 915+ */ 1928621f407SFrançois Tigeot #define DEVICE_TYPE_CRT_DPMS 0x6001 1938621f407SFrançois Tigeot #define DEVICE_TYPE_CRT_DPMS_HOTPLUG 0x4001 1948621f407SFrançois Tigeot #define DEVICE_TYPE_TV_COMPOSITE 0x0209 1958621f407SFrançois Tigeot #define DEVICE_TYPE_TV_MACROVISION 0x0289 1968621f407SFrançois Tigeot #define DEVICE_TYPE_TV_RF_COMPOSITE 0x020c 1978621f407SFrançois Tigeot #define DEVICE_TYPE_TV_SVIDEO_COMPOSITE 0x0609 1988621f407SFrançois Tigeot #define DEVICE_TYPE_TV_SCART 0x0209 1998621f407SFrançois Tigeot #define DEVICE_TYPE_TV_CODEC_HOTPLUG_PWR 0x6009 2008621f407SFrançois Tigeot #define DEVICE_TYPE_EFP_HOTPLUG_PWR 0x6012 2018621f407SFrançois Tigeot #define DEVICE_TYPE_EFP_DVI_HOTPLUG_PWR 0x6052 2028621f407SFrançois Tigeot #define DEVICE_TYPE_EFP_DVI_I 0x6053 2038621f407SFrançois Tigeot #define DEVICE_TYPE_EFP_DVI_D_DUAL 0x6152 2048621f407SFrançois Tigeot #define DEVICE_TYPE_EFP_DVI_D_HDCP 0x60d2 2058621f407SFrançois Tigeot #define DEVICE_TYPE_OPENLDI_HOTPLUG_PWR 0x6062 2068621f407SFrançois Tigeot #define DEVICE_TYPE_OPENLDI_DUALPIX 0x6162 2078621f407SFrançois Tigeot #define DEVICE_TYPE_LFP_PANELLINK 0x5012 2088621f407SFrançois Tigeot #define DEVICE_TYPE_LFP_CMOS_PWR 0x5042 2098621f407SFrançois Tigeot #define DEVICE_TYPE_LFP_LVDS_PWR 0x5062 2108621f407SFrançois Tigeot #define DEVICE_TYPE_LFP_LVDS_DUAL 0x5162 2118621f407SFrançois Tigeot #define DEVICE_TYPE_LFP_LVDS_DUAL_HDCP 0x51e2 2128621f407SFrançois Tigeot 213*3f2dd94aSFrançois Tigeot /* Add the device class for LFP, TV, HDMI */ 214*3f2dd94aSFrançois Tigeot #define DEVICE_TYPE_INT_LFP 0x1022 215*3f2dd94aSFrançois Tigeot #define DEVICE_TYPE_INT_TV 0x1009 216*3f2dd94aSFrançois Tigeot #define DEVICE_TYPE_HDMI 0x60D2 217*3f2dd94aSFrançois Tigeot #define DEVICE_TYPE_DP 0x68C6 218*3f2dd94aSFrançois Tigeot #define DEVICE_TYPE_DP_DUAL_MODE 0x60D6 219*3f2dd94aSFrançois Tigeot #define DEVICE_TYPE_eDP 0x78C6 220*3f2dd94aSFrançois Tigeot 221*3f2dd94aSFrançois Tigeot #define DEVICE_TYPE_CLASS_EXTENSION (1 << 15) 222*3f2dd94aSFrançois Tigeot #define DEVICE_TYPE_POWER_MANAGEMENT (1 << 14) 223*3f2dd94aSFrançois Tigeot #define DEVICE_TYPE_HOTPLUG_SIGNALING (1 << 13) 224*3f2dd94aSFrançois Tigeot #define DEVICE_TYPE_INTERNAL_CONNECTOR (1 << 12) 225*3f2dd94aSFrançois Tigeot #define DEVICE_TYPE_NOT_HDMI_OUTPUT (1 << 11) 226*3f2dd94aSFrançois Tigeot #define DEVICE_TYPE_MIPI_OUTPUT (1 << 10) 227*3f2dd94aSFrançois Tigeot #define DEVICE_TYPE_COMPOSITE_OUTPUT (1 << 9) 228*3f2dd94aSFrançois Tigeot #define DEVICE_TYPE_DUAL_CHANNEL (1 << 8) 229*3f2dd94aSFrançois Tigeot #define DEVICE_TYPE_HIGH_SPEED_LINK (1 << 6) 230*3f2dd94aSFrançois Tigeot #define DEVICE_TYPE_LVDS_SINGALING (1 << 5) 231*3f2dd94aSFrançois Tigeot #define DEVICE_TYPE_TMDS_DVI_SIGNALING (1 << 4) 232*3f2dd94aSFrançois Tigeot #define DEVICE_TYPE_VIDEO_SIGNALING (1 << 3) 233*3f2dd94aSFrançois Tigeot #define DEVICE_TYPE_DISPLAYPORT_OUTPUT (1 << 2) 234*3f2dd94aSFrançois Tigeot #define DEVICE_TYPE_DIGITAL_OUTPUT (1 << 1) 235*3f2dd94aSFrançois Tigeot #define DEVICE_TYPE_ANALOG_OUTPUT (1 << 0) 236*3f2dd94aSFrançois Tigeot 237*3f2dd94aSFrançois Tigeot /* 238*3f2dd94aSFrançois Tigeot * Bits we care about when checking for DEVICE_TYPE_eDP. Depending on the 239*3f2dd94aSFrançois Tigeot * system, the other bits may or may not be set for eDP outputs. 240*3f2dd94aSFrançois Tigeot */ 241*3f2dd94aSFrançois Tigeot #define DEVICE_TYPE_eDP_BITS \ 242*3f2dd94aSFrançois Tigeot (DEVICE_TYPE_INTERNAL_CONNECTOR | \ 243*3f2dd94aSFrançois Tigeot DEVICE_TYPE_MIPI_OUTPUT | \ 244*3f2dd94aSFrançois Tigeot DEVICE_TYPE_COMPOSITE_OUTPUT | \ 245*3f2dd94aSFrançois Tigeot DEVICE_TYPE_DUAL_CHANNEL | \ 246*3f2dd94aSFrançois Tigeot DEVICE_TYPE_LVDS_SINGALING | \ 247*3f2dd94aSFrançois Tigeot DEVICE_TYPE_TMDS_DVI_SIGNALING | \ 248*3f2dd94aSFrançois Tigeot DEVICE_TYPE_VIDEO_SIGNALING | \ 249*3f2dd94aSFrançois Tigeot DEVICE_TYPE_DISPLAYPORT_OUTPUT | \ 250*3f2dd94aSFrançois Tigeot DEVICE_TYPE_ANALOG_OUTPUT) 251*3f2dd94aSFrançois Tigeot 252*3f2dd94aSFrançois Tigeot #define DEVICE_TYPE_DP_DUAL_MODE_BITS \ 253*3f2dd94aSFrançois Tigeot (DEVICE_TYPE_INTERNAL_CONNECTOR | \ 254*3f2dd94aSFrançois Tigeot DEVICE_TYPE_MIPI_OUTPUT | \ 255*3f2dd94aSFrançois Tigeot DEVICE_TYPE_COMPOSITE_OUTPUT | \ 256*3f2dd94aSFrançois Tigeot DEVICE_TYPE_LVDS_SINGALING | \ 257*3f2dd94aSFrançois Tigeot DEVICE_TYPE_TMDS_DVI_SIGNALING | \ 258*3f2dd94aSFrançois Tigeot DEVICE_TYPE_VIDEO_SIGNALING | \ 259*3f2dd94aSFrançois Tigeot DEVICE_TYPE_DISPLAYPORT_OUTPUT | \ 260*3f2dd94aSFrançois Tigeot DEVICE_TYPE_DIGITAL_OUTPUT | \ 261*3f2dd94aSFrançois Tigeot DEVICE_TYPE_ANALOG_OUTPUT) 262*3f2dd94aSFrançois Tigeot 2638621f407SFrançois Tigeot #define DEVICE_CFG_NONE 0x00 2648621f407SFrançois Tigeot #define DEVICE_CFG_12BIT_DVOB 0x01 2658621f407SFrançois Tigeot #define DEVICE_CFG_12BIT_DVOC 0x02 2668621f407SFrançois Tigeot #define DEVICE_CFG_24BIT_DVOBC 0x09 2678621f407SFrançois Tigeot #define DEVICE_CFG_24BIT_DVOCB 0x0a 2688621f407SFrançois Tigeot #define DEVICE_CFG_DUAL_DVOB 0x11 2698621f407SFrançois Tigeot #define DEVICE_CFG_DUAL_DVOC 0x12 2708621f407SFrançois Tigeot #define DEVICE_CFG_DUAL_DVOBC 0x13 2718621f407SFrançois Tigeot #define DEVICE_CFG_DUAL_LINK_DVOBC 0x19 2728621f407SFrançois Tigeot #define DEVICE_CFG_DUAL_LINK_DVOCB 0x1a 2738621f407SFrançois Tigeot 2748621f407SFrançois Tigeot #define DEVICE_WIRE_NONE 0x00 2758621f407SFrançois Tigeot #define DEVICE_WIRE_DVOB 0x01 2768621f407SFrançois Tigeot #define DEVICE_WIRE_DVOC 0x02 2778621f407SFrançois Tigeot #define DEVICE_WIRE_DVOBC 0x03 2788621f407SFrançois Tigeot #define DEVICE_WIRE_DVOBB 0x05 2798621f407SFrançois Tigeot #define DEVICE_WIRE_DVOCC 0x06 2808621f407SFrançois Tigeot #define DEVICE_WIRE_DVOB_MASTER 0x0d 2818621f407SFrançois Tigeot #define DEVICE_WIRE_DVOC_MASTER 0x0e 2828621f407SFrançois Tigeot 283*3f2dd94aSFrançois Tigeot /* dvo_port pre BDB 155 */ 2848621f407SFrançois Tigeot #define DEVICE_PORT_DVOA 0x00 /* none on 845+ */ 2858621f407SFrançois Tigeot #define DEVICE_PORT_DVOB 0x01 2868621f407SFrançois Tigeot #define DEVICE_PORT_DVOC 0x02 2878621f407SFrançois Tigeot 288*3f2dd94aSFrançois Tigeot /* dvo_port BDB 155+ */ 289*3f2dd94aSFrançois Tigeot #define DVO_PORT_HDMIA 0 290*3f2dd94aSFrançois Tigeot #define DVO_PORT_HDMIB 1 291*3f2dd94aSFrançois Tigeot #define DVO_PORT_HDMIC 2 292*3f2dd94aSFrançois Tigeot #define DVO_PORT_HDMID 3 293*3f2dd94aSFrançois Tigeot #define DVO_PORT_LVDS 4 294*3f2dd94aSFrançois Tigeot #define DVO_PORT_TV 5 295*3f2dd94aSFrançois Tigeot #define DVO_PORT_CRT 6 296*3f2dd94aSFrançois Tigeot #define DVO_PORT_DPB 7 297*3f2dd94aSFrançois Tigeot #define DVO_PORT_DPC 8 298*3f2dd94aSFrançois Tigeot #define DVO_PORT_DPD 9 299*3f2dd94aSFrançois Tigeot #define DVO_PORT_DPA 10 300*3f2dd94aSFrançois Tigeot #define DVO_PORT_DPE 11 /* 193 */ 301*3f2dd94aSFrançois Tigeot #define DVO_PORT_HDMIE 12 /* 193 */ 302*3f2dd94aSFrançois Tigeot #define DVO_PORT_MIPIA 21 /* 171 */ 303*3f2dd94aSFrançois Tigeot #define DVO_PORT_MIPIB 22 /* 171 */ 304*3f2dd94aSFrançois Tigeot #define DVO_PORT_MIPIC 23 /* 171 */ 305*3f2dd94aSFrançois Tigeot #define DVO_PORT_MIPID 24 /* 171 */ 306*3f2dd94aSFrançois Tigeot 307*3f2dd94aSFrançois Tigeot #define LEGACY_CHILD_DEVICE_CONFIG_SIZE 33 308*3f2dd94aSFrançois Tigeot 309*3f2dd94aSFrançois Tigeot /* DDC Bus DDI Type 155+ */ 310*3f2dd94aSFrançois Tigeot enum vbt_gmbus_ddi { 311*3f2dd94aSFrançois Tigeot DDC_BUS_DDI_B = 0x1, 312*3f2dd94aSFrançois Tigeot DDC_BUS_DDI_C, 313*3f2dd94aSFrançois Tigeot DDC_BUS_DDI_D, 314*3f2dd94aSFrançois Tigeot DDC_BUS_DDI_F, 315*3f2dd94aSFrançois Tigeot }; 316*3f2dd94aSFrançois Tigeot 3178621f407SFrançois Tigeot /* 318*3f2dd94aSFrançois Tigeot * The child device config, aka the display device data structure, provides a 319*3f2dd94aSFrançois Tigeot * description of a port and its configuration on the platform. 320*3f2dd94aSFrançois Tigeot * 321*3f2dd94aSFrançois Tigeot * The child device config size has been increased, and fields have been added 322*3f2dd94aSFrançois Tigeot * and their meaning has changed over time. Care must be taken when accessing 323*3f2dd94aSFrançois Tigeot * basically any of the fields to ensure the correct interpretation for the BDB 324*3f2dd94aSFrançois Tigeot * version in question. 325*3f2dd94aSFrançois Tigeot * 326*3f2dd94aSFrançois Tigeot * When we copy the child device configs to dev_priv->vbt.child_dev, we reserve 327*3f2dd94aSFrançois Tigeot * space for the full structure below, and initialize the tail not actually 328*3f2dd94aSFrançois Tigeot * present in VBT to zeros. Accessing those fields is fine, as long as the 329*3f2dd94aSFrançois Tigeot * default zero is taken into account, again according to the BDB version. 330*3f2dd94aSFrançois Tigeot * 331*3f2dd94aSFrançois Tigeot * BDB versions 155 and below are considered legacy, and version 155 seems to be 332*3f2dd94aSFrançois Tigeot * a baseline for some of the VBT documentation. When adding new fields, please 333*3f2dd94aSFrançois Tigeot * include the BDB version when the field was added, if it's above that. 3348621f407SFrançois Tigeot */ 335*3f2dd94aSFrançois Tigeot struct child_device_config { 3368621f407SFrançois Tigeot u16 handle; 337*3f2dd94aSFrançois Tigeot u16 device_type; /* See DEVICE_TYPE_* above */ 338*3f2dd94aSFrançois Tigeot 339*3f2dd94aSFrançois Tigeot union { 3408621f407SFrançois Tigeot u8 device_id[10]; /* ascii string */ 341*3f2dd94aSFrançois Tigeot struct { 342*3f2dd94aSFrançois Tigeot u8 i2c_speed; 343*3f2dd94aSFrançois Tigeot u8 dp_onboard_redriver; /* 158 */ 344*3f2dd94aSFrançois Tigeot u8 dp_ondock_redriver; /* 158 */ 345*3f2dd94aSFrançois Tigeot u8 hdmi_level_shifter_value:4; /* 169 */ 346*3f2dd94aSFrançois Tigeot u8 hdmi_max_data_rate:4; /* 204 */ 347*3f2dd94aSFrançois Tigeot u16 dtd_buf_ptr; /* 161 */ 348*3f2dd94aSFrançois Tigeot u8 edidless_efp:1; /* 161 */ 349*3f2dd94aSFrançois Tigeot u8 compression_enable:1; /* 198 */ 350*3f2dd94aSFrançois Tigeot u8 compression_method:1; /* 198 */ 351*3f2dd94aSFrançois Tigeot u8 ganged_edp:1; /* 202 */ 352*3f2dd94aSFrançois Tigeot u8 reserved0:4; 353*3f2dd94aSFrançois Tigeot u8 compression_structure_index:4; /* 198 */ 354*3f2dd94aSFrançois Tigeot u8 reserved1:4; 355*3f2dd94aSFrançois Tigeot u8 slave_port; /* 202 */ 356*3f2dd94aSFrançois Tigeot u8 reserved2; 357*3f2dd94aSFrançois Tigeot } __packed; 358*3f2dd94aSFrançois Tigeot } __packed; 359*3f2dd94aSFrançois Tigeot 3608621f407SFrançois Tigeot u16 addin_offset; 361*3f2dd94aSFrançois Tigeot u8 dvo_port; /* See DEVICE_PORT_* and DVO_PORT_* above */ 3628621f407SFrançois Tigeot u8 i2c_pin; 3638621f407SFrançois Tigeot u8 slave_addr; 3648621f407SFrançois Tigeot u8 ddc_pin; 3658621f407SFrançois Tigeot u16 edid_ptr; 3668621f407SFrançois Tigeot u8 dvo_cfg; /* See DEVICE_CFG_* above */ 367*3f2dd94aSFrançois Tigeot 368*3f2dd94aSFrançois Tigeot union { 369*3f2dd94aSFrançois Tigeot struct { 3708621f407SFrançois Tigeot u8 dvo2_port; 3718621f407SFrançois Tigeot u8 i2c2_pin; 3728621f407SFrançois Tigeot u8 slave2_addr; 3738621f407SFrançois Tigeot u8 ddc2_pin; 3748621f407SFrançois Tigeot } __packed; 375*3f2dd94aSFrançois Tigeot struct { 376*3f2dd94aSFrançois Tigeot u8 efp_routed:1; /* 158 */ 377*3f2dd94aSFrançois Tigeot u8 lane_reversal:1; /* 184 */ 378*3f2dd94aSFrançois Tigeot u8 lspcon:1; /* 192 */ 379*3f2dd94aSFrançois Tigeot u8 iboost:1; /* 196 */ 380*3f2dd94aSFrançois Tigeot u8 hpd_invert:1; /* 196 */ 3818621f407SFrançois Tigeot u8 flag_reserved:3; 382*3f2dd94aSFrançois Tigeot u8 hdmi_support:1; /* 158 */ 383*3f2dd94aSFrançois Tigeot u8 dp_support:1; /* 158 */ 384*3f2dd94aSFrançois Tigeot u8 tmds_support:1; /* 158 */ 3858621f407SFrançois Tigeot u8 support_reserved:5; 3864be47400SFrançois Tigeot u8 aux_channel; 387*3f2dd94aSFrançois Tigeot u8 dongle_detect; 388*3f2dd94aSFrançois Tigeot } __packed; 3898621f407SFrançois Tigeot } __packed; 3908621f407SFrançois Tigeot 391*3f2dd94aSFrançois Tigeot u8 pipe_cap:2; 392*3f2dd94aSFrançois Tigeot u8 sdvo_stall:1; /* 158 */ 393*3f2dd94aSFrançois Tigeot u8 hpd_status:2; 394*3f2dd94aSFrançois Tigeot u8 integrated_encoder:1; 395*3f2dd94aSFrançois Tigeot u8 capabilities_reserved:2; 396*3f2dd94aSFrançois Tigeot u8 dvo_wiring; /* See DEVICE_WIRE_* above */ 3978621f407SFrançois Tigeot 398*3f2dd94aSFrançois Tigeot union { 399*3f2dd94aSFrançois Tigeot u8 dvo2_wiring; 400*3f2dd94aSFrançois Tigeot u8 mipi_bridge_type; /* 171 */ 401*3f2dd94aSFrançois Tigeot } __packed; 402*3f2dd94aSFrançois Tigeot 403*3f2dd94aSFrançois Tigeot u16 extended_type; 404*3f2dd94aSFrançois Tigeot u8 dvo_function; 405*3f2dd94aSFrançois Tigeot u8 dp_usb_type_c:1; /* 195 */ 406*3f2dd94aSFrançois Tigeot u8 flags2_reserved:7; /* 195 */ 407*3f2dd94aSFrançois Tigeot u8 dp_gpio_index; /* 195 */ 408*3f2dd94aSFrançois Tigeot u16 dp_gpio_pin_num; /* 195 */ 409*3f2dd94aSFrançois Tigeot u8 dp_iboost_level:4; /* 196 */ 410*3f2dd94aSFrançois Tigeot u8 hdmi_iboost_level:4; /* 196 */ 4118621f407SFrançois Tigeot } __packed; 4128621f407SFrançois Tigeot 4138621f407SFrançois Tigeot struct bdb_general_definitions { 4148621f407SFrançois Tigeot /* DDC GPIO */ 4158621f407SFrançois Tigeot u8 crt_ddc_gmbus_pin; 4168621f407SFrançois Tigeot 4178621f407SFrançois Tigeot /* DPMS bits */ 4188621f407SFrançois Tigeot u8 dpms_acpi:1; 4198621f407SFrançois Tigeot u8 skip_boot_crt_detect:1; 4208621f407SFrançois Tigeot u8 dpms_aim:1; 4218621f407SFrançois Tigeot u8 rsvd1:5; /* finish byte */ 4228621f407SFrançois Tigeot 4238621f407SFrançois Tigeot /* boot device bits */ 4248621f407SFrançois Tigeot u8 boot_display[2]; 4258621f407SFrançois Tigeot u8 child_dev_size; 4268621f407SFrançois Tigeot 4278621f407SFrançois Tigeot /* 4288621f407SFrançois Tigeot * Device info: 4298621f407SFrançois Tigeot * If TV is present, it'll be at devices[0]. 4308621f407SFrançois Tigeot * LVDS will be next, either devices[0] or [1], if present. 4318621f407SFrançois Tigeot * On some platforms the number of device is 6. But could be as few as 4328621f407SFrançois Tigeot * 4 if both TV and LVDS are missing. 4338621f407SFrançois Tigeot * And the device num is related with the size of general definition 4348621f407SFrançois Tigeot * block. It is obtained by using the following formula: 4358621f407SFrançois Tigeot * number = (block_size - sizeof(bdb_general_definitions))/ 4368621f407SFrançois Tigeot * defs->child_dev_size; 4378621f407SFrançois Tigeot */ 4388621f407SFrançois Tigeot uint8_t devices[0]; 4398621f407SFrançois Tigeot } __packed; 4408621f407SFrançois Tigeot 4418621f407SFrançois Tigeot /* Mask for DRRS / Panel Channel / SSC / BLT control bits extraction */ 4428621f407SFrançois Tigeot #define MODE_MASK 0x3 4438621f407SFrançois Tigeot 4448621f407SFrançois Tigeot struct bdb_lvds_options { 4458621f407SFrançois Tigeot u8 panel_type; 4468621f407SFrançois Tigeot u8 rsvd1; 4478621f407SFrançois Tigeot /* LVDS capabilities, stored in a dword */ 4488621f407SFrançois Tigeot u8 pfit_mode:2; 4498621f407SFrançois Tigeot u8 pfit_text_mode_enhanced:1; 4508621f407SFrançois Tigeot u8 pfit_gfx_mode_enhanced:1; 4518621f407SFrançois Tigeot u8 pfit_ratio_auto:1; 4528621f407SFrançois Tigeot u8 pixel_dither:1; 4538621f407SFrançois Tigeot u8 lvds_edid:1; 4548621f407SFrançois Tigeot u8 rsvd2:1; 4558621f407SFrançois Tigeot u8 rsvd4; 4568621f407SFrançois Tigeot /* LVDS Panel channel bits stored here */ 4578621f407SFrançois Tigeot u32 lvds_panel_channel_bits; 4588621f407SFrançois Tigeot /* LVDS SSC (Spread Spectrum Clock) bits stored here. */ 4598621f407SFrançois Tigeot u16 ssc_bits; 4608621f407SFrançois Tigeot u16 ssc_freq; 4618621f407SFrançois Tigeot u16 ssc_ddt; 4628621f407SFrançois Tigeot /* Panel color depth defined here */ 4638621f407SFrançois Tigeot u16 panel_color_depth; 4648621f407SFrançois Tigeot /* LVDS panel type bits stored here */ 4658621f407SFrançois Tigeot u32 dps_panel_type_bits; 4668621f407SFrançois Tigeot /* LVDS backlight control type bits stored here */ 4678621f407SFrançois Tigeot u32 blt_control_type_bits; 4688621f407SFrançois Tigeot } __packed; 4698621f407SFrançois Tigeot 4708621f407SFrançois Tigeot /* LFP pointer table contains entries to the struct below */ 4718621f407SFrançois Tigeot struct bdb_lvds_lfp_data_ptr { 4728621f407SFrançois Tigeot u16 fp_timing_offset; /* offsets are from start of bdb */ 4738621f407SFrançois Tigeot u8 fp_table_size; 4748621f407SFrançois Tigeot u16 dvo_timing_offset; 4758621f407SFrançois Tigeot u8 dvo_table_size; 4768621f407SFrançois Tigeot u16 panel_pnp_id_offset; 4778621f407SFrançois Tigeot u8 pnp_table_size; 4788621f407SFrançois Tigeot } __packed; 4798621f407SFrançois Tigeot 4808621f407SFrançois Tigeot struct bdb_lvds_lfp_data_ptrs { 4818621f407SFrançois Tigeot u8 lvds_entries; /* followed by one or more lvds_data_ptr structs */ 4828621f407SFrançois Tigeot struct bdb_lvds_lfp_data_ptr ptr[16]; 4838621f407SFrançois Tigeot } __packed; 4848621f407SFrançois Tigeot 4858621f407SFrançois Tigeot /* LFP data has 3 blocks per entry */ 4868621f407SFrançois Tigeot struct lvds_fp_timing { 4878621f407SFrançois Tigeot u16 x_res; 4888621f407SFrançois Tigeot u16 y_res; 4898621f407SFrançois Tigeot u32 lvds_reg; 4908621f407SFrançois Tigeot u32 lvds_reg_val; 4918621f407SFrançois Tigeot u32 pp_on_reg; 4928621f407SFrançois Tigeot u32 pp_on_reg_val; 4938621f407SFrançois Tigeot u32 pp_off_reg; 4948621f407SFrançois Tigeot u32 pp_off_reg_val; 4958621f407SFrançois Tigeot u32 pp_cycle_reg; 4968621f407SFrançois Tigeot u32 pp_cycle_reg_val; 4978621f407SFrançois Tigeot u32 pfit_reg; 4988621f407SFrançois Tigeot u32 pfit_reg_val; 4998621f407SFrançois Tigeot u16 terminator; 5008621f407SFrançois Tigeot } __packed; 5018621f407SFrançois Tigeot 5028621f407SFrançois Tigeot struct lvds_dvo_timing { 5038621f407SFrançois Tigeot u16 clock; /**< In 10khz */ 5048621f407SFrançois Tigeot u8 hactive_lo; 5058621f407SFrançois Tigeot u8 hblank_lo; 5068621f407SFrançois Tigeot u8 hblank_hi:4; 5078621f407SFrançois Tigeot u8 hactive_hi:4; 5088621f407SFrançois Tigeot u8 vactive_lo; 5098621f407SFrançois Tigeot u8 vblank_lo; 5108621f407SFrançois Tigeot u8 vblank_hi:4; 5118621f407SFrançois Tigeot u8 vactive_hi:4; 5128621f407SFrançois Tigeot u8 hsync_off_lo; 513a85cb24fSFrançois Tigeot u8 hsync_pulse_width_lo; 514a85cb24fSFrançois Tigeot u8 vsync_pulse_width_lo:4; 515a85cb24fSFrançois Tigeot u8 vsync_off_lo:4; 516a85cb24fSFrançois Tigeot u8 vsync_pulse_width_hi:2; 517a85cb24fSFrançois Tigeot u8 vsync_off_hi:2; 518a85cb24fSFrançois Tigeot u8 hsync_pulse_width_hi:2; 5198621f407SFrançois Tigeot u8 hsync_off_hi:2; 5208621f407SFrançois Tigeot u8 himage_lo; 5218621f407SFrançois Tigeot u8 vimage_lo; 5228621f407SFrançois Tigeot u8 vimage_hi:4; 5238621f407SFrançois Tigeot u8 himage_hi:4; 5248621f407SFrançois Tigeot u8 h_border; 5258621f407SFrançois Tigeot u8 v_border; 5268621f407SFrançois Tigeot u8 rsvd1:3; 5278621f407SFrançois Tigeot u8 digital:2; 5288621f407SFrançois Tigeot u8 vsync_positive:1; 5298621f407SFrançois Tigeot u8 hsync_positive:1; 530a85cb24fSFrançois Tigeot u8 non_interlaced:1; 5318621f407SFrançois Tigeot } __packed; 5328621f407SFrançois Tigeot 5338621f407SFrançois Tigeot struct lvds_pnp_id { 5348621f407SFrançois Tigeot u16 mfg_name; 5358621f407SFrançois Tigeot u16 product_code; 5368621f407SFrançois Tigeot u32 serial; 5378621f407SFrançois Tigeot u8 mfg_week; 5388621f407SFrançois Tigeot u8 mfg_year; 5398621f407SFrançois Tigeot } __packed; 5408621f407SFrançois Tigeot 5418621f407SFrançois Tigeot struct bdb_lvds_lfp_data_entry { 5428621f407SFrançois Tigeot struct lvds_fp_timing fp_timing; 5438621f407SFrançois Tigeot struct lvds_dvo_timing dvo_timing; 5448621f407SFrançois Tigeot struct lvds_pnp_id pnp_id; 5458621f407SFrançois Tigeot } __packed; 5468621f407SFrançois Tigeot 5478621f407SFrançois Tigeot struct bdb_lvds_lfp_data { 5488621f407SFrançois Tigeot struct bdb_lvds_lfp_data_entry data[16]; 5498621f407SFrançois Tigeot } __packed; 5508621f407SFrançois Tigeot 5518621f407SFrançois Tigeot #define BDB_BACKLIGHT_TYPE_NONE 0 5528621f407SFrançois Tigeot #define BDB_BACKLIGHT_TYPE_PWM 2 5538621f407SFrançois Tigeot 5548621f407SFrançois Tigeot struct bdb_lfp_backlight_data_entry { 5558621f407SFrançois Tigeot u8 type:2; 5568621f407SFrançois Tigeot u8 active_low_pwm:1; 5578621f407SFrançois Tigeot u8 obsolete1:5; 5588621f407SFrançois Tigeot u16 pwm_freq_hz; 5598621f407SFrançois Tigeot u8 min_brightness; 5608621f407SFrançois Tigeot u8 obsolete2; 5618621f407SFrançois Tigeot u8 obsolete3; 5628621f407SFrançois Tigeot } __packed; 5638621f407SFrançois Tigeot 5641487f786SFrançois Tigeot struct bdb_lfp_backlight_control_method { 5651487f786SFrançois Tigeot u8 type:4; 5661487f786SFrançois Tigeot u8 controller:4; 5671487f786SFrançois Tigeot } __packed; 5681487f786SFrançois Tigeot 5698621f407SFrançois Tigeot struct bdb_lfp_backlight_data { 5708621f407SFrançois Tigeot u8 entry_size; 5718621f407SFrançois Tigeot struct bdb_lfp_backlight_data_entry data[16]; 5728621f407SFrançois Tigeot u8 level[16]; 5731487f786SFrançois Tigeot struct bdb_lfp_backlight_control_method backlight_control[16]; 5748621f407SFrançois Tigeot } __packed; 5758621f407SFrançois Tigeot 5768621f407SFrançois Tigeot struct aimdb_header { 5778621f407SFrançois Tigeot char signature[16]; 5788621f407SFrançois Tigeot char oem_device[20]; 5798621f407SFrançois Tigeot u16 aimdb_version; 5808621f407SFrançois Tigeot u16 aimdb_header_size; 5818621f407SFrançois Tigeot u16 aimdb_size; 5828621f407SFrançois Tigeot } __packed; 5838621f407SFrançois Tigeot 5848621f407SFrançois Tigeot struct aimdb_block { 5858621f407SFrançois Tigeot u8 aimdb_id; 5868621f407SFrançois Tigeot u16 aimdb_size; 5878621f407SFrançois Tigeot } __packed; 5888621f407SFrançois Tigeot 5898621f407SFrançois Tigeot struct vch_panel_data { 5908621f407SFrançois Tigeot u16 fp_timing_offset; 5918621f407SFrançois Tigeot u8 fp_timing_size; 5928621f407SFrançois Tigeot u16 dvo_timing_offset; 5938621f407SFrançois Tigeot u8 dvo_timing_size; 5948621f407SFrançois Tigeot u16 text_fitting_offset; 5958621f407SFrançois Tigeot u8 text_fitting_size; 5968621f407SFrançois Tigeot u16 graphics_fitting_offset; 5978621f407SFrançois Tigeot u8 graphics_fitting_size; 5988621f407SFrançois Tigeot } __packed; 5998621f407SFrançois Tigeot 6008621f407SFrançois Tigeot struct vch_bdb_22 { 6018621f407SFrançois Tigeot struct aimdb_block aimdb_block; 6028621f407SFrançois Tigeot struct vch_panel_data panels[16]; 6038621f407SFrançois Tigeot } __packed; 6048621f407SFrançois Tigeot 6058621f407SFrançois Tigeot struct bdb_sdvo_lvds_options { 6068621f407SFrançois Tigeot u8 panel_backlight; 6078621f407SFrançois Tigeot u8 h40_set_panel_type; 6088621f407SFrançois Tigeot u8 panel_type; 6098621f407SFrançois Tigeot u8 ssc_clk_freq; 6108621f407SFrançois Tigeot u16 als_low_trip; 6118621f407SFrançois Tigeot u16 als_high_trip; 6128621f407SFrançois Tigeot u8 sclalarcoeff_tab_row_num; 6138621f407SFrançois Tigeot u8 sclalarcoeff_tab_row_size; 6148621f407SFrançois Tigeot u8 coefficient[8]; 6158621f407SFrançois Tigeot u8 panel_misc_bits_1; 6168621f407SFrançois Tigeot u8 panel_misc_bits_2; 6178621f407SFrançois Tigeot u8 panel_misc_bits_3; 6188621f407SFrançois Tigeot u8 panel_misc_bits_4; 6198621f407SFrançois Tigeot } __packed; 6208621f407SFrançois Tigeot 6218621f407SFrançois Tigeot 6228621f407SFrançois Tigeot #define BDB_DRIVER_FEATURE_NO_LVDS 0 6238621f407SFrançois Tigeot #define BDB_DRIVER_FEATURE_INT_LVDS 1 6248621f407SFrançois Tigeot #define BDB_DRIVER_FEATURE_SDVO_LVDS 2 6258621f407SFrançois Tigeot #define BDB_DRIVER_FEATURE_EDP 3 6268621f407SFrançois Tigeot 6278621f407SFrançois Tigeot struct bdb_driver_features { 6288621f407SFrançois Tigeot u8 boot_dev_algorithm:1; 6298621f407SFrançois Tigeot u8 block_display_switch:1; 6308621f407SFrançois Tigeot u8 allow_display_switch:1; 6318621f407SFrançois Tigeot u8 hotplug_dvo:1; 6328621f407SFrançois Tigeot u8 dual_view_zoom:1; 6338621f407SFrançois Tigeot u8 int15h_hook:1; 6348621f407SFrançois Tigeot u8 sprite_in_clone:1; 6358621f407SFrançois Tigeot u8 primary_lfp_id:1; 6368621f407SFrançois Tigeot 6378621f407SFrançois Tigeot u16 boot_mode_x; 6388621f407SFrançois Tigeot u16 boot_mode_y; 6398621f407SFrançois Tigeot u8 boot_mode_bpp; 6408621f407SFrançois Tigeot u8 boot_mode_refresh; 6418621f407SFrançois Tigeot 6428621f407SFrançois Tigeot u16 enable_lfp_primary:1; 6438621f407SFrançois Tigeot u16 selective_mode_pruning:1; 6448621f407SFrançois Tigeot u16 dual_frequency:1; 6458621f407SFrançois Tigeot u16 render_clock_freq:1; /* 0: high freq; 1: low freq */ 6468621f407SFrançois Tigeot u16 nt_clone_support:1; 6478621f407SFrançois Tigeot u16 power_scheme_ui:1; /* 0: CUI; 1: 3rd party */ 6488621f407SFrançois Tigeot u16 sprite_display_assign:1; /* 0: secondary; 1: primary */ 6498621f407SFrançois Tigeot u16 cui_aspect_scaling:1; 6508621f407SFrançois Tigeot u16 preserve_aspect_ratio:1; 6518621f407SFrançois Tigeot u16 sdvo_device_power_down:1; 6528621f407SFrançois Tigeot u16 crt_hotplug:1; 6538621f407SFrançois Tigeot u16 lvds_config:2; 6548621f407SFrançois Tigeot u16 tv_hotplug:1; 6558621f407SFrançois Tigeot u16 hdmi_config:2; 6568621f407SFrançois Tigeot 6578621f407SFrançois Tigeot u8 static_display:1; 6588621f407SFrançois Tigeot u8 reserved2:7; 6598621f407SFrançois Tigeot u16 legacy_crt_max_x; 6608621f407SFrançois Tigeot u16 legacy_crt_max_y; 6618621f407SFrançois Tigeot u8 legacy_crt_max_refresh; 6628621f407SFrançois Tigeot 6638621f407SFrançois Tigeot u8 hdmi_termination; 6648621f407SFrançois Tigeot u8 custom_vbt_version; 6658621f407SFrançois Tigeot /* Driver features data block */ 6668621f407SFrançois Tigeot u16 rmpm_enabled:1; 6678621f407SFrançois Tigeot u16 s2ddt_enabled:1; 6688621f407SFrançois Tigeot u16 dpst_enabled:1; 6698621f407SFrançois Tigeot u16 bltclt_enabled:1; 6708621f407SFrançois Tigeot u16 adb_enabled:1; 6718621f407SFrançois Tigeot u16 drrs_enabled:1; 6728621f407SFrançois Tigeot u16 grs_enabled:1; 6738621f407SFrançois Tigeot u16 gpmt_enabled:1; 6748621f407SFrançois Tigeot u16 tbt_enabled:1; 6758621f407SFrançois Tigeot u16 psr_enabled:1; 6768621f407SFrançois Tigeot u16 ips_enabled:1; 6778621f407SFrançois Tigeot u16 reserved3:4; 6788621f407SFrançois Tigeot u16 pc_feature_valid:1; 6798621f407SFrançois Tigeot } __packed; 6808621f407SFrançois Tigeot 6818621f407SFrançois Tigeot #define EDP_18BPP 0 6828621f407SFrançois Tigeot #define EDP_24BPP 1 6838621f407SFrançois Tigeot #define EDP_30BPP 2 6848621f407SFrançois Tigeot #define EDP_RATE_1_62 0 6858621f407SFrançois Tigeot #define EDP_RATE_2_7 1 6868621f407SFrançois Tigeot #define EDP_LANE_1 0 6878621f407SFrançois Tigeot #define EDP_LANE_2 1 6888621f407SFrançois Tigeot #define EDP_LANE_4 3 6898621f407SFrançois Tigeot #define EDP_PREEMPHASIS_NONE 0 6908621f407SFrançois Tigeot #define EDP_PREEMPHASIS_3_5dB 1 6918621f407SFrançois Tigeot #define EDP_PREEMPHASIS_6dB 2 6928621f407SFrançois Tigeot #define EDP_PREEMPHASIS_9_5dB 3 6938621f407SFrançois Tigeot #define EDP_VSWING_0_4V 0 6948621f407SFrançois Tigeot #define EDP_VSWING_0_6V 1 6958621f407SFrançois Tigeot #define EDP_VSWING_0_8V 2 6968621f407SFrançois Tigeot #define EDP_VSWING_1_2V 3 6978621f407SFrançois Tigeot 6988621f407SFrançois Tigeot 699*3f2dd94aSFrançois Tigeot struct edp_fast_link_params { 7008621f407SFrançois Tigeot u8 rate:4; 7018621f407SFrançois Tigeot u8 lanes:4; 7028621f407SFrançois Tigeot u8 preemphasis:4; 7038621f407SFrançois Tigeot u8 vswing:4; 7048621f407SFrançois Tigeot } __packed; 7058621f407SFrançois Tigeot 706*3f2dd94aSFrançois Tigeot struct edp_pwm_delays { 707*3f2dd94aSFrançois Tigeot u16 pwm_on_to_backlight_enable; 708*3f2dd94aSFrançois Tigeot u16 backlight_disable_to_pwm_off; 709*3f2dd94aSFrançois Tigeot } __packed; 710*3f2dd94aSFrançois Tigeot 711*3f2dd94aSFrançois Tigeot struct edp_full_link_params { 712*3f2dd94aSFrançois Tigeot u8 preemphasis:4; 713*3f2dd94aSFrançois Tigeot u8 vswing:4; 714*3f2dd94aSFrançois Tigeot } __packed; 715*3f2dd94aSFrançois Tigeot 7168621f407SFrançois Tigeot struct bdb_edp { 7178621f407SFrançois Tigeot struct edp_power_seq power_seqs[16]; 7188621f407SFrançois Tigeot u32 color_depth; 719*3f2dd94aSFrançois Tigeot struct edp_fast_link_params fast_link_params[16]; 7208621f407SFrançois Tigeot u32 sdrrs_msa_timing_delay; 7218621f407SFrançois Tigeot 7228621f407SFrançois Tigeot /* ith bit indicates enabled/disabled for (i+1)th panel */ 723*3f2dd94aSFrançois Tigeot u16 edp_s3d_feature; /* 162 */ 724*3f2dd94aSFrançois Tigeot u16 edp_t3_optimization; /* 165 */ 725*3f2dd94aSFrançois Tigeot u64 edp_vswing_preemph; /* 173 */ 726*3f2dd94aSFrançois Tigeot u16 fast_link_training; /* 182 */ 727*3f2dd94aSFrançois Tigeot u16 dpcd_600h_write_required; /* 185 */ 728*3f2dd94aSFrançois Tigeot struct edp_pwm_delays pwm_delays[16]; /* 186 */ 729*3f2dd94aSFrançois Tigeot u16 full_link_params_provided; /* 199 */ 730*3f2dd94aSFrançois Tigeot struct edp_full_link_params full_link_params[16]; /* 199 */ 7318621f407SFrançois Tigeot } __packed; 7328621f407SFrançois Tigeot 7338621f407SFrançois Tigeot struct psr_table { 7348621f407SFrançois Tigeot /* Feature bits */ 7358621f407SFrançois Tigeot u8 full_link:1; 7368621f407SFrançois Tigeot u8 require_aux_to_wakeup:1; 7378621f407SFrançois Tigeot u8 feature_bits_rsvd:6; 7388621f407SFrançois Tigeot 7398621f407SFrançois Tigeot /* Wait times */ 7408621f407SFrançois Tigeot u8 idle_frames:4; 7418621f407SFrançois Tigeot u8 lines_to_wait:3; 7428621f407SFrançois Tigeot u8 wait_times_rsvd:1; 7438621f407SFrançois Tigeot 7448621f407SFrançois Tigeot /* TP wake up time in multiple of 100 */ 7458621f407SFrançois Tigeot u16 tp1_wakeup_time; 7468621f407SFrançois Tigeot u16 tp2_tp3_wakeup_time; 7478621f407SFrançois Tigeot } __packed; 7488621f407SFrançois Tigeot 7498621f407SFrançois Tigeot struct bdb_psr { 7508621f407SFrançois Tigeot struct psr_table psr_table[16]; 7518621f407SFrançois Tigeot } __packed; 7528621f407SFrançois Tigeot 7538621f407SFrançois Tigeot /* 7548621f407SFrançois Tigeot * Driver<->VBIOS interaction occurs through scratch bits in 7558621f407SFrançois Tigeot * GR18 & SWF*. 7568621f407SFrançois Tigeot */ 7578621f407SFrançois Tigeot 7588621f407SFrançois Tigeot /* GR18 bits are set on display switch and hotkey events */ 7598621f407SFrançois Tigeot #define GR18_DRIVER_SWITCH_EN (1<<7) /* 0: VBIOS control, 1: driver control */ 7608621f407SFrançois Tigeot #define GR18_HOTKEY_MASK 0x78 /* See also SWF4 15:0 */ 7618621f407SFrançois Tigeot #define GR18_HK_NONE (0x0<<3) 7628621f407SFrançois Tigeot #define GR18_HK_LFP_STRETCH (0x1<<3) 7638621f407SFrançois Tigeot #define GR18_HK_TOGGLE_DISP (0x2<<3) 7648621f407SFrançois Tigeot #define GR18_HK_DISP_SWITCH (0x4<<3) /* see SWF14 15:0 for what to enable */ 7658621f407SFrançois Tigeot #define GR18_HK_POPUP_DISABLED (0x6<<3) 7668621f407SFrançois Tigeot #define GR18_HK_POPUP_ENABLED (0x7<<3) 7678621f407SFrançois Tigeot #define GR18_HK_PFIT (0x8<<3) 7688621f407SFrançois Tigeot #define GR18_HK_APM_CHANGE (0xa<<3) 7698621f407SFrançois Tigeot #define GR18_HK_MULTIPLE (0xc<<3) 7708621f407SFrançois Tigeot #define GR18_USER_INT_EN (1<<2) 7718621f407SFrançois Tigeot #define GR18_A0000_FLUSH_EN (1<<1) 7728621f407SFrançois Tigeot #define GR18_SMM_EN (1<<0) 7738621f407SFrançois Tigeot 7748621f407SFrançois Tigeot /* Set by driver, cleared by VBIOS */ 7758621f407SFrançois Tigeot #define SWF00_YRES_SHIFT 16 7768621f407SFrançois Tigeot #define SWF00_XRES_SHIFT 0 7778621f407SFrançois Tigeot #define SWF00_RES_MASK 0xffff 7788621f407SFrançois Tigeot 7798621f407SFrançois Tigeot /* Set by VBIOS at boot time and driver at runtime */ 7808621f407SFrançois Tigeot #define SWF01_TV2_FORMAT_SHIFT 8 7818621f407SFrançois Tigeot #define SWF01_TV1_FORMAT_SHIFT 0 7828621f407SFrançois Tigeot #define SWF01_TV_FORMAT_MASK 0xffff 7838621f407SFrançois Tigeot 7848621f407SFrançois Tigeot #define SWF10_VBIOS_BLC_I2C_EN (1<<29) 7858621f407SFrançois Tigeot #define SWF10_GTT_OVERRIDE_EN (1<<28) 7868621f407SFrançois Tigeot #define SWF10_LFP_DPMS_OVR (1<<27) /* override DPMS on display switch */ 7878621f407SFrançois Tigeot #define SWF10_ACTIVE_TOGGLE_LIST_MASK (7<<24) 7888621f407SFrançois Tigeot #define SWF10_OLD_TOGGLE 0x0 7898621f407SFrançois Tigeot #define SWF10_TOGGLE_LIST_1 0x1 7908621f407SFrançois Tigeot #define SWF10_TOGGLE_LIST_2 0x2 7918621f407SFrançois Tigeot #define SWF10_TOGGLE_LIST_3 0x3 7928621f407SFrançois Tigeot #define SWF10_TOGGLE_LIST_4 0x4 7938621f407SFrançois Tigeot #define SWF10_PANNING_EN (1<<23) 7948621f407SFrançois Tigeot #define SWF10_DRIVER_LOADED (1<<22) 7958621f407SFrançois Tigeot #define SWF10_EXTENDED_DESKTOP (1<<21) 7968621f407SFrançois Tigeot #define SWF10_EXCLUSIVE_MODE (1<<20) 7978621f407SFrançois Tigeot #define SWF10_OVERLAY_EN (1<<19) 7988621f407SFrançois Tigeot #define SWF10_PLANEB_HOLDOFF (1<<18) 7998621f407SFrançois Tigeot #define SWF10_PLANEA_HOLDOFF (1<<17) 8008621f407SFrançois Tigeot #define SWF10_VGA_HOLDOFF (1<<16) 8018621f407SFrançois Tigeot #define SWF10_ACTIVE_DISP_MASK 0xffff 8028621f407SFrançois Tigeot #define SWF10_PIPEB_LFP2 (1<<15) 8038621f407SFrançois Tigeot #define SWF10_PIPEB_EFP2 (1<<14) 8048621f407SFrançois Tigeot #define SWF10_PIPEB_TV2 (1<<13) 8058621f407SFrançois Tigeot #define SWF10_PIPEB_CRT2 (1<<12) 8068621f407SFrançois Tigeot #define SWF10_PIPEB_LFP (1<<11) 8078621f407SFrançois Tigeot #define SWF10_PIPEB_EFP (1<<10) 8088621f407SFrançois Tigeot #define SWF10_PIPEB_TV (1<<9) 8098621f407SFrançois Tigeot #define SWF10_PIPEB_CRT (1<<8) 8108621f407SFrançois Tigeot #define SWF10_PIPEA_LFP2 (1<<7) 8118621f407SFrançois Tigeot #define SWF10_PIPEA_EFP2 (1<<6) 8128621f407SFrançois Tigeot #define SWF10_PIPEA_TV2 (1<<5) 8138621f407SFrançois Tigeot #define SWF10_PIPEA_CRT2 (1<<4) 8148621f407SFrançois Tigeot #define SWF10_PIPEA_LFP (1<<3) 8158621f407SFrançois Tigeot #define SWF10_PIPEA_EFP (1<<2) 8168621f407SFrançois Tigeot #define SWF10_PIPEA_TV (1<<1) 8178621f407SFrançois Tigeot #define SWF10_PIPEA_CRT (1<<0) 8188621f407SFrançois Tigeot 8198621f407SFrançois Tigeot #define SWF11_MEMORY_SIZE_SHIFT 16 8208621f407SFrançois Tigeot #define SWF11_SV_TEST_EN (1<<15) 8218621f407SFrançois Tigeot #define SWF11_IS_AGP (1<<14) 8228621f407SFrançois Tigeot #define SWF11_DISPLAY_HOLDOFF (1<<13) 8238621f407SFrançois Tigeot #define SWF11_DPMS_REDUCED (1<<12) 8248621f407SFrançois Tigeot #define SWF11_IS_VBE_MODE (1<<11) 8258621f407SFrançois Tigeot #define SWF11_PIPEB_ACCESS (1<<10) /* 0 here means pipe a */ 8268621f407SFrançois Tigeot #define SWF11_DPMS_MASK 0x07 8278621f407SFrançois Tigeot #define SWF11_DPMS_OFF (1<<2) 8288621f407SFrançois Tigeot #define SWF11_DPMS_SUSPEND (1<<1) 8298621f407SFrançois Tigeot #define SWF11_DPMS_STANDBY (1<<0) 8308621f407SFrançois Tigeot #define SWF11_DPMS_ON 0 8318621f407SFrançois Tigeot 8328621f407SFrançois Tigeot #define SWF14_GFX_PFIT_EN (1<<31) 8338621f407SFrançois Tigeot #define SWF14_TEXT_PFIT_EN (1<<30) 8348621f407SFrançois Tigeot #define SWF14_LID_STATUS_CLOSED (1<<29) /* 0 here means open */ 8358621f407SFrançois Tigeot #define SWF14_POPUP_EN (1<<28) 8368621f407SFrançois Tigeot #define SWF14_DISPLAY_HOLDOFF (1<<27) 8378621f407SFrançois Tigeot #define SWF14_DISP_DETECT_EN (1<<26) 8388621f407SFrançois Tigeot #define SWF14_DOCKING_STATUS_DOCKED (1<<25) /* 0 here means undocked */ 8398621f407SFrançois Tigeot #define SWF14_DRIVER_STATUS (1<<24) 8408621f407SFrançois Tigeot #define SWF14_OS_TYPE_WIN9X (1<<23) 8418621f407SFrançois Tigeot #define SWF14_OS_TYPE_WINNT (1<<22) 8428621f407SFrançois Tigeot /* 21:19 rsvd */ 8438621f407SFrançois Tigeot #define SWF14_PM_TYPE_MASK 0x00070000 8448621f407SFrançois Tigeot #define SWF14_PM_ACPI_VIDEO (0x4 << 16) 8458621f407SFrançois Tigeot #define SWF14_PM_ACPI (0x3 << 16) 8468621f407SFrançois Tigeot #define SWF14_PM_APM_12 (0x2 << 16) 8478621f407SFrançois Tigeot #define SWF14_PM_APM_11 (0x1 << 16) 8488621f407SFrançois Tigeot #define SWF14_HK_REQUEST_MASK 0x0000ffff /* see GR18 6:3 for event type */ 8498621f407SFrançois Tigeot /* if GR18 indicates a display switch */ 8508621f407SFrançois Tigeot #define SWF14_DS_PIPEB_LFP2_EN (1<<15) 8518621f407SFrançois Tigeot #define SWF14_DS_PIPEB_EFP2_EN (1<<14) 8528621f407SFrançois Tigeot #define SWF14_DS_PIPEB_TV2_EN (1<<13) 8538621f407SFrançois Tigeot #define SWF14_DS_PIPEB_CRT2_EN (1<<12) 8548621f407SFrançois Tigeot #define SWF14_DS_PIPEB_LFP_EN (1<<11) 8558621f407SFrançois Tigeot #define SWF14_DS_PIPEB_EFP_EN (1<<10) 8568621f407SFrançois Tigeot #define SWF14_DS_PIPEB_TV_EN (1<<9) 8578621f407SFrançois Tigeot #define SWF14_DS_PIPEB_CRT_EN (1<<8) 8588621f407SFrançois Tigeot #define SWF14_DS_PIPEA_LFP2_EN (1<<7) 8598621f407SFrançois Tigeot #define SWF14_DS_PIPEA_EFP2_EN (1<<6) 8608621f407SFrançois Tigeot #define SWF14_DS_PIPEA_TV2_EN (1<<5) 8618621f407SFrançois Tigeot #define SWF14_DS_PIPEA_CRT2_EN (1<<4) 8628621f407SFrançois Tigeot #define SWF14_DS_PIPEA_LFP_EN (1<<3) 8638621f407SFrançois Tigeot #define SWF14_DS_PIPEA_EFP_EN (1<<2) 8648621f407SFrançois Tigeot #define SWF14_DS_PIPEA_TV_EN (1<<1) 8658621f407SFrançois Tigeot #define SWF14_DS_PIPEA_CRT_EN (1<<0) 8668621f407SFrançois Tigeot /* if GR18 indicates a panel fitting request */ 8678621f407SFrançois Tigeot #define SWF14_PFIT_EN (1<<0) /* 0 means disable */ 8688621f407SFrançois Tigeot /* if GR18 indicates an APM change request */ 8698621f407SFrançois Tigeot #define SWF14_APM_HIBERNATE 0x4 8708621f407SFrançois Tigeot #define SWF14_APM_SUSPEND 0x3 8718621f407SFrançois Tigeot #define SWF14_APM_STANDBY 0x1 8728621f407SFrançois Tigeot #define SWF14_APM_RESTORE 0x0 8738621f407SFrançois Tigeot 8748621f407SFrançois Tigeot /* Block 52 contains MIPI configuration block 8758621f407SFrançois Tigeot * 6 * bdb_mipi_config, followed by 6 pps data block 8768621f407SFrançois Tigeot * block below 8778621f407SFrançois Tigeot */ 8788621f407SFrançois Tigeot #define MAX_MIPI_CONFIGURATIONS 6 8798621f407SFrançois Tigeot 8808621f407SFrançois Tigeot struct bdb_mipi_config { 8818621f407SFrançois Tigeot struct mipi_config config[MAX_MIPI_CONFIGURATIONS]; 8828621f407SFrançois Tigeot struct mipi_pps_data pps[MAX_MIPI_CONFIGURATIONS]; 8838621f407SFrançois Tigeot } __packed; 8848621f407SFrançois Tigeot 8858621f407SFrançois Tigeot /* Block 53 contains MIPI sequences as needed by the panel 8868621f407SFrançois Tigeot * for enabling it. This block can be variable in size and 8878621f407SFrançois Tigeot * can be maximum of 6 blocks 8888621f407SFrançois Tigeot */ 8898621f407SFrançois Tigeot struct bdb_mipi_sequence { 8908621f407SFrançois Tigeot u8 version; 8918621f407SFrançois Tigeot u8 data[0]; 8928621f407SFrançois Tigeot } __packed; 8938621f407SFrançois Tigeot 8948621f407SFrançois Tigeot enum mipi_gpio_pin_index { 8958621f407SFrançois Tigeot MIPI_GPIO_UNDEFINED = 0, 8968621f407SFrançois Tigeot MIPI_GPIO_PANEL_ENABLE, 8978621f407SFrançois Tigeot MIPI_GPIO_BL_ENABLE, 8988621f407SFrançois Tigeot MIPI_GPIO_PWM_ENABLE, 8998621f407SFrançois Tigeot MIPI_GPIO_RESET_N, 9008621f407SFrançois Tigeot MIPI_GPIO_PWR_DOWN_R, 9018621f407SFrançois Tigeot MIPI_GPIO_STDBY_RST_N, 9028621f407SFrançois Tigeot MIPI_GPIO_MAX 9038621f407SFrançois Tigeot }; 9048621f407SFrançois Tigeot 9058621f407SFrançois Tigeot #endif /* _INTEL_VBT_DEFS_H_ */ 906