Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
at v3.15 990 lines 29 kB view raw
1/* 2 * Copyright © 2006 Intel Corporation 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice (including the next 12 * paragraph) shall be included in all copies or substantial portions of the 13 * Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 * SOFTWARE. 22 * 23 * Authors: 24 * Eric Anholt <eric@anholt.net> 25 * 26 */ 27#include <linux/dmi.h> 28#include <drm/drm_dp_helper.h> 29#include <drm/drmP.h> 30#include <drm/i915_drm.h> 31#include "i915_drv.h" 32#include "intel_bios.h" 33 34#define SLAVE_ADDR1 0x70 35#define SLAVE_ADDR2 0x72 36 37static int panel_type; 38 39static void * 40find_section(struct bdb_header *bdb, int section_id) 41{ 42 u8 *base = (u8 *)bdb; 43 int index = 0; 44 u16 total, current_size; 45 u8 current_id; 46 47 /* skip to first section */ 48 index += bdb->header_size; 49 total = bdb->bdb_size; 50 51 /* walk the sections looking for section_id */ 52 while (index < total) { 53 current_id = *(base + index); 54 index++; 55 current_size = *((u16 *)(base + index)); 56 index += 2; 57 if (current_id == section_id) 58 return base + index; 59 index += current_size; 60 } 61 62 return NULL; 63} 64 65static u16 66get_blocksize(void *p) 67{ 68 u16 *block_ptr, block_size; 69 70 block_ptr = (u16 *)((char *)p - 2); 71 block_size = *block_ptr; 72 return block_size; 73} 74 75static void 76fill_detail_timing_data(struct drm_display_mode *panel_fixed_mode, 77 const struct lvds_dvo_timing *dvo_timing) 78{ 79 panel_fixed_mode->hdisplay = (dvo_timing->hactive_hi << 8) | 80 dvo_timing->hactive_lo; 81 panel_fixed_mode->hsync_start = panel_fixed_mode->hdisplay + 82 ((dvo_timing->hsync_off_hi << 8) | dvo_timing->hsync_off_lo); 83 panel_fixed_mode->hsync_end = panel_fixed_mode->hsync_start + 84 dvo_timing->hsync_pulse_width; 85 panel_fixed_mode->htotal = panel_fixed_mode->hdisplay + 86 ((dvo_timing->hblank_hi << 8) | dvo_timing->hblank_lo); 87 88 panel_fixed_mode->vdisplay = (dvo_timing->vactive_hi << 8) | 89 dvo_timing->vactive_lo; 90 panel_fixed_mode->vsync_start = panel_fixed_mode->vdisplay + 91 dvo_timing->vsync_off; 92 panel_fixed_mode->vsync_end = panel_fixed_mode->vsync_start + 93 dvo_timing->vsync_pulse_width; 94 panel_fixed_mode->vtotal = panel_fixed_mode->vdisplay + 95 ((dvo_timing->vblank_hi << 8) | dvo_timing->vblank_lo); 96 panel_fixed_mode->clock = dvo_timing->clock * 10; 97 panel_fixed_mode->type = DRM_MODE_TYPE_PREFERRED; 98 99 if (dvo_timing->hsync_positive) 100 panel_fixed_mode->flags |= DRM_MODE_FLAG_PHSYNC; 101 else 102 panel_fixed_mode->flags |= DRM_MODE_FLAG_NHSYNC; 103 104 if (dvo_timing->vsync_positive) 105 panel_fixed_mode->flags |= DRM_MODE_FLAG_PVSYNC; 106 else 107 panel_fixed_mode->flags |= DRM_MODE_FLAG_NVSYNC; 108 109 /* Some VBTs have bogus h/vtotal values */ 110 if (panel_fixed_mode->hsync_end > panel_fixed_mode->htotal) 111 panel_fixed_mode->htotal = panel_fixed_mode->hsync_end + 1; 112 if (panel_fixed_mode->vsync_end > panel_fixed_mode->vtotal) 113 panel_fixed_mode->vtotal = panel_fixed_mode->vsync_end + 1; 114 115 drm_mode_set_name(panel_fixed_mode); 116} 117 118static bool 119lvds_dvo_timing_equal_size(const struct lvds_dvo_timing *a, 120 const struct lvds_dvo_timing *b) 121{ 122 if (a->hactive_hi != b->hactive_hi || 123 a->hactive_lo != b->hactive_lo) 124 return false; 125 126 if (a->hsync_off_hi != b->hsync_off_hi || 127 a->hsync_off_lo != b->hsync_off_lo) 128 return false; 129 130 if (a->hsync_pulse_width != b->hsync_pulse_width) 131 return false; 132 133 if (a->hblank_hi != b->hblank_hi || 134 a->hblank_lo != b->hblank_lo) 135 return false; 136 137 if (a->vactive_hi != b->vactive_hi || 138 a->vactive_lo != b->vactive_lo) 139 return false; 140 141 if (a->vsync_off != b->vsync_off) 142 return false; 143 144 if (a->vsync_pulse_width != b->vsync_pulse_width) 145 return false; 146 147 if (a->vblank_hi != b->vblank_hi || 148 a->vblank_lo != b->vblank_lo) 149 return false; 150 151 return true; 152} 153 154static const struct lvds_dvo_timing * 155get_lvds_dvo_timing(const struct bdb_lvds_lfp_data *lvds_lfp_data, 156 const struct bdb_lvds_lfp_data_ptrs *lvds_lfp_data_ptrs, 157 int index) 158{ 159 /* 160 * the size of fp_timing varies on the different platform. 161 * So calculate the DVO timing relative offset in LVDS data 162 * entry to get the DVO timing entry 163 */ 164 165 int lfp_data_size = 166 lvds_lfp_data_ptrs->ptr[1].dvo_timing_offset - 167 lvds_lfp_data_ptrs->ptr[0].dvo_timing_offset; 168 int dvo_timing_offset = 169 lvds_lfp_data_ptrs->ptr[0].dvo_timing_offset - 170 lvds_lfp_data_ptrs->ptr[0].fp_timing_offset; 171 char *entry = (char *)lvds_lfp_data->data + lfp_data_size * index; 172 173 return (struct lvds_dvo_timing *)(entry + dvo_timing_offset); 174} 175 176/* get lvds_fp_timing entry 177 * this function may return NULL if the corresponding entry is invalid 178 */ 179static const struct lvds_fp_timing * 180get_lvds_fp_timing(const struct bdb_header *bdb, 181 const struct bdb_lvds_lfp_data *data, 182 const struct bdb_lvds_lfp_data_ptrs *ptrs, 183 int index) 184{ 185 size_t data_ofs = (const u8 *)data - (const u8 *)bdb; 186 u16 data_size = ((const u16 *)data)[-1]; /* stored in header */ 187 size_t ofs; 188 189 if (index >= ARRAY_SIZE(ptrs->ptr)) 190 return NULL; 191 ofs = ptrs->ptr[index].fp_timing_offset; 192 if (ofs < data_ofs || 193 ofs + sizeof(struct lvds_fp_timing) > data_ofs + data_size) 194 return NULL; 195 return (const struct lvds_fp_timing *)((const u8 *)bdb + ofs); 196} 197 198/* Try to find integrated panel data */ 199static void 200parse_lfp_panel_data(struct drm_i915_private *dev_priv, 201 struct bdb_header *bdb) 202{ 203 const struct bdb_lvds_options *lvds_options; 204 const struct bdb_lvds_lfp_data *lvds_lfp_data; 205 const struct bdb_lvds_lfp_data_ptrs *lvds_lfp_data_ptrs; 206 const struct lvds_dvo_timing *panel_dvo_timing; 207 const struct lvds_fp_timing *fp_timing; 208 struct drm_display_mode *panel_fixed_mode; 209 int i, downclock; 210 211 lvds_options = find_section(bdb, BDB_LVDS_OPTIONS); 212 if (!lvds_options) 213 return; 214 215 dev_priv->vbt.lvds_dither = lvds_options->pixel_dither; 216 if (lvds_options->panel_type == 0xff) 217 return; 218 219 panel_type = lvds_options->panel_type; 220 221 lvds_lfp_data = find_section(bdb, BDB_LVDS_LFP_DATA); 222 if (!lvds_lfp_data) 223 return; 224 225 lvds_lfp_data_ptrs = find_section(bdb, BDB_LVDS_LFP_DATA_PTRS); 226 if (!lvds_lfp_data_ptrs) 227 return; 228 229 dev_priv->vbt.lvds_vbt = 1; 230 231 panel_dvo_timing = get_lvds_dvo_timing(lvds_lfp_data, 232 lvds_lfp_data_ptrs, 233 lvds_options->panel_type); 234 235 panel_fixed_mode = kzalloc(sizeof(*panel_fixed_mode), GFP_KERNEL); 236 if (!panel_fixed_mode) 237 return; 238 239 fill_detail_timing_data(panel_fixed_mode, panel_dvo_timing); 240 241 dev_priv->vbt.lfp_lvds_vbt_mode = panel_fixed_mode; 242 243 DRM_DEBUG_KMS("Found panel mode in BIOS VBT tables:\n"); 244 drm_mode_debug_printmodeline(panel_fixed_mode); 245 246 /* 247 * Iterate over the LVDS panel timing info to find the lowest clock 248 * for the native resolution. 249 */ 250 downclock = panel_dvo_timing->clock; 251 for (i = 0; i < 16; i++) { 252 const struct lvds_dvo_timing *dvo_timing; 253 254 dvo_timing = get_lvds_dvo_timing(lvds_lfp_data, 255 lvds_lfp_data_ptrs, 256 i); 257 if (lvds_dvo_timing_equal_size(dvo_timing, panel_dvo_timing) && 258 dvo_timing->clock < downclock) 259 downclock = dvo_timing->clock; 260 } 261 262 if (downclock < panel_dvo_timing->clock && i915.lvds_downclock) { 263 dev_priv->lvds_downclock_avail = 1; 264 dev_priv->lvds_downclock = downclock * 10; 265 DRM_DEBUG_KMS("LVDS downclock is found in VBT. " 266 "Normal Clock %dKHz, downclock %dKHz\n", 267 panel_fixed_mode->clock, 10*downclock); 268 } 269 270 fp_timing = get_lvds_fp_timing(bdb, lvds_lfp_data, 271 lvds_lfp_data_ptrs, 272 lvds_options->panel_type); 273 if (fp_timing) { 274 /* check the resolution, just to be sure */ 275 if (fp_timing->x_res == panel_fixed_mode->hdisplay && 276 fp_timing->y_res == panel_fixed_mode->vdisplay) { 277 dev_priv->vbt.bios_lvds_val = fp_timing->lvds_reg_val; 278 DRM_DEBUG_KMS("VBT initial LVDS value %x\n", 279 dev_priv->vbt.bios_lvds_val); 280 } 281 } 282} 283 284static void 285parse_lfp_backlight(struct drm_i915_private *dev_priv, struct bdb_header *bdb) 286{ 287 const struct bdb_lfp_backlight_data *backlight_data; 288 const struct bdb_lfp_backlight_data_entry *entry; 289 290 /* Err to enabling backlight if no backlight block. */ 291 dev_priv->vbt.backlight.present = true; 292 293 backlight_data = find_section(bdb, BDB_LVDS_BACKLIGHT); 294 if (!backlight_data) 295 return; 296 297 if (backlight_data->entry_size != sizeof(backlight_data->data[0])) { 298 DRM_DEBUG_KMS("Unsupported backlight data entry size %u\n", 299 backlight_data->entry_size); 300 return; 301 } 302 303 entry = &backlight_data->data[panel_type]; 304 305 dev_priv->vbt.backlight.present = entry->type == BDB_BACKLIGHT_TYPE_PWM; 306 if (!dev_priv->vbt.backlight.present) { 307 DRM_DEBUG_KMS("PWM backlight not present in VBT (type %u)\n", 308 entry->type); 309 return; 310 } 311 312 dev_priv->vbt.backlight.pwm_freq_hz = entry->pwm_freq_hz; 313 dev_priv->vbt.backlight.active_low_pwm = entry->active_low_pwm; 314 DRM_DEBUG_KMS("VBT backlight PWM modulation frequency %u Hz, " 315 "active %s, min brightness %u, level %u\n", 316 dev_priv->vbt.backlight.pwm_freq_hz, 317 dev_priv->vbt.backlight.active_low_pwm ? "low" : "high", 318 entry->min_brightness, 319 backlight_data->level[panel_type]); 320} 321 322/* Try to find sdvo panel data */ 323static void 324parse_sdvo_panel_data(struct drm_i915_private *dev_priv, 325 struct bdb_header *bdb) 326{ 327 struct lvds_dvo_timing *dvo_timing; 328 struct drm_display_mode *panel_fixed_mode; 329 int index; 330 331 index = i915.vbt_sdvo_panel_type; 332 if (index == -2) { 333 DRM_DEBUG_KMS("Ignore SDVO panel mode from BIOS VBT tables.\n"); 334 return; 335 } 336 337 if (index == -1) { 338 struct bdb_sdvo_lvds_options *sdvo_lvds_options; 339 340 sdvo_lvds_options = find_section(bdb, BDB_SDVO_LVDS_OPTIONS); 341 if (!sdvo_lvds_options) 342 return; 343 344 index = sdvo_lvds_options->panel_type; 345 } 346 347 dvo_timing = find_section(bdb, BDB_SDVO_PANEL_DTDS); 348 if (!dvo_timing) 349 return; 350 351 panel_fixed_mode = kzalloc(sizeof(*panel_fixed_mode), GFP_KERNEL); 352 if (!panel_fixed_mode) 353 return; 354 355 fill_detail_timing_data(panel_fixed_mode, dvo_timing + index); 356 357 dev_priv->vbt.sdvo_lvds_vbt_mode = panel_fixed_mode; 358 359 DRM_DEBUG_KMS("Found SDVO panel mode in BIOS VBT tables:\n"); 360 drm_mode_debug_printmodeline(panel_fixed_mode); 361} 362 363static int intel_bios_ssc_frequency(struct drm_device *dev, 364 bool alternate) 365{ 366 switch (INTEL_INFO(dev)->gen) { 367 case 2: 368 return alternate ? 66667 : 48000; 369 case 3: 370 case 4: 371 return alternate ? 100000 : 96000; 372 default: 373 return alternate ? 100000 : 120000; 374 } 375} 376 377static void 378parse_general_features(struct drm_i915_private *dev_priv, 379 struct bdb_header *bdb) 380{ 381 struct drm_device *dev = dev_priv->dev; 382 struct bdb_general_features *general; 383 384 general = find_section(bdb, BDB_GENERAL_FEATURES); 385 if (general) { 386 dev_priv->vbt.int_tv_support = general->int_tv_support; 387 dev_priv->vbt.int_crt_support = general->int_crt_support; 388 dev_priv->vbt.lvds_use_ssc = general->enable_ssc; 389 dev_priv->vbt.lvds_ssc_freq = 390 intel_bios_ssc_frequency(dev, general->ssc_freq); 391 dev_priv->vbt.display_clock_mode = general->display_clock_mode; 392 dev_priv->vbt.fdi_rx_polarity_inverted = general->fdi_rx_polarity_inverted; 393 DRM_DEBUG_KMS("BDB_GENERAL_FEATURES int_tv_support %d int_crt_support %d lvds_use_ssc %d lvds_ssc_freq %d display_clock_mode %d fdi_rx_polarity_inverted %d\n", 394 dev_priv->vbt.int_tv_support, 395 dev_priv->vbt.int_crt_support, 396 dev_priv->vbt.lvds_use_ssc, 397 dev_priv->vbt.lvds_ssc_freq, 398 dev_priv->vbt.display_clock_mode, 399 dev_priv->vbt.fdi_rx_polarity_inverted); 400 } 401} 402 403static void 404parse_general_definitions(struct drm_i915_private *dev_priv, 405 struct bdb_header *bdb) 406{ 407 struct bdb_general_definitions *general; 408 409 general = find_section(bdb, BDB_GENERAL_DEFINITIONS); 410 if (general) { 411 u16 block_size = get_blocksize(general); 412 if (block_size >= sizeof(*general)) { 413 int bus_pin = general->crt_ddc_gmbus_pin; 414 DRM_DEBUG_KMS("crt_ddc_bus_pin: %d\n", bus_pin); 415 if (intel_gmbus_is_port_valid(bus_pin)) 416 dev_priv->vbt.crt_ddc_pin = bus_pin; 417 } else { 418 DRM_DEBUG_KMS("BDB_GD too small (%d). Invalid.\n", 419 block_size); 420 } 421 } 422} 423 424static void 425parse_sdvo_device_mapping(struct drm_i915_private *dev_priv, 426 struct bdb_header *bdb) 427{ 428 struct sdvo_device_mapping *p_mapping; 429 struct bdb_general_definitions *p_defs; 430 union child_device_config *p_child; 431 int i, child_device_num, count; 432 u16 block_size; 433 434 p_defs = find_section(bdb, BDB_GENERAL_DEFINITIONS); 435 if (!p_defs) { 436 DRM_DEBUG_KMS("No general definition block is found, unable to construct sdvo mapping.\n"); 437 return; 438 } 439 /* judge whether the size of child device meets the requirements. 440 * If the child device size obtained from general definition block 441 * is different with sizeof(struct child_device_config), skip the 442 * parsing of sdvo device info 443 */ 444 if (p_defs->child_dev_size != sizeof(*p_child)) { 445 /* different child dev size . Ignore it */ 446 DRM_DEBUG_KMS("different child size is found. Invalid.\n"); 447 return; 448 } 449 /* get the block size of general definitions */ 450 block_size = get_blocksize(p_defs); 451 /* get the number of child device */ 452 child_device_num = (block_size - sizeof(*p_defs)) / 453 sizeof(*p_child); 454 count = 0; 455 for (i = 0; i < child_device_num; i++) { 456 p_child = &(p_defs->devices[i]); 457 if (!p_child->old.device_type) { 458 /* skip the device block if device type is invalid */ 459 continue; 460 } 461 if (p_child->old.slave_addr != SLAVE_ADDR1 && 462 p_child->old.slave_addr != SLAVE_ADDR2) { 463 /* 464 * If the slave address is neither 0x70 nor 0x72, 465 * it is not a SDVO device. Skip it. 466 */ 467 continue; 468 } 469 if (p_child->old.dvo_port != DEVICE_PORT_DVOB && 470 p_child->old.dvo_port != DEVICE_PORT_DVOC) { 471 /* skip the incorrect SDVO port */ 472 DRM_DEBUG_KMS("Incorrect SDVO port. Skip it\n"); 473 continue; 474 } 475 DRM_DEBUG_KMS("the SDVO device with slave addr %2x is found on" 476 " %s port\n", 477 p_child->old.slave_addr, 478 (p_child->old.dvo_port == DEVICE_PORT_DVOB) ? 479 "SDVOB" : "SDVOC"); 480 p_mapping = &(dev_priv->sdvo_mappings[p_child->old.dvo_port - 1]); 481 if (!p_mapping->initialized) { 482 p_mapping->dvo_port = p_child->old.dvo_port; 483 p_mapping->slave_addr = p_child->old.slave_addr; 484 p_mapping->dvo_wiring = p_child->old.dvo_wiring; 485 p_mapping->ddc_pin = p_child->old.ddc_pin; 486 p_mapping->i2c_pin = p_child->old.i2c_pin; 487 p_mapping->initialized = 1; 488 DRM_DEBUG_KMS("SDVO device: dvo=%x, addr=%x, wiring=%d, ddc_pin=%d, i2c_pin=%d\n", 489 p_mapping->dvo_port, 490 p_mapping->slave_addr, 491 p_mapping->dvo_wiring, 492 p_mapping->ddc_pin, 493 p_mapping->i2c_pin); 494 } else { 495 DRM_DEBUG_KMS("Maybe one SDVO port is shared by " 496 "two SDVO device.\n"); 497 } 498 if (p_child->old.slave2_addr) { 499 /* Maybe this is a SDVO device with multiple inputs */ 500 /* And the mapping info is not added */ 501 DRM_DEBUG_KMS("there exists the slave2_addr. Maybe this" 502 " is a SDVO device with multiple inputs.\n"); 503 } 504 count++; 505 } 506 507 if (!count) { 508 /* No SDVO device info is found */ 509 DRM_DEBUG_KMS("No SDVO device info is found in VBT\n"); 510 } 511 return; 512} 513 514static void 515parse_driver_features(struct drm_i915_private *dev_priv, 516 struct bdb_header *bdb) 517{ 518 struct bdb_driver_features *driver; 519 520 driver = find_section(bdb, BDB_DRIVER_FEATURES); 521 if (!driver) 522 return; 523 524 if (driver->lvds_config == BDB_DRIVER_FEATURE_EDP) 525 dev_priv->vbt.edp_support = 1; 526 527 if (driver->dual_frequency) 528 dev_priv->render_reclock_avail = true; 529} 530 531static void 532parse_edp(struct drm_i915_private *dev_priv, struct bdb_header *bdb) 533{ 534 struct bdb_edp *edp; 535 struct edp_power_seq *edp_pps; 536 struct edp_link_params *edp_link_params; 537 538 edp = find_section(bdb, BDB_EDP); 539 if (!edp) { 540 if (dev_priv->vbt.edp_support) 541 DRM_DEBUG_KMS("No eDP BDB found but eDP panel supported.\n"); 542 return; 543 } 544 545 switch ((edp->color_depth >> (panel_type * 2)) & 3) { 546 case EDP_18BPP: 547 dev_priv->vbt.edp_bpp = 18; 548 break; 549 case EDP_24BPP: 550 dev_priv->vbt.edp_bpp = 24; 551 break; 552 case EDP_30BPP: 553 dev_priv->vbt.edp_bpp = 30; 554 break; 555 } 556 557 /* Get the eDP sequencing and link info */ 558 edp_pps = &edp->power_seqs[panel_type]; 559 edp_link_params = &edp->link_params[panel_type]; 560 561 dev_priv->vbt.edp_pps = *edp_pps; 562 563 switch (edp_link_params->rate) { 564 case EDP_RATE_1_62: 565 dev_priv->vbt.edp_rate = DP_LINK_BW_1_62; 566 break; 567 case EDP_RATE_2_7: 568 dev_priv->vbt.edp_rate = DP_LINK_BW_2_7; 569 break; 570 default: 571 DRM_DEBUG_KMS("VBT has unknown eDP link rate value %u\n", 572 edp_link_params->rate); 573 break; 574 } 575 576 switch (edp_link_params->lanes) { 577 case EDP_LANE_1: 578 dev_priv->vbt.edp_lanes = 1; 579 break; 580 case EDP_LANE_2: 581 dev_priv->vbt.edp_lanes = 2; 582 break; 583 case EDP_LANE_4: 584 dev_priv->vbt.edp_lanes = 4; 585 break; 586 default: 587 DRM_DEBUG_KMS("VBT has unknown eDP lane count value %u\n", 588 edp_link_params->lanes); 589 break; 590 } 591 592 switch (edp_link_params->preemphasis) { 593 case EDP_PREEMPHASIS_NONE: 594 dev_priv->vbt.edp_preemphasis = DP_TRAIN_PRE_EMPHASIS_0; 595 break; 596 case EDP_PREEMPHASIS_3_5dB: 597 dev_priv->vbt.edp_preemphasis = DP_TRAIN_PRE_EMPHASIS_3_5; 598 break; 599 case EDP_PREEMPHASIS_6dB: 600 dev_priv->vbt.edp_preemphasis = DP_TRAIN_PRE_EMPHASIS_6; 601 break; 602 case EDP_PREEMPHASIS_9_5dB: 603 dev_priv->vbt.edp_preemphasis = DP_TRAIN_PRE_EMPHASIS_9_5; 604 break; 605 default: 606 DRM_DEBUG_KMS("VBT has unknown eDP pre-emphasis value %u\n", 607 edp_link_params->preemphasis); 608 break; 609 } 610 611 switch (edp_link_params->vswing) { 612 case EDP_VSWING_0_4V: 613 dev_priv->vbt.edp_vswing = DP_TRAIN_VOLTAGE_SWING_400; 614 break; 615 case EDP_VSWING_0_6V: 616 dev_priv->vbt.edp_vswing = DP_TRAIN_VOLTAGE_SWING_600; 617 break; 618 case EDP_VSWING_0_8V: 619 dev_priv->vbt.edp_vswing = DP_TRAIN_VOLTAGE_SWING_800; 620 break; 621 case EDP_VSWING_1_2V: 622 dev_priv->vbt.edp_vswing = DP_TRAIN_VOLTAGE_SWING_1200; 623 break; 624 default: 625 DRM_DEBUG_KMS("VBT has unknown eDP voltage swing value %u\n", 626 edp_link_params->vswing); 627 break; 628 } 629} 630 631static void 632parse_mipi(struct drm_i915_private *dev_priv, struct bdb_header *bdb) 633{ 634 struct bdb_mipi *mipi; 635 636 mipi = find_section(bdb, BDB_MIPI_CONFIG); 637 if (!mipi) { 638 DRM_DEBUG_KMS("No MIPI BDB found"); 639 return; 640 } 641 642 /* XXX: add more info */ 643 dev_priv->vbt.dsi.panel_id = MIPI_DSI_GENERIC_PANEL_ID; 644} 645 646static void parse_ddi_port(struct drm_i915_private *dev_priv, enum port port, 647 struct bdb_header *bdb) 648{ 649 union child_device_config *it, *child = NULL; 650 struct ddi_vbt_port_info *info = &dev_priv->vbt.ddi_port_info[port]; 651 uint8_t hdmi_level_shift; 652 int i, j; 653 bool is_dvi, is_hdmi, is_dp, is_edp, is_crt; 654 uint8_t aux_channel; 655 /* Each DDI port can have more than one value on the "DVO Port" field, 656 * so look for all the possible values for each port and abort if more 657 * than one is found. */ 658 int dvo_ports[][2] = { 659 {DVO_PORT_HDMIA, DVO_PORT_DPA}, 660 {DVO_PORT_HDMIB, DVO_PORT_DPB}, 661 {DVO_PORT_HDMIC, DVO_PORT_DPC}, 662 {DVO_PORT_HDMID, DVO_PORT_DPD}, 663 {DVO_PORT_CRT, -1 /* Port E can only be DVO_PORT_CRT */ }, 664 }; 665 666 /* Find the child device to use, abort if more than one found. */ 667 for (i = 0; i < dev_priv->vbt.child_dev_num; i++) { 668 it = dev_priv->vbt.child_dev + i; 669 670 for (j = 0; j < 2; j++) { 671 if (dvo_ports[port][j] == -1) 672 break; 673 674 if (it->common.dvo_port == dvo_ports[port][j]) { 675 if (child) { 676 DRM_DEBUG_KMS("More than one child device for port %c in VBT.\n", 677 port_name(port)); 678 return; 679 } 680 child = it; 681 } 682 } 683 } 684 if (!child) 685 return; 686 687 aux_channel = child->raw[25]; 688 689 is_dvi = child->common.device_type & DEVICE_TYPE_TMDS_DVI_SIGNALING; 690 is_dp = child->common.device_type & DEVICE_TYPE_DISPLAYPORT_OUTPUT; 691 is_crt = child->common.device_type & DEVICE_TYPE_ANALOG_OUTPUT; 692 is_hdmi = is_dvi && (child->common.device_type & DEVICE_TYPE_NOT_HDMI_OUTPUT) == 0; 693 is_edp = is_dp && (child->common.device_type & DEVICE_TYPE_INTERNAL_CONNECTOR); 694 695 info->supports_dvi = is_dvi; 696 info->supports_hdmi = is_hdmi; 697 info->supports_dp = is_dp; 698 699 DRM_DEBUG_KMS("Port %c VBT info: DP:%d HDMI:%d DVI:%d EDP:%d CRT:%d\n", 700 port_name(port), is_dp, is_hdmi, is_dvi, is_edp, is_crt); 701 702 if (is_edp && is_dvi) 703 DRM_DEBUG_KMS("Internal DP port %c is TMDS compatible\n", 704 port_name(port)); 705 if (is_crt && port != PORT_E) 706 DRM_DEBUG_KMS("Port %c is analog\n", port_name(port)); 707 if (is_crt && (is_dvi || is_dp)) 708 DRM_DEBUG_KMS("Analog port %c is also DP or TMDS compatible\n", 709 port_name(port)); 710 if (is_dvi && (port == PORT_A || port == PORT_E)) 711 DRM_DEBUG_KMS("Port %c is TMDS compabile\n", port_name(port)); 712 if (!is_dvi && !is_dp && !is_crt) 713 DRM_DEBUG_KMS("Port %c is not DP/TMDS/CRT compatible\n", 714 port_name(port)); 715 if (is_edp && (port == PORT_B || port == PORT_C || port == PORT_E)) 716 DRM_DEBUG_KMS("Port %c is internal DP\n", port_name(port)); 717 718 if (is_dvi) { 719 if (child->common.ddc_pin == 0x05 && port != PORT_B) 720 DRM_DEBUG_KMS("Unexpected DDC pin for port B\n"); 721 if (child->common.ddc_pin == 0x04 && port != PORT_C) 722 DRM_DEBUG_KMS("Unexpected DDC pin for port C\n"); 723 if (child->common.ddc_pin == 0x06 && port != PORT_D) 724 DRM_DEBUG_KMS("Unexpected DDC pin for port D\n"); 725 } 726 727 if (is_dp) { 728 if (aux_channel == 0x40 && port != PORT_A) 729 DRM_DEBUG_KMS("Unexpected AUX channel for port A\n"); 730 if (aux_channel == 0x10 && port != PORT_B) 731 DRM_DEBUG_KMS("Unexpected AUX channel for port B\n"); 732 if (aux_channel == 0x20 && port != PORT_C) 733 DRM_DEBUG_KMS("Unexpected AUX channel for port C\n"); 734 if (aux_channel == 0x30 && port != PORT_D) 735 DRM_DEBUG_KMS("Unexpected AUX channel for port D\n"); 736 } 737 738 if (bdb->version >= 158) { 739 /* The VBT HDMI level shift values match the table we have. */ 740 hdmi_level_shift = child->raw[7] & 0xF; 741 if (hdmi_level_shift < 0xC) { 742 DRM_DEBUG_KMS("VBT HDMI level shift for port %c: %d\n", 743 port_name(port), 744 hdmi_level_shift); 745 info->hdmi_level_shift = hdmi_level_shift; 746 } 747 } 748} 749 750static void parse_ddi_ports(struct drm_i915_private *dev_priv, 751 struct bdb_header *bdb) 752{ 753 struct drm_device *dev = dev_priv->dev; 754 enum port port; 755 756 if (!HAS_DDI(dev)) 757 return; 758 759 if (!dev_priv->vbt.child_dev_num) 760 return; 761 762 if (bdb->version < 155) 763 return; 764 765 for (port = PORT_A; port < I915_MAX_PORTS; port++) 766 parse_ddi_port(dev_priv, port, bdb); 767} 768 769static void 770parse_device_mapping(struct drm_i915_private *dev_priv, 771 struct bdb_header *bdb) 772{ 773 struct bdb_general_definitions *p_defs; 774 union child_device_config *p_child, *child_dev_ptr; 775 int i, child_device_num, count; 776 u16 block_size; 777 778 p_defs = find_section(bdb, BDB_GENERAL_DEFINITIONS); 779 if (!p_defs) { 780 DRM_DEBUG_KMS("No general definition block is found, no devices defined.\n"); 781 return; 782 } 783 /* judge whether the size of child device meets the requirements. 784 * If the child device size obtained from general definition block 785 * is different with sizeof(struct child_device_config), skip the 786 * parsing of sdvo device info 787 */ 788 if (p_defs->child_dev_size != sizeof(*p_child)) { 789 /* different child dev size . Ignore it */ 790 DRM_DEBUG_KMS("different child size is found. Invalid.\n"); 791 return; 792 } 793 /* get the block size of general definitions */ 794 block_size = get_blocksize(p_defs); 795 /* get the number of child device */ 796 child_device_num = (block_size - sizeof(*p_defs)) / 797 sizeof(*p_child); 798 count = 0; 799 /* get the number of child device that is present */ 800 for (i = 0; i < child_device_num; i++) { 801 p_child = &(p_defs->devices[i]); 802 if (!p_child->common.device_type) { 803 /* skip the device block if device type is invalid */ 804 continue; 805 } 806 count++; 807 } 808 if (!count) { 809 DRM_DEBUG_KMS("no child dev is parsed from VBT\n"); 810 return; 811 } 812 dev_priv->vbt.child_dev = kcalloc(count, sizeof(*p_child), GFP_KERNEL); 813 if (!dev_priv->vbt.child_dev) { 814 DRM_DEBUG_KMS("No memory space for child device\n"); 815 return; 816 } 817 818 dev_priv->vbt.child_dev_num = count; 819 count = 0; 820 for (i = 0; i < child_device_num; i++) { 821 p_child = &(p_defs->devices[i]); 822 if (!p_child->common.device_type) { 823 /* skip the device block if device type is invalid */ 824 continue; 825 } 826 child_dev_ptr = dev_priv->vbt.child_dev + count; 827 count++; 828 memcpy((void *)child_dev_ptr, (void *)p_child, 829 sizeof(*p_child)); 830 } 831 return; 832} 833 834static void 835init_vbt_defaults(struct drm_i915_private *dev_priv) 836{ 837 struct drm_device *dev = dev_priv->dev; 838 enum port port; 839 840 dev_priv->vbt.crt_ddc_pin = GMBUS_PORT_VGADDC; 841 842 /* LFP panel data */ 843 dev_priv->vbt.lvds_dither = 1; 844 dev_priv->vbt.lvds_vbt = 0; 845 846 /* SDVO panel data */ 847 dev_priv->vbt.sdvo_lvds_vbt_mode = NULL; 848 849 /* general features */ 850 dev_priv->vbt.int_tv_support = 1; 851 dev_priv->vbt.int_crt_support = 1; 852 853 /* Default to using SSC */ 854 dev_priv->vbt.lvds_use_ssc = 1; 855 /* 856 * Core/SandyBridge/IvyBridge use alternative (120MHz) reference 857 * clock for LVDS. 858 */ 859 dev_priv->vbt.lvds_ssc_freq = intel_bios_ssc_frequency(dev, 860 !HAS_PCH_SPLIT(dev)); 861 DRM_DEBUG_KMS("Set default to SSC at %d kHz\n", dev_priv->vbt.lvds_ssc_freq); 862 863 for (port = PORT_A; port < I915_MAX_PORTS; port++) { 864 struct ddi_vbt_port_info *info = 865 &dev_priv->vbt.ddi_port_info[port]; 866 867 /* Recommended BSpec default: 800mV 0dB. */ 868 info->hdmi_level_shift = 6; 869 870 info->supports_dvi = (port != PORT_A && port != PORT_E); 871 info->supports_hdmi = info->supports_dvi; 872 info->supports_dp = (port != PORT_E); 873 } 874} 875 876static int __init intel_no_opregion_vbt_callback(const struct dmi_system_id *id) 877{ 878 DRM_DEBUG_KMS("Falling back to manually reading VBT from " 879 "VBIOS ROM for %s\n", 880 id->ident); 881 return 1; 882} 883 884static const struct dmi_system_id intel_no_opregion_vbt[] = { 885 { 886 .callback = intel_no_opregion_vbt_callback, 887 .ident = "ThinkCentre A57", 888 .matches = { 889 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), 890 DMI_MATCH(DMI_PRODUCT_NAME, "97027RG"), 891 }, 892 }, 893 { } 894}; 895 896/** 897 * intel_parse_bios - find VBT and initialize settings from the BIOS 898 * @dev: DRM device 899 * 900 * Loads the Video BIOS and checks that the VBT exists. Sets scratch registers 901 * to appropriate values. 902 * 903 * Returns 0 on success, nonzero on failure. 904 */ 905int 906intel_parse_bios(struct drm_device *dev) 907{ 908 struct drm_i915_private *dev_priv = dev->dev_private; 909 struct pci_dev *pdev = dev->pdev; 910 struct bdb_header *bdb = NULL; 911 u8 __iomem *bios = NULL; 912 913 if (HAS_PCH_NOP(dev)) 914 return -ENODEV; 915 916 init_vbt_defaults(dev_priv); 917 918 /* XXX Should this validation be moved to intel_opregion.c? */ 919 if (!dmi_check_system(intel_no_opregion_vbt) && dev_priv->opregion.vbt) { 920 struct vbt_header *vbt = dev_priv->opregion.vbt; 921 if (memcmp(vbt->signature, "$VBT", 4) == 0) { 922 DRM_DEBUG_KMS("Using VBT from OpRegion: %20s\n", 923 vbt->signature); 924 bdb = (struct bdb_header *)((char *)vbt + vbt->bdb_offset); 925 } else 926 dev_priv->opregion.vbt = NULL; 927 } 928 929 if (bdb == NULL) { 930 struct vbt_header *vbt = NULL; 931 size_t size; 932 int i; 933 934 bios = pci_map_rom(pdev, &size); 935 if (!bios) 936 return -1; 937 938 /* Scour memory looking for the VBT signature */ 939 for (i = 0; i + 4 < size; i++) { 940 if (!memcmp(bios + i, "$VBT", 4)) { 941 vbt = (struct vbt_header *)(bios + i); 942 break; 943 } 944 } 945 946 if (!vbt) { 947 DRM_DEBUG_DRIVER("VBT signature missing\n"); 948 pci_unmap_rom(pdev, bios); 949 return -1; 950 } 951 952 bdb = (struct bdb_header *)(bios + i + vbt->bdb_offset); 953 } 954 955 /* Grab useful general definitions */ 956 parse_general_features(dev_priv, bdb); 957 parse_general_definitions(dev_priv, bdb); 958 parse_lfp_panel_data(dev_priv, bdb); 959 parse_lfp_backlight(dev_priv, bdb); 960 parse_sdvo_panel_data(dev_priv, bdb); 961 parse_sdvo_device_mapping(dev_priv, bdb); 962 parse_device_mapping(dev_priv, bdb); 963 parse_driver_features(dev_priv, bdb); 964 parse_edp(dev_priv, bdb); 965 parse_mipi(dev_priv, bdb); 966 parse_ddi_ports(dev_priv, bdb); 967 968 if (bios) 969 pci_unmap_rom(pdev, bios); 970 971 return 0; 972} 973 974/* Ensure that vital registers have been initialised, even if the BIOS 975 * is absent or just failing to do its job. 976 */ 977void intel_setup_bios(struct drm_device *dev) 978{ 979 struct drm_i915_private *dev_priv = dev->dev_private; 980 981 /* Set the Panel Power On/Off timings if uninitialized. */ 982 if (!HAS_PCH_SPLIT(dev) && 983 I915_READ(PP_ON_DELAYS) == 0 && I915_READ(PP_OFF_DELAYS) == 0) { 984 /* Set T2 to 40ms and T5 to 200ms */ 985 I915_WRITE(PP_ON_DELAYS, 0x019007d0); 986 987 /* Set T3 to 35ms and Tx to 200ms */ 988 I915_WRITE(PP_OFF_DELAYS, 0x015e07d0); 989 } 990}