1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright (c) 2006 Intel Corporation 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Authors: 6*4882a593Smuzhiyun * Eric Anholt <eric@anholt.net> 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #ifndef _INTEL_BIOS_H_ 10*4882a593Smuzhiyun #define _INTEL_BIOS_H_ 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun struct drm_device; 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun struct vbt_header { 15*4882a593Smuzhiyun u8 signature[20]; /**< Always starts with 'VBT$' */ 16*4882a593Smuzhiyun u16 version; /**< decimal */ 17*4882a593Smuzhiyun u16 header_size; /**< in bytes */ 18*4882a593Smuzhiyun u16 vbt_size; /**< in bytes */ 19*4882a593Smuzhiyun u8 vbt_checksum; 20*4882a593Smuzhiyun u8 reserved0; 21*4882a593Smuzhiyun u32 bdb_offset; /**< from beginning of VBT */ 22*4882a593Smuzhiyun u32 aim_offset[4]; /**< from beginning of VBT */ 23*4882a593Smuzhiyun } __packed; 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun struct bdb_header { 27*4882a593Smuzhiyun u8 signature[16]; /**< Always 'BIOS_DATA_BLOCK' */ 28*4882a593Smuzhiyun u16 version; /**< decimal */ 29*4882a593Smuzhiyun u16 header_size; /**< in bytes */ 30*4882a593Smuzhiyun u16 bdb_size; /**< in bytes */ 31*4882a593Smuzhiyun }; 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun /* strictly speaking, this is a "skip" block, but it has interesting info */ 34*4882a593Smuzhiyun struct vbios_data { 35*4882a593Smuzhiyun u8 type; /* 0 == desktop, 1 == mobile */ 36*4882a593Smuzhiyun u8 relstage; 37*4882a593Smuzhiyun u8 chipset; 38*4882a593Smuzhiyun u8 lvds_present:1; 39*4882a593Smuzhiyun u8 tv_present:1; 40*4882a593Smuzhiyun u8 rsvd2:6; /* finish byte */ 41*4882a593Smuzhiyun u8 rsvd3[4]; 42*4882a593Smuzhiyun u8 signon[155]; 43*4882a593Smuzhiyun u8 copyright[61]; 44*4882a593Smuzhiyun u16 code_segment; 45*4882a593Smuzhiyun u8 dos_boot_mode; 46*4882a593Smuzhiyun u8 bandwidth_percent; 47*4882a593Smuzhiyun u8 rsvd4; /* popup memory size */ 48*4882a593Smuzhiyun u8 resize_pci_bios; 49*4882a593Smuzhiyun u8 rsvd5; /* is crt already on ddc2 */ 50*4882a593Smuzhiyun } __packed; 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun /* 53*4882a593Smuzhiyun * There are several types of BIOS data blocks (BDBs), each block has 54*4882a593Smuzhiyun * an ID and size in the first 3 bytes (ID in first, size in next 2). 55*4882a593Smuzhiyun * Known types are listed below. 56*4882a593Smuzhiyun */ 57*4882a593Smuzhiyun #define BDB_GENERAL_FEATURES 1 58*4882a593Smuzhiyun #define BDB_GENERAL_DEFINITIONS 2 59*4882a593Smuzhiyun #define BDB_OLD_TOGGLE_LIST 3 60*4882a593Smuzhiyun #define BDB_MODE_SUPPORT_LIST 4 61*4882a593Smuzhiyun #define BDB_GENERIC_MODE_TABLE 5 62*4882a593Smuzhiyun #define BDB_EXT_MMIO_REGS 6 63*4882a593Smuzhiyun #define BDB_SWF_IO 7 64*4882a593Smuzhiyun #define BDB_SWF_MMIO 8 65*4882a593Smuzhiyun #define BDB_DOT_CLOCK_TABLE 9 66*4882a593Smuzhiyun #define BDB_MODE_REMOVAL_TABLE 10 67*4882a593Smuzhiyun #define BDB_CHILD_DEVICE_TABLE 11 68*4882a593Smuzhiyun #define BDB_DRIVER_FEATURES 12 69*4882a593Smuzhiyun #define BDB_DRIVER_PERSISTENCE 13 70*4882a593Smuzhiyun #define BDB_EXT_TABLE_PTRS 14 71*4882a593Smuzhiyun #define BDB_DOT_CLOCK_OVERRIDE 15 72*4882a593Smuzhiyun #define BDB_DISPLAY_SELECT 16 73*4882a593Smuzhiyun /* 17 rsvd */ 74*4882a593Smuzhiyun #define BDB_DRIVER_ROTATION 18 75*4882a593Smuzhiyun #define BDB_DISPLAY_REMOVE 19 76*4882a593Smuzhiyun #define BDB_OEM_CUSTOM 20 77*4882a593Smuzhiyun #define BDB_EFP_LIST 21 /* workarounds for VGA hsync/vsync */ 78*4882a593Smuzhiyun #define BDB_SDVO_LVDS_OPTIONS 22 79*4882a593Smuzhiyun #define BDB_SDVO_PANEL_DTDS 23 80*4882a593Smuzhiyun #define BDB_SDVO_LVDS_PNP_IDS 24 81*4882a593Smuzhiyun #define BDB_SDVO_LVDS_POWER_SEQ 25 82*4882a593Smuzhiyun #define BDB_TV_OPTIONS 26 83*4882a593Smuzhiyun #define BDB_EDP 27 84*4882a593Smuzhiyun #define BDB_LVDS_OPTIONS 40 85*4882a593Smuzhiyun #define BDB_LVDS_LFP_DATA_PTRS 41 86*4882a593Smuzhiyun #define BDB_LVDS_LFP_DATA 42 87*4882a593Smuzhiyun #define BDB_LVDS_BACKLIGHT 43 88*4882a593Smuzhiyun #define BDB_LVDS_POWER 44 89*4882a593Smuzhiyun #define BDB_SKIP 254 /* VBIOS private block, ignore */ 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun struct bdb_general_features { 92*4882a593Smuzhiyun /* bits 1 */ 93*4882a593Smuzhiyun u8 panel_fitting:2; 94*4882a593Smuzhiyun u8 flexaim:1; 95*4882a593Smuzhiyun u8 msg_enable:1; 96*4882a593Smuzhiyun u8 clear_screen:3; 97*4882a593Smuzhiyun u8 color_flip:1; 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun /* bits 2 */ 100*4882a593Smuzhiyun u8 download_ext_vbt:1; 101*4882a593Smuzhiyun u8 enable_ssc:1; 102*4882a593Smuzhiyun u8 ssc_freq:1; 103*4882a593Smuzhiyun u8 enable_lfp_on_override:1; 104*4882a593Smuzhiyun u8 disable_ssc_ddt:1; 105*4882a593Smuzhiyun u8 rsvd8:3; /* finish byte */ 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun /* bits 3 */ 108*4882a593Smuzhiyun u8 disable_smooth_vision:1; 109*4882a593Smuzhiyun u8 single_dvi:1; 110*4882a593Smuzhiyun u8 rsvd9:6; /* finish byte */ 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun /* bits 4 */ 113*4882a593Smuzhiyun u8 legacy_monitor_detect; 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun /* bits 5 */ 116*4882a593Smuzhiyun u8 int_crt_support:1; 117*4882a593Smuzhiyun u8 int_tv_support:1; 118*4882a593Smuzhiyun u8 int_efp_support:1; 119*4882a593Smuzhiyun u8 dp_ssc_enb:1; /* PCH attached eDP supports SSC */ 120*4882a593Smuzhiyun u8 dp_ssc_freq:1; /* SSC freq for PCH attached eDP */ 121*4882a593Smuzhiyun u8 rsvd11:3; /* finish byte */ 122*4882a593Smuzhiyun } __packed; 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun /* pre-915 */ 125*4882a593Smuzhiyun #define GPIO_PIN_DVI_LVDS 0x03 /* "DVI/LVDS DDC GPIO pins" */ 126*4882a593Smuzhiyun #define GPIO_PIN_ADD_I2C 0x05 /* "ADDCARD I2C GPIO pins" */ 127*4882a593Smuzhiyun #define GPIO_PIN_ADD_DDC 0x04 /* "ADDCARD DDC GPIO pins" */ 128*4882a593Smuzhiyun #define GPIO_PIN_ADD_DDC_I2C 0x06 /* "ADDCARD DDC/I2C GPIO pins" */ 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun /* Pre 915 */ 131*4882a593Smuzhiyun #define DEVICE_TYPE_NONE 0x00 132*4882a593Smuzhiyun #define DEVICE_TYPE_CRT 0x01 133*4882a593Smuzhiyun #define DEVICE_TYPE_TV 0x09 134*4882a593Smuzhiyun #define DEVICE_TYPE_EFP 0x12 135*4882a593Smuzhiyun #define DEVICE_TYPE_LFP 0x22 136*4882a593Smuzhiyun /* On 915+ */ 137*4882a593Smuzhiyun #define DEVICE_TYPE_CRT_DPMS 0x6001 138*4882a593Smuzhiyun #define DEVICE_TYPE_CRT_DPMS_HOTPLUG 0x4001 139*4882a593Smuzhiyun #define DEVICE_TYPE_TV_COMPOSITE 0x0209 140*4882a593Smuzhiyun #define DEVICE_TYPE_TV_MACROVISION 0x0289 141*4882a593Smuzhiyun #define DEVICE_TYPE_TV_RF_COMPOSITE 0x020c 142*4882a593Smuzhiyun #define DEVICE_TYPE_TV_SVIDEO_COMPOSITE 0x0609 143*4882a593Smuzhiyun #define DEVICE_TYPE_TV_SCART 0x0209 144*4882a593Smuzhiyun #define DEVICE_TYPE_TV_CODEC_HOTPLUG_PWR 0x6009 145*4882a593Smuzhiyun #define DEVICE_TYPE_EFP_HOTPLUG_PWR 0x6012 146*4882a593Smuzhiyun #define DEVICE_TYPE_EFP_DVI_HOTPLUG_PWR 0x6052 147*4882a593Smuzhiyun #define DEVICE_TYPE_EFP_DVI_I 0x6053 148*4882a593Smuzhiyun #define DEVICE_TYPE_EFP_DVI_D_DUAL 0x6152 149*4882a593Smuzhiyun #define DEVICE_TYPE_EFP_DVI_D_HDCP 0x60d2 150*4882a593Smuzhiyun #define DEVICE_TYPE_OPENLDI_HOTPLUG_PWR 0x6062 151*4882a593Smuzhiyun #define DEVICE_TYPE_OPENLDI_DUALPIX 0x6162 152*4882a593Smuzhiyun #define DEVICE_TYPE_LFP_PANELLINK 0x5012 153*4882a593Smuzhiyun #define DEVICE_TYPE_LFP_CMOS_PWR 0x5042 154*4882a593Smuzhiyun #define DEVICE_TYPE_LFP_LVDS_PWR 0x5062 155*4882a593Smuzhiyun #define DEVICE_TYPE_LFP_LVDS_DUAL 0x5162 156*4882a593Smuzhiyun #define DEVICE_TYPE_LFP_LVDS_DUAL_HDCP 0x51e2 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun #define DEVICE_CFG_NONE 0x00 159*4882a593Smuzhiyun #define DEVICE_CFG_12BIT_DVOB 0x01 160*4882a593Smuzhiyun #define DEVICE_CFG_12BIT_DVOC 0x02 161*4882a593Smuzhiyun #define DEVICE_CFG_24BIT_DVOBC 0x09 162*4882a593Smuzhiyun #define DEVICE_CFG_24BIT_DVOCB 0x0a 163*4882a593Smuzhiyun #define DEVICE_CFG_DUAL_DVOB 0x11 164*4882a593Smuzhiyun #define DEVICE_CFG_DUAL_DVOC 0x12 165*4882a593Smuzhiyun #define DEVICE_CFG_DUAL_DVOBC 0x13 166*4882a593Smuzhiyun #define DEVICE_CFG_DUAL_LINK_DVOBC 0x19 167*4882a593Smuzhiyun #define DEVICE_CFG_DUAL_LINK_DVOCB 0x1a 168*4882a593Smuzhiyun 169*4882a593Smuzhiyun #define DEVICE_WIRE_NONE 0x00 170*4882a593Smuzhiyun #define DEVICE_WIRE_DVOB 0x01 171*4882a593Smuzhiyun #define DEVICE_WIRE_DVOC 0x02 172*4882a593Smuzhiyun #define DEVICE_WIRE_DVOBC 0x03 173*4882a593Smuzhiyun #define DEVICE_WIRE_DVOBB 0x05 174*4882a593Smuzhiyun #define DEVICE_WIRE_DVOCC 0x06 175*4882a593Smuzhiyun #define DEVICE_WIRE_DVOB_MASTER 0x0d 176*4882a593Smuzhiyun #define DEVICE_WIRE_DVOC_MASTER 0x0e 177*4882a593Smuzhiyun 178*4882a593Smuzhiyun #define DEVICE_PORT_DVOA 0x00 /* none on 845+ */ 179*4882a593Smuzhiyun #define DEVICE_PORT_DVOB 0x01 180*4882a593Smuzhiyun #define DEVICE_PORT_DVOC 0x02 181*4882a593Smuzhiyun 182*4882a593Smuzhiyun struct child_device_config { 183*4882a593Smuzhiyun u16 handle; 184*4882a593Smuzhiyun u16 device_type; 185*4882a593Smuzhiyun u8 device_id[10]; /* ascii string */ 186*4882a593Smuzhiyun u16 addin_offset; 187*4882a593Smuzhiyun u8 dvo_port; /* See Device_PORT_* above */ 188*4882a593Smuzhiyun u8 i2c_pin; 189*4882a593Smuzhiyun u8 slave_addr; 190*4882a593Smuzhiyun u8 ddc_pin; 191*4882a593Smuzhiyun u16 edid_ptr; 192*4882a593Smuzhiyun u8 dvo_cfg; /* See DEVICE_CFG_* above */ 193*4882a593Smuzhiyun u8 dvo2_port; 194*4882a593Smuzhiyun u8 i2c2_pin; 195*4882a593Smuzhiyun u8 slave2_addr; 196*4882a593Smuzhiyun u8 ddc2_pin; 197*4882a593Smuzhiyun u8 capabilities; 198*4882a593Smuzhiyun u8 dvo_wiring;/* See DEVICE_WIRE_* above */ 199*4882a593Smuzhiyun u8 dvo2_wiring; 200*4882a593Smuzhiyun u16 extended_type; 201*4882a593Smuzhiyun u8 dvo_function; 202*4882a593Smuzhiyun } __packed; 203*4882a593Smuzhiyun 204*4882a593Smuzhiyun 205*4882a593Smuzhiyun struct bdb_general_definitions { 206*4882a593Smuzhiyun /* DDC GPIO */ 207*4882a593Smuzhiyun u8 crt_ddc_gmbus_pin; 208*4882a593Smuzhiyun 209*4882a593Smuzhiyun /* DPMS bits */ 210*4882a593Smuzhiyun u8 dpms_acpi:1; 211*4882a593Smuzhiyun u8 skip_boot_crt_detect:1; 212*4882a593Smuzhiyun u8 dpms_aim:1; 213*4882a593Smuzhiyun u8 rsvd1:5; /* finish byte */ 214*4882a593Smuzhiyun 215*4882a593Smuzhiyun /* boot device bits */ 216*4882a593Smuzhiyun u8 boot_display[2]; 217*4882a593Smuzhiyun u8 child_dev_size; 218*4882a593Smuzhiyun 219*4882a593Smuzhiyun /* 220*4882a593Smuzhiyun * Device info: 221*4882a593Smuzhiyun * If TV is present, it'll be at devices[0]. 222*4882a593Smuzhiyun * LVDS will be next, either devices[0] or [1], if present. 223*4882a593Smuzhiyun * On some platforms the number of device is 6. But could be as few as 224*4882a593Smuzhiyun * 4 if both TV and LVDS are missing. 225*4882a593Smuzhiyun * And the device num is related with the size of general definition 226*4882a593Smuzhiyun * block. It is obtained by using the following formula: 227*4882a593Smuzhiyun * number = (block_size - sizeof(bdb_general_definitions))/ 228*4882a593Smuzhiyun * sizeof(child_device_config); 229*4882a593Smuzhiyun */ 230*4882a593Smuzhiyun struct child_device_config devices[]; 231*4882a593Smuzhiyun }; 232*4882a593Smuzhiyun 233*4882a593Smuzhiyun struct bdb_lvds_options { 234*4882a593Smuzhiyun u8 panel_type; 235*4882a593Smuzhiyun u8 rsvd1; 236*4882a593Smuzhiyun /* LVDS capabilities, stored in a dword */ 237*4882a593Smuzhiyun u8 pfit_mode:2; 238*4882a593Smuzhiyun u8 pfit_text_mode_enhanced:1; 239*4882a593Smuzhiyun u8 pfit_gfx_mode_enhanced:1; 240*4882a593Smuzhiyun u8 pfit_ratio_auto:1; 241*4882a593Smuzhiyun u8 pixel_dither:1; 242*4882a593Smuzhiyun u8 lvds_edid:1; 243*4882a593Smuzhiyun u8 rsvd2:1; 244*4882a593Smuzhiyun u8 rsvd4; 245*4882a593Smuzhiyun } __packed; 246*4882a593Smuzhiyun 247*4882a593Smuzhiyun struct bdb_lvds_backlight { 248*4882a593Smuzhiyun u8 type:2; 249*4882a593Smuzhiyun u8 pol:1; 250*4882a593Smuzhiyun u8 gpio:3; 251*4882a593Smuzhiyun u8 gmbus:2; 252*4882a593Smuzhiyun u16 freq; 253*4882a593Smuzhiyun u8 minbrightness; 254*4882a593Smuzhiyun u8 i2caddr; 255*4882a593Smuzhiyun u8 brightnesscmd; 256*4882a593Smuzhiyun /*FIXME: more...*/ 257*4882a593Smuzhiyun } __packed; 258*4882a593Smuzhiyun 259*4882a593Smuzhiyun /* LFP pointer table contains entries to the struct below */ 260*4882a593Smuzhiyun struct bdb_lvds_lfp_data_ptr { 261*4882a593Smuzhiyun u16 fp_timing_offset; /* offsets are from start of bdb */ 262*4882a593Smuzhiyun u8 fp_table_size; 263*4882a593Smuzhiyun u16 dvo_timing_offset; 264*4882a593Smuzhiyun u8 dvo_table_size; 265*4882a593Smuzhiyun u16 panel_pnp_id_offset; 266*4882a593Smuzhiyun u8 pnp_table_size; 267*4882a593Smuzhiyun } __packed; 268*4882a593Smuzhiyun 269*4882a593Smuzhiyun struct bdb_lvds_lfp_data_ptrs { 270*4882a593Smuzhiyun u8 lvds_entries; /* followed by one or more lvds_data_ptr structs */ 271*4882a593Smuzhiyun struct bdb_lvds_lfp_data_ptr ptr[16]; 272*4882a593Smuzhiyun } __packed; 273*4882a593Smuzhiyun 274*4882a593Smuzhiyun /* LFP data has 3 blocks per entry */ 275*4882a593Smuzhiyun struct lvds_fp_timing { 276*4882a593Smuzhiyun u16 x_res; 277*4882a593Smuzhiyun u16 y_res; 278*4882a593Smuzhiyun u32 lvds_reg; 279*4882a593Smuzhiyun u32 lvds_reg_val; 280*4882a593Smuzhiyun u32 pp_on_reg; 281*4882a593Smuzhiyun u32 pp_on_reg_val; 282*4882a593Smuzhiyun u32 pp_off_reg; 283*4882a593Smuzhiyun u32 pp_off_reg_val; 284*4882a593Smuzhiyun u32 pp_cycle_reg; 285*4882a593Smuzhiyun u32 pp_cycle_reg_val; 286*4882a593Smuzhiyun u32 pfit_reg; 287*4882a593Smuzhiyun u32 pfit_reg_val; 288*4882a593Smuzhiyun u16 terminator; 289*4882a593Smuzhiyun } __packed; 290*4882a593Smuzhiyun 291*4882a593Smuzhiyun struct lvds_dvo_timing { 292*4882a593Smuzhiyun u16 clock; /**< In 10khz */ 293*4882a593Smuzhiyun u8 hactive_lo; 294*4882a593Smuzhiyun u8 hblank_lo; 295*4882a593Smuzhiyun u8 hblank_hi:4; 296*4882a593Smuzhiyun u8 hactive_hi:4; 297*4882a593Smuzhiyun u8 vactive_lo; 298*4882a593Smuzhiyun u8 vblank_lo; 299*4882a593Smuzhiyun u8 vblank_hi:4; 300*4882a593Smuzhiyun u8 vactive_hi:4; 301*4882a593Smuzhiyun u8 hsync_off_lo; 302*4882a593Smuzhiyun u8 hsync_pulse_width; 303*4882a593Smuzhiyun u8 vsync_pulse_width:4; 304*4882a593Smuzhiyun u8 vsync_off:4; 305*4882a593Smuzhiyun u8 rsvd0:6; 306*4882a593Smuzhiyun u8 hsync_off_hi:2; 307*4882a593Smuzhiyun u8 h_image; 308*4882a593Smuzhiyun u8 v_image; 309*4882a593Smuzhiyun u8 max_hv; 310*4882a593Smuzhiyun u8 h_border; 311*4882a593Smuzhiyun u8 v_border; 312*4882a593Smuzhiyun u8 rsvd1:3; 313*4882a593Smuzhiyun u8 digital:2; 314*4882a593Smuzhiyun u8 vsync_positive:1; 315*4882a593Smuzhiyun u8 hsync_positive:1; 316*4882a593Smuzhiyun u8 rsvd2:1; 317*4882a593Smuzhiyun } __packed; 318*4882a593Smuzhiyun 319*4882a593Smuzhiyun struct lvds_pnp_id { 320*4882a593Smuzhiyun u16 mfg_name; 321*4882a593Smuzhiyun u16 product_code; 322*4882a593Smuzhiyun u32 serial; 323*4882a593Smuzhiyun u8 mfg_week; 324*4882a593Smuzhiyun u8 mfg_year; 325*4882a593Smuzhiyun } __packed; 326*4882a593Smuzhiyun 327*4882a593Smuzhiyun struct bdb_lvds_lfp_data_entry { 328*4882a593Smuzhiyun struct lvds_fp_timing fp_timing; 329*4882a593Smuzhiyun struct lvds_dvo_timing dvo_timing; 330*4882a593Smuzhiyun struct lvds_pnp_id pnp_id; 331*4882a593Smuzhiyun } __packed; 332*4882a593Smuzhiyun 333*4882a593Smuzhiyun struct bdb_lvds_lfp_data { 334*4882a593Smuzhiyun struct bdb_lvds_lfp_data_entry data[16]; 335*4882a593Smuzhiyun } __packed; 336*4882a593Smuzhiyun 337*4882a593Smuzhiyun struct aimdb_header { 338*4882a593Smuzhiyun char signature[16]; 339*4882a593Smuzhiyun char oem_device[20]; 340*4882a593Smuzhiyun u16 aimdb_version; 341*4882a593Smuzhiyun u16 aimdb_header_size; 342*4882a593Smuzhiyun u16 aimdb_size; 343*4882a593Smuzhiyun } __packed; 344*4882a593Smuzhiyun 345*4882a593Smuzhiyun struct aimdb_block { 346*4882a593Smuzhiyun u8 aimdb_id; 347*4882a593Smuzhiyun u16 aimdb_size; 348*4882a593Smuzhiyun } __packed; 349*4882a593Smuzhiyun 350*4882a593Smuzhiyun struct vch_panel_data { 351*4882a593Smuzhiyun u16 fp_timing_offset; 352*4882a593Smuzhiyun u8 fp_timing_size; 353*4882a593Smuzhiyun u16 dvo_timing_offset; 354*4882a593Smuzhiyun u8 dvo_timing_size; 355*4882a593Smuzhiyun u16 text_fitting_offset; 356*4882a593Smuzhiyun u8 text_fitting_size; 357*4882a593Smuzhiyun u16 graphics_fitting_offset; 358*4882a593Smuzhiyun u8 graphics_fitting_size; 359*4882a593Smuzhiyun } __packed; 360*4882a593Smuzhiyun 361*4882a593Smuzhiyun struct vch_bdb_22 { 362*4882a593Smuzhiyun struct aimdb_block aimdb_block; 363*4882a593Smuzhiyun struct vch_panel_data panels[16]; 364*4882a593Smuzhiyun } __packed; 365*4882a593Smuzhiyun 366*4882a593Smuzhiyun struct bdb_sdvo_lvds_options { 367*4882a593Smuzhiyun u8 panel_backlight; 368*4882a593Smuzhiyun u8 h40_set_panel_type; 369*4882a593Smuzhiyun u8 panel_type; 370*4882a593Smuzhiyun u8 ssc_clk_freq; 371*4882a593Smuzhiyun u16 als_low_trip; 372*4882a593Smuzhiyun u16 als_high_trip; 373*4882a593Smuzhiyun u8 sclalarcoeff_tab_row_num; 374*4882a593Smuzhiyun u8 sclalarcoeff_tab_row_size; 375*4882a593Smuzhiyun u8 coefficient[8]; 376*4882a593Smuzhiyun u8 panel_misc_bits_1; 377*4882a593Smuzhiyun u8 panel_misc_bits_2; 378*4882a593Smuzhiyun u8 panel_misc_bits_3; 379*4882a593Smuzhiyun u8 panel_misc_bits_4; 380*4882a593Smuzhiyun } __packed; 381*4882a593Smuzhiyun 382*4882a593Smuzhiyun #define BDB_DRIVER_FEATURE_NO_LVDS 0 383*4882a593Smuzhiyun #define BDB_DRIVER_FEATURE_INT_LVDS 1 384*4882a593Smuzhiyun #define BDB_DRIVER_FEATURE_SDVO_LVDS 2 385*4882a593Smuzhiyun #define BDB_DRIVER_FEATURE_EDP 3 386*4882a593Smuzhiyun 387*4882a593Smuzhiyun struct bdb_driver_features { 388*4882a593Smuzhiyun u8 boot_dev_algorithm:1; 389*4882a593Smuzhiyun u8 block_display_switch:1; 390*4882a593Smuzhiyun u8 allow_display_switch:1; 391*4882a593Smuzhiyun u8 hotplug_dvo:1; 392*4882a593Smuzhiyun u8 dual_view_zoom:1; 393*4882a593Smuzhiyun u8 int15h_hook:1; 394*4882a593Smuzhiyun u8 sprite_in_clone:1; 395*4882a593Smuzhiyun u8 primary_lfp_id:1; 396*4882a593Smuzhiyun 397*4882a593Smuzhiyun u16 boot_mode_x; 398*4882a593Smuzhiyun u16 boot_mode_y; 399*4882a593Smuzhiyun u8 boot_mode_bpp; 400*4882a593Smuzhiyun u8 boot_mode_refresh; 401*4882a593Smuzhiyun 402*4882a593Smuzhiyun u16 enable_lfp_primary:1; 403*4882a593Smuzhiyun u16 selective_mode_pruning:1; 404*4882a593Smuzhiyun u16 dual_frequency:1; 405*4882a593Smuzhiyun u16 render_clock_freq:1; /* 0: high freq; 1: low freq */ 406*4882a593Smuzhiyun u16 nt_clone_support:1; 407*4882a593Smuzhiyun u16 power_scheme_ui:1; /* 0: CUI; 1: 3rd party */ 408*4882a593Smuzhiyun u16 sprite_display_assign:1; /* 0: secondary; 1: primary */ 409*4882a593Smuzhiyun u16 cui_aspect_scaling:1; 410*4882a593Smuzhiyun u16 preserve_aspect_ratio:1; 411*4882a593Smuzhiyun u16 sdvo_device_power_down:1; 412*4882a593Smuzhiyun u16 crt_hotplug:1; 413*4882a593Smuzhiyun u16 lvds_config:2; 414*4882a593Smuzhiyun u16 tv_hotplug:1; 415*4882a593Smuzhiyun u16 hdmi_config:2; 416*4882a593Smuzhiyun 417*4882a593Smuzhiyun u8 static_display:1; 418*4882a593Smuzhiyun u8 reserved2:7; 419*4882a593Smuzhiyun u16 legacy_crt_max_x; 420*4882a593Smuzhiyun u16 legacy_crt_max_y; 421*4882a593Smuzhiyun u8 legacy_crt_max_refresh; 422*4882a593Smuzhiyun 423*4882a593Smuzhiyun u8 hdmi_termination; 424*4882a593Smuzhiyun u8 custom_vbt_version; 425*4882a593Smuzhiyun } __packed; 426*4882a593Smuzhiyun 427*4882a593Smuzhiyun #define EDP_18BPP 0 428*4882a593Smuzhiyun #define EDP_24BPP 1 429*4882a593Smuzhiyun #define EDP_30BPP 2 430*4882a593Smuzhiyun #define EDP_RATE_1_62 0 431*4882a593Smuzhiyun #define EDP_RATE_2_7 1 432*4882a593Smuzhiyun #define EDP_LANE_1 0 433*4882a593Smuzhiyun #define EDP_LANE_2 1 434*4882a593Smuzhiyun #define EDP_LANE_4 3 435*4882a593Smuzhiyun #define EDP_PREEMPHASIS_NONE 0 436*4882a593Smuzhiyun #define EDP_PREEMPHASIS_3_5dB 1 437*4882a593Smuzhiyun #define EDP_PREEMPHASIS_6dB 2 438*4882a593Smuzhiyun #define EDP_PREEMPHASIS_9_5dB 3 439*4882a593Smuzhiyun #define EDP_VSWING_0_4V 0 440*4882a593Smuzhiyun #define EDP_VSWING_0_6V 1 441*4882a593Smuzhiyun #define EDP_VSWING_0_8V 2 442*4882a593Smuzhiyun #define EDP_VSWING_1_2V 3 443*4882a593Smuzhiyun 444*4882a593Smuzhiyun struct edp_power_seq { 445*4882a593Smuzhiyun u16 t1_t3; 446*4882a593Smuzhiyun u16 t8; 447*4882a593Smuzhiyun u16 t9; 448*4882a593Smuzhiyun u16 t10; 449*4882a593Smuzhiyun u16 t11_t12; 450*4882a593Smuzhiyun } __attribute__ ((packed)); 451*4882a593Smuzhiyun 452*4882a593Smuzhiyun struct edp_link_params { 453*4882a593Smuzhiyun u8 rate:4; 454*4882a593Smuzhiyun u8 lanes:4; 455*4882a593Smuzhiyun u8 preemphasis:4; 456*4882a593Smuzhiyun u8 vswing:4; 457*4882a593Smuzhiyun } __attribute__ ((packed)); 458*4882a593Smuzhiyun 459*4882a593Smuzhiyun struct bdb_edp { 460*4882a593Smuzhiyun struct edp_power_seq power_seqs[16]; 461*4882a593Smuzhiyun u32 color_depth; 462*4882a593Smuzhiyun u32 sdrrs_msa_timing_delay; 463*4882a593Smuzhiyun struct edp_link_params link_params[16]; 464*4882a593Smuzhiyun } __attribute__ ((packed)); 465*4882a593Smuzhiyun 466*4882a593Smuzhiyun extern int psb_intel_init_bios(struct drm_device *dev); 467*4882a593Smuzhiyun extern void psb_intel_destroy_bios(struct drm_device *dev); 468*4882a593Smuzhiyun 469*4882a593Smuzhiyun /* 470*4882a593Smuzhiyun * Driver<->VBIOS interaction occurs through scratch bits in 471*4882a593Smuzhiyun * GR18 & SWF*. 472*4882a593Smuzhiyun */ 473*4882a593Smuzhiyun 474*4882a593Smuzhiyun /* GR18 bits are set on display switch and hotkey events */ 475*4882a593Smuzhiyun #define GR18_DRIVER_SWITCH_EN (1<<7) /* 0: VBIOS control, 1: driver control */ 476*4882a593Smuzhiyun #define GR18_HOTKEY_MASK 0x78 /* See also SWF4 15:0 */ 477*4882a593Smuzhiyun #define GR18_HK_NONE (0x0<<3) 478*4882a593Smuzhiyun #define GR18_HK_LFP_STRETCH (0x1<<3) 479*4882a593Smuzhiyun #define GR18_HK_TOGGLE_DISP (0x2<<3) 480*4882a593Smuzhiyun #define GR18_HK_DISP_SWITCH (0x4<<3) /* see SWF14 15:0 for what to enable */ 481*4882a593Smuzhiyun #define GR18_HK_POPUP_DISABLED (0x6<<3) 482*4882a593Smuzhiyun #define GR18_HK_POPUP_ENABLED (0x7<<3) 483*4882a593Smuzhiyun #define GR18_HK_PFIT (0x8<<3) 484*4882a593Smuzhiyun #define GR18_HK_APM_CHANGE (0xa<<3) 485*4882a593Smuzhiyun #define GR18_HK_MULTIPLE (0xc<<3) 486*4882a593Smuzhiyun #define GR18_USER_INT_EN (1<<2) 487*4882a593Smuzhiyun #define GR18_A0000_FLUSH_EN (1<<1) 488*4882a593Smuzhiyun #define GR18_SMM_EN (1<<0) 489*4882a593Smuzhiyun 490*4882a593Smuzhiyun /* Set by driver, cleared by VBIOS */ 491*4882a593Smuzhiyun #define SWF00_YRES_SHIFT 16 492*4882a593Smuzhiyun #define SWF00_XRES_SHIFT 0 493*4882a593Smuzhiyun #define SWF00_RES_MASK 0xffff 494*4882a593Smuzhiyun 495*4882a593Smuzhiyun /* Set by VBIOS at boot time and driver at runtime */ 496*4882a593Smuzhiyun #define SWF01_TV2_FORMAT_SHIFT 8 497*4882a593Smuzhiyun #define SWF01_TV1_FORMAT_SHIFT 0 498*4882a593Smuzhiyun #define SWF01_TV_FORMAT_MASK 0xffff 499*4882a593Smuzhiyun 500*4882a593Smuzhiyun #define SWF10_VBIOS_BLC_I2C_EN (1<<29) 501*4882a593Smuzhiyun #define SWF10_GTT_OVERRIDE_EN (1<<28) 502*4882a593Smuzhiyun #define SWF10_LFP_DPMS_OVR (1<<27) /* override DPMS on display switch */ 503*4882a593Smuzhiyun #define SWF10_ACTIVE_TOGGLE_LIST_MASK (7<<24) 504*4882a593Smuzhiyun #define SWF10_OLD_TOGGLE 0x0 505*4882a593Smuzhiyun #define SWF10_TOGGLE_LIST_1 0x1 506*4882a593Smuzhiyun #define SWF10_TOGGLE_LIST_2 0x2 507*4882a593Smuzhiyun #define SWF10_TOGGLE_LIST_3 0x3 508*4882a593Smuzhiyun #define SWF10_TOGGLE_LIST_4 0x4 509*4882a593Smuzhiyun #define SWF10_PANNING_EN (1<<23) 510*4882a593Smuzhiyun #define SWF10_DRIVER_LOADED (1<<22) 511*4882a593Smuzhiyun #define SWF10_EXTENDED_DESKTOP (1<<21) 512*4882a593Smuzhiyun #define SWF10_EXCLUSIVE_MODE (1<<20) 513*4882a593Smuzhiyun #define SWF10_OVERLAY_EN (1<<19) 514*4882a593Smuzhiyun #define SWF10_PLANEB_HOLDOFF (1<<18) 515*4882a593Smuzhiyun #define SWF10_PLANEA_HOLDOFF (1<<17) 516*4882a593Smuzhiyun #define SWF10_VGA_HOLDOFF (1<<16) 517*4882a593Smuzhiyun #define SWF10_ACTIVE_DISP_MASK 0xffff 518*4882a593Smuzhiyun #define SWF10_PIPEB_LFP2 (1<<15) 519*4882a593Smuzhiyun #define SWF10_PIPEB_EFP2 (1<<14) 520*4882a593Smuzhiyun #define SWF10_PIPEB_TV2 (1<<13) 521*4882a593Smuzhiyun #define SWF10_PIPEB_CRT2 (1<<12) 522*4882a593Smuzhiyun #define SWF10_PIPEB_LFP (1<<11) 523*4882a593Smuzhiyun #define SWF10_PIPEB_EFP (1<<10) 524*4882a593Smuzhiyun #define SWF10_PIPEB_TV (1<<9) 525*4882a593Smuzhiyun #define SWF10_PIPEB_CRT (1<<8) 526*4882a593Smuzhiyun #define SWF10_PIPEA_LFP2 (1<<7) 527*4882a593Smuzhiyun #define SWF10_PIPEA_EFP2 (1<<6) 528*4882a593Smuzhiyun #define SWF10_PIPEA_TV2 (1<<5) 529*4882a593Smuzhiyun #define SWF10_PIPEA_CRT2 (1<<4) 530*4882a593Smuzhiyun #define SWF10_PIPEA_LFP (1<<3) 531*4882a593Smuzhiyun #define SWF10_PIPEA_EFP (1<<2) 532*4882a593Smuzhiyun #define SWF10_PIPEA_TV (1<<1) 533*4882a593Smuzhiyun #define SWF10_PIPEA_CRT (1<<0) 534*4882a593Smuzhiyun 535*4882a593Smuzhiyun #define SWF11_MEMORY_SIZE_SHIFT 16 536*4882a593Smuzhiyun #define SWF11_SV_TEST_EN (1<<15) 537*4882a593Smuzhiyun #define SWF11_IS_AGP (1<<14) 538*4882a593Smuzhiyun #define SWF11_DISPLAY_HOLDOFF (1<<13) 539*4882a593Smuzhiyun #define SWF11_DPMS_REDUCED (1<<12) 540*4882a593Smuzhiyun #define SWF11_IS_VBE_MODE (1<<11) 541*4882a593Smuzhiyun #define SWF11_PIPEB_ACCESS (1<<10) /* 0 here means pipe a */ 542*4882a593Smuzhiyun #define SWF11_DPMS_MASK 0x07 543*4882a593Smuzhiyun #define SWF11_DPMS_OFF (1<<2) 544*4882a593Smuzhiyun #define SWF11_DPMS_SUSPEND (1<<1) 545*4882a593Smuzhiyun #define SWF11_DPMS_STANDBY (1<<0) 546*4882a593Smuzhiyun #define SWF11_DPMS_ON 0 547*4882a593Smuzhiyun 548*4882a593Smuzhiyun #define SWF14_GFX_PFIT_EN (1<<31) 549*4882a593Smuzhiyun #define SWF14_TEXT_PFIT_EN (1<<30) 550*4882a593Smuzhiyun #define SWF14_LID_STATUS_CLOSED (1<<29) /* 0 here means open */ 551*4882a593Smuzhiyun #define SWF14_POPUP_EN (1<<28) 552*4882a593Smuzhiyun #define SWF14_DISPLAY_HOLDOFF (1<<27) 553*4882a593Smuzhiyun #define SWF14_DISP_DETECT_EN (1<<26) 554*4882a593Smuzhiyun #define SWF14_DOCKING_STATUS_DOCKED (1<<25) /* 0 here means undocked */ 555*4882a593Smuzhiyun #define SWF14_DRIVER_STATUS (1<<24) 556*4882a593Smuzhiyun #define SWF14_OS_TYPE_WIN9X (1<<23) 557*4882a593Smuzhiyun #define SWF14_OS_TYPE_WINNT (1<<22) 558*4882a593Smuzhiyun /* 21:19 rsvd */ 559*4882a593Smuzhiyun #define SWF14_PM_TYPE_MASK 0x00070000 560*4882a593Smuzhiyun #define SWF14_PM_ACPI_VIDEO (0x4 << 16) 561*4882a593Smuzhiyun #define SWF14_PM_ACPI (0x3 << 16) 562*4882a593Smuzhiyun #define SWF14_PM_APM_12 (0x2 << 16) 563*4882a593Smuzhiyun #define SWF14_PM_APM_11 (0x1 << 16) 564*4882a593Smuzhiyun #define SWF14_HK_REQUEST_MASK 0x0000ffff /* see GR18 6:3 for event type */ 565*4882a593Smuzhiyun /* if GR18 indicates a display switch */ 566*4882a593Smuzhiyun #define SWF14_DS_PIPEB_LFP2_EN (1<<15) 567*4882a593Smuzhiyun #define SWF14_DS_PIPEB_EFP2_EN (1<<14) 568*4882a593Smuzhiyun #define SWF14_DS_PIPEB_TV2_EN (1<<13) 569*4882a593Smuzhiyun #define SWF14_DS_PIPEB_CRT2_EN (1<<12) 570*4882a593Smuzhiyun #define SWF14_DS_PIPEB_LFP_EN (1<<11) 571*4882a593Smuzhiyun #define SWF14_DS_PIPEB_EFP_EN (1<<10) 572*4882a593Smuzhiyun #define SWF14_DS_PIPEB_TV_EN (1<<9) 573*4882a593Smuzhiyun #define SWF14_DS_PIPEB_CRT_EN (1<<8) 574*4882a593Smuzhiyun #define SWF14_DS_PIPEA_LFP2_EN (1<<7) 575*4882a593Smuzhiyun #define SWF14_DS_PIPEA_EFP2_EN (1<<6) 576*4882a593Smuzhiyun #define SWF14_DS_PIPEA_TV2_EN (1<<5) 577*4882a593Smuzhiyun #define SWF14_DS_PIPEA_CRT2_EN (1<<4) 578*4882a593Smuzhiyun #define SWF14_DS_PIPEA_LFP_EN (1<<3) 579*4882a593Smuzhiyun #define SWF14_DS_PIPEA_EFP_EN (1<<2) 580*4882a593Smuzhiyun #define SWF14_DS_PIPEA_TV_EN (1<<1) 581*4882a593Smuzhiyun #define SWF14_DS_PIPEA_CRT_EN (1<<0) 582*4882a593Smuzhiyun /* if GR18 indicates a panel fitting request */ 583*4882a593Smuzhiyun #define SWF14_PFIT_EN (1<<0) /* 0 means disable */ 584*4882a593Smuzhiyun /* if GR18 indicates an APM change request */ 585*4882a593Smuzhiyun #define SWF14_APM_HIBERNATE 0x4 586*4882a593Smuzhiyun #define SWF14_APM_SUSPEND 0x3 587*4882a593Smuzhiyun #define SWF14_APM_STANDBY 0x1 588*4882a593Smuzhiyun #define SWF14_APM_RESTORE 0x0 589*4882a593Smuzhiyun 590*4882a593Smuzhiyun /* Add the device class for LFP, TV, HDMI */ 591*4882a593Smuzhiyun #define DEVICE_TYPE_INT_LFP 0x1022 592*4882a593Smuzhiyun #define DEVICE_TYPE_INT_TV 0x1009 593*4882a593Smuzhiyun #define DEVICE_TYPE_HDMI 0x60D2 594*4882a593Smuzhiyun #define DEVICE_TYPE_DP 0x68C6 595*4882a593Smuzhiyun #define DEVICE_TYPE_eDP 0x78C6 596*4882a593Smuzhiyun 597*4882a593Smuzhiyun /* define the DVO port for HDMI output type */ 598*4882a593Smuzhiyun #define DVO_B 1 599*4882a593Smuzhiyun #define DVO_C 2 600*4882a593Smuzhiyun #define DVO_D 3 601*4882a593Smuzhiyun 602*4882a593Smuzhiyun /* define the PORT for DP output type */ 603*4882a593Smuzhiyun #define PORT_IDPB 7 604*4882a593Smuzhiyun #define PORT_IDPC 8 605*4882a593Smuzhiyun #define PORT_IDPD 9 606*4882a593Smuzhiyun 607*4882a593Smuzhiyun #endif /* _INTEL_BIOS_H_ */ 608