1fa225cbcSrjs/* 2fa225cbcSrjs * Copyright � 2006 Intel Corporation 3fa225cbcSrjs * 4fa225cbcSrjs * Permission is hereby granted, free of charge, to any person obtaining a 5fa225cbcSrjs * copy of this software and associated documentation files (the "Software"), 6fa225cbcSrjs * to deal in the Software without restriction, including without limitation 7fa225cbcSrjs * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8fa225cbcSrjs * and/or sell copies of the Software, and to permit persons to whom the 9fa225cbcSrjs * Software is furnished to do so, subject to the following conditions: 10fa225cbcSrjs * 11fa225cbcSrjs * The above copyright notice and this permission notice (including the next 12fa225cbcSrjs * paragraph) shall be included in all copies or substantial portions of the 13fa225cbcSrjs * Software. 14fa225cbcSrjs * 15fa225cbcSrjs * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16fa225cbcSrjs * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17fa225cbcSrjs * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18fa225cbcSrjs * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19fa225cbcSrjs * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20fa225cbcSrjs * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21fa225cbcSrjs * SOFTWARE. 22fa225cbcSrjs * 23fa225cbcSrjs * Authors: 24fa225cbcSrjs * Eric Anholt <eric@anholt.net> 25fa225cbcSrjs * 26fa225cbcSrjs */ 27fa225cbcSrjs 28fa225cbcSrjs#ifndef _I830_BIOS_H_ 29fa225cbcSrjs#define _I830_BIOS_H_ 30fa225cbcSrjs 31fa225cbcSrjs#include <stdint.h> 32fa225cbcSrjs#ifndef REG_DUMPER 33fa225cbcSrjs#include <xf86str.h> 34fa225cbcSrjs#endif 35fa225cbcSrjs 36fa225cbcSrjsstruct vbt_header { 37fa225cbcSrjs char signature[20]; /**< Always starts with 'VBT$' */ 38fa225cbcSrjs uint16_t version; /**< decimal */ 39fa225cbcSrjs uint16_t header_size; /**< in bytes */ 40fa225cbcSrjs uint16_t vbt_size; /**< in bytes */ 41fa225cbcSrjs uint8_t vbt_checksum; 42fa225cbcSrjs uint8_t reserved0; 43fa225cbcSrjs uint32_t bdb_offset; /**< from beginning of VBT */ 44fa225cbcSrjs uint32_t aim_offset[4]; /**< from beginning of VBT */ 45fa225cbcSrjs} __attribute__((packed)); 46fa225cbcSrjs 47fa225cbcSrjsstruct bdb_header { 48fa225cbcSrjs char signature[16]; /**< Always 'BIOS_DATA_BLOCK' */ 49fa225cbcSrjs uint16_t version; /**< decimal */ 50fa225cbcSrjs uint16_t header_size; /**< in bytes */ 51fa225cbcSrjs uint16_t bdb_size; /**< in bytes */ 52fa225cbcSrjs} __attribute__((packed)); 53fa225cbcSrjs 54fa225cbcSrjs/* 55fa225cbcSrjs * There are several types of BIOS data blocks (BDBs), each block has 56fa225cbcSrjs * an ID and size in the first 3 bytes (ID in first, size in next 2). 57fa225cbcSrjs * Known types are listed below. 58fa225cbcSrjs */ 59fa225cbcSrjs#define BDB_GENERAL_FEATURES 1 60fa225cbcSrjs#define BDB_GENERAL_DEFINITIONS 2 61fa225cbcSrjs#define BDB_OLD_TOGGLE_LIST 3 62fa225cbcSrjs#define BDB_MODE_SUPPORT_LIST 4 63fa225cbcSrjs#define BDB_GENERIC_MODE_TABLE 5 64fa225cbcSrjs#define BDB_EXT_MMIO_REGS 6 65fa225cbcSrjs#define BDB_SWF_IO 7 66fa225cbcSrjs#define BDB_SWF_MMIO 8 67fa225cbcSrjs#define BDB_DOT_CLOCK_TABLE 9 68fa225cbcSrjs#define BDB_MODE_REMOVAL_TABLE 10 69fa225cbcSrjs#define BDB_CHILD_DEVICE_TABLE 11 70fa225cbcSrjs#define BDB_DRIVER_FEATURES 12 71fa225cbcSrjs#define BDB_DRIVER_PERSISTENCE 13 72fa225cbcSrjs#define BDB_EXT_TABLE_PTRS 14 73fa225cbcSrjs#define BDB_DOT_CLOCK_OVERRIDE 15 74fa225cbcSrjs#define BDB_DISPLAY_SELECT 16 75fa225cbcSrjs/* 17 rsvd */ 76fa225cbcSrjs#define BDB_DRIVER_ROTATION 18 77fa225cbcSrjs#define BDB_DISPLAY_REMOVE 19 78fa225cbcSrjs#define BDB_OEM_CUSTOM 20 79fa225cbcSrjs#define BDB_EFP_LIST 21 /* workarounds for VGA hsync/vsync */ 80fa225cbcSrjs#define BDB_SDVO_LVDS_OPTIONS 22 81fa225cbcSrjs#define BDB_SDVO_PANEL_DTDS 23 82fa225cbcSrjs#define BDB_SDVO_LVDS_PNP_IDS 24 83fa225cbcSrjs#define BDB_SDVO_LVDS_POWER_SEQ 25 84fa225cbcSrjs#define BDB_TV_OPTIONS 26 85fa225cbcSrjs#define BDB_LVDS_OPTIONS 40 86fa225cbcSrjs#define BDB_LVDS_LFP_DATA_PTRS 41 87fa225cbcSrjs#define BDB_LVDS_LFP_DATA 42 88fa225cbcSrjs#define BDB_LVDS_BACKLIGHT 43 89fa225cbcSrjs#define BDB_LVDS_POWER 44 90fa225cbcSrjs#define BDB_SKIP 254 /* VBIOS private block, ignore */ 91fa225cbcSrjs 92fa225cbcSrjsstruct bdb_general_features { 93fa225cbcSrjs /* bits 1 */ 94fa225cbcSrjs unsigned char panel_fitting:2; 95fa225cbcSrjs unsigned char flexaim:1; 96fa225cbcSrjs unsigned char msg_enable:1; 97fa225cbcSrjs unsigned char clear_screen:3; 98fa225cbcSrjs unsigned char color_flip:1; 99fa225cbcSrjs 100fa225cbcSrjs /* bits 2 */ 101fa225cbcSrjs unsigned char download_ext_vbt:1; 102fa225cbcSrjs unsigned char enable_ssc:1; 103fa225cbcSrjs unsigned char ssc_freq:1; 104fa225cbcSrjs unsigned char enable_lfp_on_override:1; 105fa225cbcSrjs unsigned char disable_ssc_ddt:1; 106fa225cbcSrjs unsigned char rsvd8:3; /* finish byte */ 107fa225cbcSrjs 108fa225cbcSrjs /* bits 3 */ 109fa225cbcSrjs unsigned char disable_smooth_vision:1; 110fa225cbcSrjs unsigned char single_dvi:1; 111fa225cbcSrjs unsigned char rsvd9:6; /* finish byte */ 112fa225cbcSrjs 113fa225cbcSrjs /* bits 4 */ 114fa225cbcSrjs unsigned char legacy_monitor_detect; 115fa225cbcSrjs 116fa225cbcSrjs /* bits 5 */ 117fa225cbcSrjs unsigned char int_crt_support:1; 118fa225cbcSrjs unsigned char int_tv_support:1; 119fa225cbcSrjs unsigned char rsvd11:6; /* finish byte */ 120fa225cbcSrjs} __attribute__((packed)); 121fa225cbcSrjs 122fa225cbcSrjs#define GPIO_PIN_NONE 0x00 /* "N/A" */ 123fa225cbcSrjs#define GPIO_PIN_I2C 0x01 /* "I2C GPIO pins" */ 124fa225cbcSrjs#define GPIO_PIN_CRT_DDC 0x02 /* "Analog CRT DDC GPIO pins" */ 125fa225cbcSrjs/* 915+ */ 126fa225cbcSrjs#define GPIO_PIN_LVDS 0x03 /* "Integrated LVDS DDC GPIO pins" */ 127fa225cbcSrjs#define GPIO_PIN_SDVO_I2C 0x05 /* "sDVO I2C GPIO pins" */ 128fa225cbcSrjs#define GPIO_PIN_SDVO_DDC1 0x1D /* "SDVO DDC1 GPIO pins" */ 129fa225cbcSrjs#define GPIO_PIN_SDVO_DDC2 0x2D /* "SDVO DDC2 GPIO pins" */ 130fa225cbcSrjs/* pre-915 */ 131fa225cbcSrjs#define GPIO_PIN_DVI_LVDS 0x03 /* "DVI/LVDS DDC GPIO pins" */ 132fa225cbcSrjs#define GPIO_PIN_ADD_I2C 0x05 /* "ADDCARD I2C GPIO pins" */ 133fa225cbcSrjs#define GPIO_PIN_ADD_DDC 0x04 /* "ADDCARD DDC GPIO pins" */ 134fa225cbcSrjs#define GPIO_PIN_ADD_DDC_I2C 0x06 /* "ADDCARD DDC/I2C GPIO pins" */ 135fa225cbcSrjs 136fa225cbcSrjs/* Pre 915 */ 137fa225cbcSrjs#define DEVICE_TYPE_NONE 0x00 138fa225cbcSrjs#define DEVICE_TYPE_CRT 0x01 139fa225cbcSrjs#define DEVICE_TYPE_TV 0x09 140fa225cbcSrjs#define DEVICE_TYPE_EFP 0x12 141fa225cbcSrjs#define DEVICE_TYPE_LFP 0x22 142fa225cbcSrjs/* On 915+ */ 143fa225cbcSrjs#define DEVICE_TYPE_CRT_DPMS 0x6001 144fa225cbcSrjs#define DEVICE_TYPE_CRT_DPMS_HOTPLUG 0x4001 145fa225cbcSrjs#define DEVICE_TYPE_TV_COMPOSITE 0x0209 146fa225cbcSrjs#define DEVICE_TYPE_TV_MACROVISION 0x0289 147fa225cbcSrjs#define DEVICE_TYPE_TV_RF_COMPOSITE 0x020c 148fa225cbcSrjs#define DEVICE_TYPE_TV_SVIDEO_COMPOSITE 0x0609 149fa225cbcSrjs#define DEVICE_TYPE_TV_SCART 0x0209 150fa225cbcSrjs#define DEVICE_TYPE_TV_CODEC_HOTPLUG_PWR 0x6009 151fa225cbcSrjs#define DEVICE_TYPE_EFP_HOTPLUG_PWR 0x6012 152fa225cbcSrjs#define DEVICE_TYPE_EFP_DVI_HOTPLUG_PWR 0x6052 153fa225cbcSrjs#define DEVICE_TYPE_EFP_DVI_I 0x6053 154fa225cbcSrjs#define DEVICE_TYPE_EFP_DVI_D_DUAL 0x6152 155fa225cbcSrjs#define DEVICE_TYPE_EFP_DVI_D_HDCP 0x60d2 156fa225cbcSrjs#define DEVICE_TYPE_OPENLDI_HOTPLUG_PWR 0x6062 157fa225cbcSrjs#define DEVICE_TYPE_OPENLDI_DUALPIX 0x6162 158fa225cbcSrjs#define DEVICE_TYPE_LFP_PANELLINK 0x5012 159fa225cbcSrjs#define DEVICE_TYPE_LFP_CMOS_PWR 0x5042 160fa225cbcSrjs#define DEVICE_TYPE_LFP_LVDS_PWR 0x5062 161fa225cbcSrjs#define DEVICE_TYPE_LFP_LVDS_DUAL 0x5162 162fa225cbcSrjs#define DEVICE_TYPE_LFP_LVDS_DUAL_HDCP 0x51e2 163fa225cbcSrjs 164fa225cbcSrjs#define DEVICE_CFG_NONE 0x00 165fa225cbcSrjs#define DEVICE_CFG_12BIT_DVOB 0x01 166fa225cbcSrjs#define DEVICE_CFG_12BIT_DVOC 0x02 167fa225cbcSrjs#define DEVICE_CFG_24BIT_DVOBC 0x09 168fa225cbcSrjs#define DEVICE_CFG_24BIT_DVOCB 0x0a 169fa225cbcSrjs#define DEVICE_CFG_DUAL_DVOB 0x11 170fa225cbcSrjs#define DEVICE_CFG_DUAL_DVOC 0x12 171fa225cbcSrjs#define DEVICE_CFG_DUAL_DVOBC 0x13 172fa225cbcSrjs#define DEVICE_CFG_DUAL_LINK_DVOBC 0x19 173fa225cbcSrjs#define DEVICE_CFG_DUAL_LINK_DVOCB 0x1a 174fa225cbcSrjs 175fa225cbcSrjs#define DEVICE_WIRE_NONE 0x00 176fa225cbcSrjs#define DEVICE_WIRE_DVOB 0x01 177fa225cbcSrjs#define DEVICE_WIRE_DVOC 0x02 178fa225cbcSrjs#define DEVICE_WIRE_DVOBC 0x03 179fa225cbcSrjs#define DEVICE_WIRE_DVOBB 0x05 180fa225cbcSrjs#define DEVICE_WIRE_DVOCC 0x06 181fa225cbcSrjs#define DEVICE_WIRE_DVOB_MASTER 0x0d 182fa225cbcSrjs#define DEVICE_WIRE_DVOC_MASTER 0x0e 183fa225cbcSrjs 184fa225cbcSrjs#define DEVICE_PORT_DVOA 0x00 /* none on 845+ */ 185fa225cbcSrjs#define DEVICE_PORT_DVOB 0x01 186fa225cbcSrjs#define DEVICE_PORT_DVOC 0x02 187fa225cbcSrjs 188fa225cbcSrjsstruct child_device_config { 189fa225cbcSrjs uint16_t handle; 190fa225cbcSrjs uint16_t device_type; /* See DEVICE_TYPE_* above */ 191fa225cbcSrjs uint8_t device_id[10]; 192fa225cbcSrjs uint16_t addin_offset; 193fa225cbcSrjs uint8_t dvo_port; /* See DEVICE_PORT_* above */ 194fa225cbcSrjs uint8_t i2c_pin; 195fa225cbcSrjs uint8_t slave_addr; 196fa225cbcSrjs uint8_t ddc_pin; 197fa225cbcSrjs uint16_t edid_ptr; 198fa225cbcSrjs uint8_t dvo_cfg; /* See DEVICE_CFG_* above */ 199fa225cbcSrjs uint8_t dvo2_port; 200fa225cbcSrjs uint8_t i2c2_pin; 201fa225cbcSrjs uint8_t slave2_addr; 202fa225cbcSrjs uint8_t ddc2_pin; 203fa225cbcSrjs uint8_t capabilities; 204fa225cbcSrjs uint8_t dvo_wiring; /* See DEVICE_WIRE_* above */ 205fa225cbcSrjs uint8_t dvo2_wiring; 206fa225cbcSrjs uint16_t extended_type; 207fa225cbcSrjs uint8_t dvo_function; 208fa225cbcSrjs} __attribute__((packed)); 209fa225cbcSrjs 210fa225cbcSrjsstruct bdb_general_definitions { 211fa225cbcSrjs unsigned char crt_ddc_gmbus_pin; /* see GPIO_PIN_* above */ 212fa225cbcSrjs 213fa225cbcSrjs /* DPMS bits */ 214fa225cbcSrjs unsigned char dpms_acpi:1; 215fa225cbcSrjs unsigned char skip_boot_crt_detect:1; 216fa225cbcSrjs unsigned char dpms_aim:1; 217fa225cbcSrjs unsigned char rsvd1:5; /* finish byte */ 218fa225cbcSrjs 219fa225cbcSrjs /* boot device bits */ 220fa225cbcSrjs unsigned char boot_display[2]; 221fa225cbcSrjs unsigned char child_dev_size; 222fa225cbcSrjs 223fa225cbcSrjs /* 224fa225cbcSrjs * Device info: 225fa225cbcSrjs * If TV is present, it'll be at devices[0] 226fa225cbcSrjs * LVDS will be next, either devices[0] or [1], if present 227fa225cbcSrjs * Max total will be 6, but could be as few as 4 if both 228fa225cbcSrjs * TV and LVDS are missing, so be careful when interpreting 229fa225cbcSrjs * [4] and [5]. 230fa225cbcSrjs */ 231fa225cbcSrjs struct child_device_config devices[0]; 232fa225cbcSrjs /* may be another device block here on some platforms */ 233fa225cbcSrjs} __attribute__((packed)); 234fa225cbcSrjs 235fa225cbcSrjs#define DEVICE_CHILD_SIZE 7 236fa225cbcSrjs 237fa225cbcSrjsstruct bdb_child_devices { 238fa225cbcSrjs uint8_t child_structure_size; 239fa225cbcSrjs struct child_device_config children[DEVICE_CHILD_SIZE]; 240fa225cbcSrjs} __attribute__((packed)); 241fa225cbcSrjs 242fa225cbcSrjsstruct bdb_lvds_options { 243fa225cbcSrjs uint8_t panel_type; 244fa225cbcSrjs uint8_t rsvd1; 245fa225cbcSrjs /* LVDS capabilities, stored in a dword */ 246fa225cbcSrjs uint8_t pfit_mode:2; 247fa225cbcSrjs uint8_t pfit_text_mode_enhanced:1; 248fa225cbcSrjs uint8_t pfit_gfx_mode_enhanced:1; 249fa225cbcSrjs uint8_t pfit_ratio_auto:1; 250fa225cbcSrjs uint8_t pixel_dither:1; 251fa225cbcSrjs uint8_t lvds_edid:1; 252fa225cbcSrjs uint8_t rsvd2:1; 253fa225cbcSrjs uint8_t rsvd4; 254fa225cbcSrjs} __attribute__((packed)); 255fa225cbcSrjs 256fa225cbcSrjs/* 915+ only */ 257fa225cbcSrjsstruct bdb_tv_features { 258fa225cbcSrjs /* need to verify bit ordering */ 259fa225cbcSrjs uint16_t under_over_scan_via_yprpb:2; 260fa225cbcSrjs uint16_t rsvd1:10; 261fa225cbcSrjs uint16_t under_over_scan_via_dvi:2; 262fa225cbcSrjs uint16_t add_overscan_mode:1; 263fa225cbcSrjs uint16_t rsvd2:1; 264fa225cbcSrjs} __attribute__((packed)); 265fa225cbcSrjs 266fa225cbcSrjsstruct lvds_fp_timing { 267fa225cbcSrjs uint16_t x_res; 268fa225cbcSrjs uint16_t y_res; 269fa225cbcSrjs uint32_t lvds_reg; 270fa225cbcSrjs uint32_t lvds_reg_val; 271fa225cbcSrjs uint32_t pp_on_reg; 272fa225cbcSrjs uint32_t pp_on_reg_val; 273fa225cbcSrjs uint32_t pp_off_reg; 274fa225cbcSrjs uint32_t pp_off_reg_val; 275fa225cbcSrjs uint32_t pp_cycle_reg; 276fa225cbcSrjs uint32_t pp_cycle_reg_val; 277fa225cbcSrjs uint32_t pfit_reg; 278fa225cbcSrjs uint32_t pfit_reg_val; 279fa225cbcSrjs uint16_t terminator; 280fa225cbcSrjs} __attribute__((packed)); 281fa225cbcSrjs 282fa225cbcSrjsstruct lvds_dvo_timing { 283fa225cbcSrjs uint16_t dclk; /**< In 10khz */ 284fa225cbcSrjs uint8_t hactive; 285fa225cbcSrjs uint8_t hblank; 286fa225cbcSrjs uint8_t high_h; /**< 7:4 = hactive 11:8, 3:0 = hblank 11:8 */ 287fa225cbcSrjs uint8_t vactive; 288fa225cbcSrjs uint8_t vblank; 289fa225cbcSrjs uint8_t high_v; /**< 7:4 = vactive 11:8, 3:0 = vblank 11:8 */ 290fa225cbcSrjs uint8_t hsync_off; 291fa225cbcSrjs uint8_t hsync_pulse_width; 292fa225cbcSrjs uint8_t vsync_off; 293fa225cbcSrjs uint8_t high_hsync_off; /**< 7:6 = hsync off 9:8 */ 294fa225cbcSrjs uint8_t h_image; 295fa225cbcSrjs uint8_t v_image; 296fa225cbcSrjs uint8_t max_hv; 297fa225cbcSrjs uint8_t h_border; 298fa225cbcSrjs uint8_t v_border; 299fa225cbcSrjs uint8_t flags; 300fa225cbcSrjs} __attribute__((packed)); 301fa225cbcSrjs 302fa225cbcSrjsstruct lvds_pnp_id { 303fa225cbcSrjs uint16_t mfg_name; 304fa225cbcSrjs uint16_t product_code; 305fa225cbcSrjs uint32_t serial; 306fa225cbcSrjs uint8_t mfg_week; 307fa225cbcSrjs uint8_t mfg_year; 308fa225cbcSrjs} __attribute__((packed));; 309fa225cbcSrjs 310fa225cbcSrjs/* LFP pointer table contains entries to the struct below */ 311fa225cbcSrjsstruct bdb_lvds_lfp_data_ptr { 312fa225cbcSrjs uint16_t fp_timing_offset; /* offsets are from start of bdb */ 313fa225cbcSrjs uint8_t fp_table_size; 314fa225cbcSrjs uint16_t dvo_timing_offset; 315fa225cbcSrjs uint8_t dvo_table_size; 316fa225cbcSrjs uint16_t panel_pnp_id_offset; 317fa225cbcSrjs uint8_t pnp_table_size; 318fa225cbcSrjs} __attribute__((packed)); 319fa225cbcSrjs 320fa225cbcSrjsstruct bdb_lvds_lfp_data_ptrs { 321fa225cbcSrjs uint8_t lvds_entries; 322fa225cbcSrjs struct bdb_lvds_lfp_data_ptr ptr[16]; 323fa225cbcSrjs} __attribute__((packed)); 324fa225cbcSrjs 325fa225cbcSrjsstruct bdb_lvds_lfp_data_entry { 326fa225cbcSrjs struct lvds_fp_timing fp_timing; 327fa225cbcSrjs struct lvds_dvo_timing dvo_timing; 328fa225cbcSrjs struct lvds_pnp_id pnp_id; 329fa225cbcSrjs} __attribute__((packed)); 330fa225cbcSrjs 331fa225cbcSrjsstruct bdb_lvds_lfp_data { 332fa225cbcSrjs struct bdb_lvds_lfp_data_entry data[16]; 333fa225cbcSrjs} __attribute__((packed)); 334fa225cbcSrjs 335fa225cbcSrjs#define BACKLIGHT_TYPE_NONE 0 336fa225cbcSrjs#define BACKLIGHT_TYPE_I2C 1 337fa225cbcSrjs#define BACKLIGHT_TYPE_PWM 2 338fa225cbcSrjs 339fa225cbcSrjs#define BACKLIGHT_GMBUS_100KHZ 0 340fa225cbcSrjs#define BACKLIGHT_GMBUS_50KHZ 1 341fa225cbcSrjs#define BACKLIGHT_GMBUS_400KHZ 2 342fa225cbcSrjs#define BACKLIGHT_GMBUS_1MHZ 3 343fa225cbcSrjs 344fa225cbcSrjsstruct backlight_info { 345fa225cbcSrjs uint8_t inverter_type:2; /* see BACKLIGHT_TYPE_* above */ 346fa225cbcSrjs uint8_t inverter_polarity:1; /* 1 means 0 is max, 255 is min */ 347fa225cbcSrjs uint8_t gpio_pins:3; /* see GPIO_PIN_* above */ 348fa225cbcSrjs uint8_t gmbus_speed:2; 349fa225cbcSrjs uint16_t pwm_frequency; /* in Hz */ 350fa225cbcSrjs uint8_t min_brightness; 351fa225cbcSrjs /* Next two are only for 915+ systems */ 352fa225cbcSrjs uint8_t i2c_addr; 353fa225cbcSrjs uint8_t i2c_cmd; 354fa225cbcSrjs} __attribute((packed)); 355fa225cbcSrjs 356fa225cbcSrjsstruct bdb_backlight_control { 357fa225cbcSrjs uint8_t row_size; 358fa225cbcSrjs struct backlight_info lfps[16]; 359fa225cbcSrjs} __attribute__((packed)); 360fa225cbcSrjs 361fa225cbcSrjsstruct bdb_bia { 362fa225cbcSrjs uint8_t bia_enable:1; 363fa225cbcSrjs uint8_t bia_level:3; 364fa225cbcSrjs uint8_t rsvd1:3; 365fa225cbcSrjs uint8_t als_enable:1; 366fa225cbcSrjs uint8_t als_response_data[20]; 367fa225cbcSrjs} __attribute((packed)); 368fa225cbcSrjs 369fa225cbcSrjsstruct aimdb_header { 370fa225cbcSrjs char signature[16]; 371fa225cbcSrjs char oem_device[20]; 372fa225cbcSrjs uint16_t aimdb_version; 373fa225cbcSrjs uint16_t aimdb_header_size; 374fa225cbcSrjs uint16_t aimdb_size; 375fa225cbcSrjs} __attribute__((packed)); 376fa225cbcSrjs 377fa225cbcSrjsstruct aimdb_block { 378fa225cbcSrjs uint8_t aimdb_id; 379fa225cbcSrjs uint16_t aimdb_size; 380fa225cbcSrjs} __attribute__((packed)); 381fa225cbcSrjs 382fa225cbcSrjsstruct vch_panel_data { 383fa225cbcSrjs uint16_t fp_timing_offset; 384fa225cbcSrjs uint8_t fp_timing_size; 385fa225cbcSrjs uint16_t dvo_timing_offset; 386fa225cbcSrjs uint8_t dvo_timing_size; 387fa225cbcSrjs uint16_t text_fitting_offset; 388fa225cbcSrjs uint8_t text_fitting_size; 389fa225cbcSrjs uint16_t graphics_fitting_offset; 390fa225cbcSrjs uint8_t graphics_fitting_size; 391fa225cbcSrjs} __attribute__((packed)); 392fa225cbcSrjs 393fa225cbcSrjsstruct vch_bdb_22 { 394fa225cbcSrjs struct aimdb_block aimdb_block; 395fa225cbcSrjs struct vch_panel_data panels[16]; 396fa225cbcSrjs} __attribute__((packed)); 397fa225cbcSrjs 398fa225cbcSrjs#define BLC_INVERTER_TYPE_NONE 0 399fa225cbcSrjs#define BLC_INVERTER_TYPE_I2C 1 400fa225cbcSrjs#define BLC_INVERTER_TYPE_PWM 2 401fa225cbcSrjs 402fa225cbcSrjs#define BLC_GPIO_NONE 0 403fa225cbcSrjs#define BLC_GPIO_I2C 1 404fa225cbcSrjs#define BLC_GPIO_CRT_DDC 2 405fa225cbcSrjs#define BLC_GPIO_DVI_DDC 3 406fa225cbcSrjs#define BLC_GPIO_SDVO_I2C 5 407fa225cbcSrjs 408fa225cbcSrjsstruct blc_struct { 409fa225cbcSrjs uint8_t inverter_type:2; 410fa225cbcSrjs uint8_t inverter_polarity:1; /* 1 means inverted (0 = max brightness) */ 411fa225cbcSrjs uint8_t gpio_pins:3; 412fa225cbcSrjs uint8_t gmbus_speed:2; 413fa225cbcSrjs uint16_t pwm_freq; /* in Hz */ 414fa225cbcSrjs uint8_t min_brightness; /* (0-255) */ 415fa225cbcSrjs uint8_t i2c_slave_addr; 416fa225cbcSrjs uint8_t i2c_cmd; 417fa225cbcSrjs} __attribute__((packed)); 418fa225cbcSrjs 419fa225cbcSrjsstruct bdb_lvds_backlight { 420fa225cbcSrjs uint8_t blcstruct_size; 421fa225cbcSrjs struct blc_struct panels[16]; 422fa225cbcSrjs} __attribute__((packed)); 423fa225cbcSrjs 424fa225cbcSrjsstruct bdb_lvds_power { 425fa225cbcSrjs uint8_t dpst_enabled:1; 426fa225cbcSrjs uint8_t pwr_prefs:3; 427fa225cbcSrjs uint8_t rsvd1:3; 428fa225cbcSrjs uint8_t als_enabled:1; 429fa225cbcSrjs uint16_t als_backlight1; 430fa225cbcSrjs uint16_t als_backlight2; 431fa225cbcSrjs uint16_t als_backlight3; 432fa225cbcSrjs uint16_t als_backlight4; 433fa225cbcSrjs uint16_t als_backlight5; 434fa225cbcSrjs} __attribute__((packed)); 435fa225cbcSrjs 436fa225cbcSrjs#define BDB_DRIVER_NO_LVDS 0 437fa225cbcSrjs#define BDB_DRIVER_INT_LVDS 1 438fa225cbcSrjs#define BDB_DRIVER_SDVO_LVDS 2 439fa225cbcSrjs#define BDB_DRIVER_EDP 3 440fa225cbcSrjs 441fa225cbcSrjsstruct bdb_driver_feature { 442fa225cbcSrjs uint8_t boot_dev_algorithm:1; 443fa225cbcSrjs uint8_t block_display_switch:1; 444fa225cbcSrjs uint8_t allow_display_switch:1; 445fa225cbcSrjs uint8_t hotplug_dvo:1; 446fa225cbcSrjs uint8_t dual_view_zoom:1; 447fa225cbcSrjs uint8_t int15h_hook:1; 448fa225cbcSrjs uint8_t sprite_in_clone:1; 449fa225cbcSrjs uint8_t primary_lfp_id:1; 450fa225cbcSrjs 451fa225cbcSrjs uint16_t boot_mode_x; 452fa225cbcSrjs uint16_t boot_mode_y; 453fa225cbcSrjs uint8_t boot_mode_bpp; 454fa225cbcSrjs uint8_t boot_mode_refresh; 455fa225cbcSrjs 456fa225cbcSrjs uint16_t enable_lfp_primary:1; 457fa225cbcSrjs uint16_t selective_mode_pruning:1; 458fa225cbcSrjs uint16_t dual_frequency:1; 459fa225cbcSrjs uint16_t render_clock_freq:1; /* 0: high freq; 1: low freq */ 460fa225cbcSrjs uint16_t nt_clone_support:1; 461fa225cbcSrjs uint16_t power_scheme_ui:1; /* 0: CUI; 1: 3rd party */ 462fa225cbcSrjs uint16_t sprite_display_assign:1; /* 0: secondary; 1: primary */ 463fa225cbcSrjs uint16_t cui_aspect_scaling:1; 464fa225cbcSrjs uint16_t preserve_aspect_ratio:1; 465fa225cbcSrjs uint16_t sdvo_device_power_down:1; 466fa225cbcSrjs uint16_t crt_hotplug:1; 467fa225cbcSrjs uint16_t lvds_config:2; 468fa225cbcSrjs uint16_t reserved:3; 469fa225cbcSrjs 470fa225cbcSrjs uint8_t static_display:1; 471fa225cbcSrjs uint8_t reserved2:7; 472fa225cbcSrjs uint16_t legacy_crt_max_x; 473fa225cbcSrjs uint16_t legacy_crt_max_y; 474fa225cbcSrjs uint8_t legacy_crt_max_refresh; 475fa225cbcSrjs} __attribute__((packed)); 476fa225cbcSrjs 477fa225cbcSrjsstruct bdb_sdvo_lvds_options { 478fa225cbcSrjs uint8_t panel_backlight; 479fa225cbcSrjs uint8_t h40_set_panel_type; 480fa225cbcSrjs uint8_t panel_type; 481fa225cbcSrjs uint8_t ssc_clk_freq; 482fa225cbcSrjs uint16_t als_low_trip; 483fa225cbcSrjs uint16_t als_high_trip; 484fa225cbcSrjs uint8_t sclalarcoeff_tab_row_num; 485fa225cbcSrjs uint8_t sclalarcoeff_tab_row_size; 486fa225cbcSrjs uint8_t coefficient[8]; 487fa225cbcSrjs uint8_t panel_misc_bits_1; 488fa225cbcSrjs uint8_t panel_misc_bits_2; 489fa225cbcSrjs uint8_t panel_misc_bits_3; 490fa225cbcSrjs uint8_t panel_misc_bits_4; 491fa225cbcSrjs} __attribute__((packed)); 492fa225cbcSrjs 493fa225cbcSrjs 494fa225cbcSrjs#ifndef REG_DUMPER 495fa225cbcSrjsint i830_bios_init(ScrnInfoPtr pScrn); 496fa225cbcSrjs#endif 497fa225cbcSrjs 498fa225cbcSrjs/* 499fa225cbcSrjs * Driver<->VBIOS interaction occurs through scratch bits in 500fa225cbcSrjs * GR18 & SWF*. 501fa225cbcSrjs * 502fa225cbcSrjs * The VBIOS/firmware will signal to the gfx driver through the ASLE interrupt 503fa225cbcSrjs * (visible in the interupt regs at bit 0) when it wants something done. 504fa225cbcSrjs * 505fa225cbcSrjs * Pre-965: 506fa225cbcSrjs * The gfx driver can make calls to the VBIOS/firmware through an SMI request, 507fa225cbcSrjs * generated by writing to offset 0xe0 of the device's config space (see the 508fa225cbcSrjs * publically available 915 PRM for details). 509fa225cbcSrjs * 510fa225cbcSrjs * 965 and above: 511fa225cbcSrjs * IGD OpRegion requests to the VBIOS/firmware are made using SWSCI, which can 512fa225cbcSrjs * be triggered by writing to offset 0xe4 (see the publically available 513fa225cbcSrjs * 965 graphics PRM for details). 514fa225cbcSrjs */ 515fa225cbcSrjs 516fa225cbcSrjs/* GR18 bits are set on display switch and hotkey events */ 517fa225cbcSrjs#define GR18_DRIVER_SWITCH_EN (1<<7) /* 0: VBIOS control, 1: driver control */ 518fa225cbcSrjs#define GR18_HOTKEY_MASK 0x78 /* See also SWF4 15:0 */ 519fa225cbcSrjs#define GR18_HK_NONE (0x0<<3) 520fa225cbcSrjs#define GR18_HK_LFP_STRETCH (0x1<<3) 521fa225cbcSrjs#define GR18_HK_TOGGLE_DISP (0x2<<3) 522fa225cbcSrjs#define GR18_HK_DISP_SWITCH (0x4<<3) /* see SWF14 15:0 for what to enable */ 523fa225cbcSrjs#define GR18_HK_POPUP_DISABLED (0x6<<3) 524fa225cbcSrjs#define GR18_HK_POPUP_ENABLED (0x7<<3) 525fa225cbcSrjs#define GR18_HK_PFIT (0x8<<3) 526fa225cbcSrjs#define GR18_HK_APM_CHANGE (0xa<<3) 527fa225cbcSrjs#define GR18_HK_MULTIPLE (0xc<<3) 528fa225cbcSrjs#define GR18_USER_INT_EN (1<<2) 529fa225cbcSrjs#define GR18_A0000_FLUSH_EN (1<<1) 530fa225cbcSrjs#define GR18_SMM_EN (1<<0) 531fa225cbcSrjs 532fa225cbcSrjs/* Set by driver, cleared by VBIOS */ 533fa225cbcSrjs#define SWF00_YRES_SHIFT 16 534fa225cbcSrjs#define SWF00_XRES_SHIFT 0 535fa225cbcSrjs#define SWF00_RES_MASK 0xffff 536fa225cbcSrjs 537fa225cbcSrjs/* Set by VBIOS at boot time and driver at runtime */ 538fa225cbcSrjs#define SWF01_TV2_FORMAT_SHIFT 8 539fa225cbcSrjs#define SWF01_TV1_FORMAT_SHIFT 0 540fa225cbcSrjs#define SWF01_TV_FORMAT_MASK 0xffff 541fa225cbcSrjs 542fa225cbcSrjs#define SWF10_VBIOS_BLC_I2C_EN (1<<29) 543fa225cbcSrjs#define SWF10_GTT_OVERRIDE_EN (1<<28) 544fa225cbcSrjs#define SWF10_LFP_DPMS_OVR (1<<27) /* override DPMS on display switch */ 545fa225cbcSrjs#define SWF10_ACTIVE_TOGGLE_LIST_MASK (7<<24) 546fa225cbcSrjs#define SWF10_OLD_TOGGLE 0x0 547fa225cbcSrjs#define SWF10_TOGGLE_LIST_1 0x1 548fa225cbcSrjs#define SWF10_TOGGLE_LIST_2 0x2 549fa225cbcSrjs#define SWF10_TOGGLE_LIST_3 0x3 550fa225cbcSrjs#define SWF10_TOGGLE_LIST_4 0x4 551fa225cbcSrjs#define SWF10_PANNING_EN (1<<23) 552fa225cbcSrjs#define SWF10_DRIVER_LOADED (1<<22) 553fa225cbcSrjs#define SWF10_EXTENDED_DESKTOP (1<<21) 554fa225cbcSrjs#define SWF10_EXCLUSIVE_MODE (1<<20) 555fa225cbcSrjs#define SWF10_OVERLAY_EN (1<<19) 556fa225cbcSrjs#define SWF10_PLANEB_HOLDOFF (1<<18) 557fa225cbcSrjs#define SWF10_PLANEA_HOLDOFF (1<<17) 558fa225cbcSrjs#define SWF10_VGA_HOLDOFF (1<<16) 559fa225cbcSrjs#define SWF10_ACTIVE_DISP_MASK 0xffff 560fa225cbcSrjs#define SWF10_PIPEB_LFP2 (1<<15) 561fa225cbcSrjs#define SWF10_PIPEB_EFP2 (1<<14) 562fa225cbcSrjs#define SWF10_PIPEB_TV2 (1<<13) 563fa225cbcSrjs#define SWF10_PIPEB_CRT2 (1<<12) 564fa225cbcSrjs#define SWF10_PIPEB_LFP (1<<11) 565fa225cbcSrjs#define SWF10_PIPEB_EFP (1<<10) 566fa225cbcSrjs#define SWF10_PIPEB_TV (1<<9) 567fa225cbcSrjs#define SWF10_PIPEB_CRT (1<<8) 568fa225cbcSrjs#define SWF10_PIPEA_LFP2 (1<<7) 569fa225cbcSrjs#define SWF10_PIPEA_EFP2 (1<<6) 570fa225cbcSrjs#define SWF10_PIPEA_TV2 (1<<5) 571fa225cbcSrjs#define SWF10_PIPEA_CRT2 (1<<4) 572fa225cbcSrjs#define SWF10_PIPEA_LFP (1<<3) 573fa225cbcSrjs#define SWF10_PIPEA_EFP (1<<2) 574fa225cbcSrjs#define SWF10_PIPEA_TV (1<<1) 575fa225cbcSrjs#define SWF10_PIPEA_CRT (1<<0) 576fa225cbcSrjs 577fa225cbcSrjs#define SWF11_MEMORY_SIZE_SHIFT 16 578fa225cbcSrjs#define SWF11_SV_TEST_EN (1<<15) 579fa225cbcSrjs#define SWF11_IS_AGP (1<<14) 580fa225cbcSrjs#define SWF11_DISPLAY_HOLDOFF (1<<13) 581fa225cbcSrjs#define SWF11_DPMS_REDUCED (1<<12) 582fa225cbcSrjs#define SWF11_IS_VBE_MODE (1<<11) 583fa225cbcSrjs#define SWF11_PIPEB_ACCESS (1<<10) /* 0 here means pipe a */ 584fa225cbcSrjs#define SWF11_DPMS_MASK 0x07 585fa225cbcSrjs#define SWF11_DPMS_OFF (1<<2) 586fa225cbcSrjs#define SWF11_DPMS_SUSPEND (1<<1) 587fa225cbcSrjs#define SWF11_DPMS_STANDBY (1<<0) 588fa225cbcSrjs#define SWF11_DPMS_ON 0 589fa225cbcSrjs 590fa225cbcSrjs#define SWF14_GFX_PFIT_EN (1<<31) 591fa225cbcSrjs#define SWF14_TEXT_PFIT_EN (1<<30) 592fa225cbcSrjs#define SWF14_LID_SWITCH_EN (1<<29) 593fa225cbcSrjs#define SWF14_POPUP_EN (1<<28) 594fa225cbcSrjs#define SWF14_DISPLAY_HOLDOFF (1<<27) 595fa225cbcSrjs#define SWF14_DISP_DETECT_EN (1<<26) 596fa225cbcSrjs#define SWF14_DOCKING_STATUS_DOCKED (1<<25) /* 0 here means undocked */ 597fa225cbcSrjs#define SWF14_DRIVER_STATUS (1<<24) 598fa225cbcSrjs#define SWF14_OS_TYPE_WIN9X (1<<23) 599fa225cbcSrjs#define SWF14_OS_TYPE_WINNT (1<<22) 600fa225cbcSrjs/* 21:19 rsvd */ 601fa225cbcSrjs#define SWF14_PM_TYPE_MASK 0x00070000 602fa225cbcSrjs#define SWF14_PM_ACPI_VIDEO (0x4 << 16) 603fa225cbcSrjs#define SWF14_PM_ACPI (0x3 << 16) 604fa225cbcSrjs#define SWF14_PM_APM_12 (0x2 << 16) 605fa225cbcSrjs#define SWF14_PM_APM_11 (0x1 << 16) 606fa225cbcSrjs#define SWF14_HK_REQUEST_MASK 0x0000ffff /* see GR18 6:3 for event type */ 607fa225cbcSrjs /* if GR18 indicates a display switch */ 608fa225cbcSrjs#define SWF14_DS_PIPEB_LFP2_EN (1<<15) 609fa225cbcSrjs#define SWF14_DS_PIPEB_EFP2_EN (1<<14) 610fa225cbcSrjs#define SWF14_DS_PIPEB_TV2_EN (1<<13) 611fa225cbcSrjs#define SWF14_DS_PIPEB_CRT2_EN (1<<12) 612fa225cbcSrjs#define SWF14_DS_PIPEB_LFP_EN (1<<11) 613fa225cbcSrjs#define SWF14_DS_PIPEB_EFP_EN (1<<10) 614fa225cbcSrjs#define SWF14_DS_PIPEB_TV_EN (1<<9) 615fa225cbcSrjs#define SWF14_DS_PIPEB_CRT_EN (1<<8) 616fa225cbcSrjs#define SWF14_DS_PIPEA_LFP2_EN (1<<7) 617fa225cbcSrjs#define SWF14_DS_PIPEA_EFP2_EN (1<<6) 618fa225cbcSrjs#define SWF14_DS_PIPEA_TV2_EN (1<<5) 619fa225cbcSrjs#define SWF14_DS_PIPEA_CRT2_EN (1<<4) 620fa225cbcSrjs#define SWF14_DS_PIPEA_LFP_EN (1<<3) 621fa225cbcSrjs#define SWF14_DS_PIPEA_EFP_EN (1<<2) 622fa225cbcSrjs#define SWF14_DS_PIPEA_TV_EN (1<<1) 623fa225cbcSrjs#define SWF14_DS_PIPEA_CRT_EN (1<<0) 624fa225cbcSrjs /* if GR18 indicates a panel fitting request */ 625fa225cbcSrjs#define SWF14_PFIT_EN (1<<0) /* 0 means disable */ 626fa225cbcSrjs /* if GR18 indicates an APM change request */ 627fa225cbcSrjs#define SWF14_APM_HIBERNATE 0x4 628fa225cbcSrjs#define SWF14_APM_SUSPEND 0x3 629fa225cbcSrjs#define SWF14_APM_STANDBY 0x1 630fa225cbcSrjs#define SWF14_APM_RESTORE 0x0 631fa225cbcSrjs 632fa225cbcSrjs#endif /* _I830_BIOS_H_ */ 633