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 28 #include <drm/drm_dp_helper.h> 29 #include <drm/drmP.h> 30 #include <drm/i915_drm.h> 31 #include "i915_drv.h" 32 33 #define _INTEL_BIOS_PRIVATE 34 #include "intel_vbt_defs.h" 35 36 /** 37 * DOC: Video BIOS Table (VBT) 38 * 39 * The Video BIOS Table, or VBT, provides platform and board specific 40 * configuration information to the driver that is not discoverable or available 41 * through other means. The configuration is mostly related to display 42 * hardware. The VBT is available via the ACPI OpRegion or, on older systems, in 43 * the PCI ROM. 44 * 45 * The VBT consists of a VBT Header (defined as &struct vbt_header), a BDB 46 * Header (&struct bdb_header), and a number of BIOS Data Blocks (BDB) that 47 * contain the actual configuration information. The VBT Header, and thus the 48 * VBT, begins with "$VBT" signature. The VBT Header contains the offset of the 49 * BDB Header. The data blocks are concatenated after the BDB Header. The data 50 * blocks have a 1-byte Block ID, 2-byte Block Size, and Block Size bytes of 51 * data. (Block 53, the MIPI Sequence Block is an exception.) 52 * 53 * The driver parses the VBT during load. The relevant information is stored in 54 * driver private data for ease of use, and the actual VBT is not read after 55 * that. 56 */ 57 58 #define SLAVE_ADDR1 0x70 59 #define SLAVE_ADDR2 0x72 60 61 /* Get BDB block size given a pointer to Block ID. */ 62 static u32 _get_blocksize(const u8 *block_base) 63 { 64 /* The MIPI Sequence Block v3+ has a separate size field. */ 65 if (*block_base == BDB_MIPI_SEQUENCE && *(block_base + 3) >= 3) 66 return *((const u32 *)(block_base + 4)); 67 else 68 return *((const u16 *)(block_base + 1)); 69 } 70 71 /* Get BDB block size give a pointer to data after Block ID and Block Size. */ 72 static u32 get_blocksize(const void *block_data) 73 { 74 return _get_blocksize((const char*)block_data - 3); 75 } 76 77 static const void * 78 find_section(const void *_bdb, int section_id) 79 { 80 const struct bdb_header *bdb = _bdb; 81 const u8 *base = _bdb; 82 int index = 0; 83 u32 total, current_size; 84 u8 current_id; 85 86 /* skip to first section */ 87 index += bdb->header_size; 88 total = bdb->bdb_size; 89 90 /* walk the sections looking for section_id */ 91 while (index + 3 < total) { 92 current_id = *(base + index); 93 current_size = _get_blocksize(base + index); 94 index += 3; 95 96 if (index + current_size > total) 97 return NULL; 98 99 if (current_id == section_id) 100 return base + index; 101 102 index += current_size; 103 } 104 105 return NULL; 106 } 107 108 static void 109 fill_detail_timing_data(struct drm_display_mode *panel_fixed_mode, 110 const struct lvds_dvo_timing *dvo_timing) 111 { 112 panel_fixed_mode->hdisplay = (dvo_timing->hactive_hi << 8) | 113 dvo_timing->hactive_lo; 114 panel_fixed_mode->hsync_start = panel_fixed_mode->hdisplay + 115 ((dvo_timing->hsync_off_hi << 8) | dvo_timing->hsync_off_lo); 116 panel_fixed_mode->hsync_end = panel_fixed_mode->hsync_start + 117 dvo_timing->hsync_pulse_width; 118 panel_fixed_mode->htotal = panel_fixed_mode->hdisplay + 119 ((dvo_timing->hblank_hi << 8) | dvo_timing->hblank_lo); 120 121 panel_fixed_mode->vdisplay = (dvo_timing->vactive_hi << 8) | 122 dvo_timing->vactive_lo; 123 panel_fixed_mode->vsync_start = panel_fixed_mode->vdisplay + 124 dvo_timing->vsync_off; 125 panel_fixed_mode->vsync_end = panel_fixed_mode->vsync_start + 126 dvo_timing->vsync_pulse_width; 127 panel_fixed_mode->vtotal = panel_fixed_mode->vdisplay + 128 ((dvo_timing->vblank_hi << 8) | dvo_timing->vblank_lo); 129 panel_fixed_mode->clock = dvo_timing->clock * 10; 130 panel_fixed_mode->type = DRM_MODE_TYPE_PREFERRED; 131 132 if (dvo_timing->hsync_positive) 133 panel_fixed_mode->flags |= DRM_MODE_FLAG_PHSYNC; 134 else 135 panel_fixed_mode->flags |= DRM_MODE_FLAG_NHSYNC; 136 137 if (dvo_timing->vsync_positive) 138 panel_fixed_mode->flags |= DRM_MODE_FLAG_PVSYNC; 139 else 140 panel_fixed_mode->flags |= DRM_MODE_FLAG_NVSYNC; 141 142 panel_fixed_mode->width_mm = (dvo_timing->himage_hi << 8) | 143 dvo_timing->himage_lo; 144 panel_fixed_mode->height_mm = (dvo_timing->vimage_hi << 8) | 145 dvo_timing->vimage_lo; 146 147 /* Some VBTs have bogus h/vtotal values */ 148 if (panel_fixed_mode->hsync_end > panel_fixed_mode->htotal) 149 panel_fixed_mode->htotal = panel_fixed_mode->hsync_end + 1; 150 if (panel_fixed_mode->vsync_end > panel_fixed_mode->vtotal) 151 panel_fixed_mode->vtotal = panel_fixed_mode->vsync_end + 1; 152 153 drm_mode_set_name(panel_fixed_mode); 154 } 155 156 static const struct lvds_dvo_timing * 157 get_lvds_dvo_timing(const struct bdb_lvds_lfp_data *lvds_lfp_data, 158 const struct bdb_lvds_lfp_data_ptrs *lvds_lfp_data_ptrs, 159 int index) 160 { 161 /* 162 * the size of fp_timing varies on the different platform. 163 * So calculate the DVO timing relative offset in LVDS data 164 * entry to get the DVO timing entry 165 */ 166 167 int lfp_data_size = 168 lvds_lfp_data_ptrs->ptr[1].dvo_timing_offset - 169 lvds_lfp_data_ptrs->ptr[0].dvo_timing_offset; 170 int dvo_timing_offset = 171 lvds_lfp_data_ptrs->ptr[0].dvo_timing_offset - 172 lvds_lfp_data_ptrs->ptr[0].fp_timing_offset; 173 const char *entry = (const char *)lvds_lfp_data->data + lfp_data_size * index; 174 175 return (const struct lvds_dvo_timing *)(entry + dvo_timing_offset); 176 } 177 178 /* get lvds_fp_timing entry 179 * this function may return NULL if the corresponding entry is invalid 180 */ 181 static const struct lvds_fp_timing * 182 get_lvds_fp_timing(const struct bdb_header *bdb, 183 const struct bdb_lvds_lfp_data *data, 184 const struct bdb_lvds_lfp_data_ptrs *ptrs, 185 int index) 186 { 187 size_t data_ofs = (const u8 *)data - (const u8 *)bdb; 188 u16 data_size = ((const u16 *)data)[-1]; /* stored in header */ 189 size_t ofs; 190 191 if (index >= ARRAY_SIZE(ptrs->ptr)) 192 return NULL; 193 ofs = ptrs->ptr[index].fp_timing_offset; 194 if (ofs < data_ofs || 195 ofs + sizeof(struct lvds_fp_timing) > data_ofs + data_size) 196 return NULL; 197 return (const struct lvds_fp_timing *)((const u8 *)bdb + ofs); 198 } 199 200 /* Try to find integrated panel data */ 201 static void 202 parse_lfp_panel_data(struct drm_i915_private *dev_priv, 203 const struct bdb_header *bdb) 204 { 205 const struct bdb_lvds_options *lvds_options; 206 const struct bdb_lvds_lfp_data *lvds_lfp_data; 207 const struct bdb_lvds_lfp_data_ptrs *lvds_lfp_data_ptrs; 208 const struct lvds_dvo_timing *panel_dvo_timing; 209 const struct lvds_fp_timing *fp_timing; 210 struct drm_display_mode *panel_fixed_mode; 211 int panel_type; 212 int drrs_mode; 213 int ret; 214 215 lvds_options = find_section(bdb, BDB_LVDS_OPTIONS); 216 if (!lvds_options) 217 return; 218 219 dev_priv->vbt.lvds_dither = lvds_options->pixel_dither; 220 221 ret = intel_opregion_get_panel_type(dev_priv->dev); 222 if (ret >= 0) { 223 WARN_ON(ret > 0xf); 224 panel_type = ret; 225 DRM_DEBUG_KMS("Panel type: %d (OpRegion)\n", panel_type); 226 } else { 227 if (lvds_options->panel_type > 0xf) { 228 DRM_DEBUG_KMS("Invalid VBT panel type 0x%x\n", 229 lvds_options->panel_type); 230 return; 231 } 232 panel_type = lvds_options->panel_type; 233 DRM_DEBUG_KMS("Panel type: %d (VBT)\n", panel_type); 234 } 235 236 dev_priv->vbt.panel_type = panel_type; 237 238 drrs_mode = (lvds_options->dps_panel_type_bits 239 >> (panel_type * 2)) & MODE_MASK; 240 /* 241 * VBT has static DRRS = 0 and seamless DRRS = 2. 242 * The below piece of code is required to adjust vbt.drrs_type 243 * to match the enum drrs_support_type. 244 */ 245 switch (drrs_mode) { 246 case 0: 247 dev_priv->vbt.drrs_type = STATIC_DRRS_SUPPORT; 248 DRM_DEBUG_KMS("DRRS supported mode is static\n"); 249 break; 250 case 2: 251 dev_priv->vbt.drrs_type = SEAMLESS_DRRS_SUPPORT; 252 DRM_DEBUG_KMS("DRRS supported mode is seamless\n"); 253 break; 254 default: 255 dev_priv->vbt.drrs_type = DRRS_NOT_SUPPORTED; 256 DRM_DEBUG_KMS("DRRS not supported (VBT input)\n"); 257 break; 258 } 259 260 lvds_lfp_data = find_section(bdb, BDB_LVDS_LFP_DATA); 261 if (!lvds_lfp_data) 262 return; 263 264 lvds_lfp_data_ptrs = find_section(bdb, BDB_LVDS_LFP_DATA_PTRS); 265 if (!lvds_lfp_data_ptrs) 266 return; 267 268 dev_priv->vbt.lvds_vbt = 1; 269 270 panel_dvo_timing = get_lvds_dvo_timing(lvds_lfp_data, 271 lvds_lfp_data_ptrs, 272 panel_type); 273 274 panel_fixed_mode = kzalloc(sizeof(*panel_fixed_mode), GFP_KERNEL); 275 if (!panel_fixed_mode) 276 return; 277 278 fill_detail_timing_data(panel_fixed_mode, panel_dvo_timing); 279 280 dev_priv->vbt.lfp_lvds_vbt_mode = panel_fixed_mode; 281 282 DRM_DEBUG_KMS("Found panel mode in BIOS VBT tables:\n"); 283 drm_mode_debug_printmodeline(panel_fixed_mode); 284 285 fp_timing = get_lvds_fp_timing(bdb, lvds_lfp_data, 286 lvds_lfp_data_ptrs, 287 panel_type); 288 if (fp_timing) { 289 /* check the resolution, just to be sure */ 290 if (fp_timing->x_res == panel_fixed_mode->hdisplay && 291 fp_timing->y_res == panel_fixed_mode->vdisplay) { 292 dev_priv->vbt.bios_lvds_val = fp_timing->lvds_reg_val; 293 DRM_DEBUG_KMS("VBT initial LVDS value %x\n", 294 dev_priv->vbt.bios_lvds_val); 295 } 296 } 297 } 298 299 static void 300 parse_lfp_backlight(struct drm_i915_private *dev_priv, 301 const struct bdb_header *bdb) 302 { 303 const struct bdb_lfp_backlight_data *backlight_data; 304 const struct bdb_lfp_backlight_data_entry *entry; 305 int panel_type = dev_priv->vbt.panel_type; 306 307 backlight_data = find_section(bdb, BDB_LVDS_BACKLIGHT); 308 if (!backlight_data) 309 return; 310 311 if (backlight_data->entry_size != sizeof(backlight_data->data[0])) { 312 DRM_DEBUG_KMS("Unsupported backlight data entry size %u\n", 313 backlight_data->entry_size); 314 return; 315 } 316 317 entry = &backlight_data->data[panel_type]; 318 319 dev_priv->vbt.backlight.present = entry->type == BDB_BACKLIGHT_TYPE_PWM; 320 if (!dev_priv->vbt.backlight.present) { 321 DRM_DEBUG_KMS("PWM backlight not present in VBT (type %u)\n", 322 entry->type); 323 return; 324 } 325 326 dev_priv->vbt.backlight.pwm_freq_hz = entry->pwm_freq_hz; 327 dev_priv->vbt.backlight.active_low_pwm = entry->active_low_pwm; 328 dev_priv->vbt.backlight.min_brightness = entry->min_brightness; 329 DRM_DEBUG_KMS("VBT backlight PWM modulation frequency %u Hz, " 330 "active %s, min brightness %u, level %u\n", 331 dev_priv->vbt.backlight.pwm_freq_hz, 332 dev_priv->vbt.backlight.active_low_pwm ? "low" : "high", 333 dev_priv->vbt.backlight.min_brightness, 334 backlight_data->level[panel_type]); 335 } 336 337 /* Try to find sdvo panel data */ 338 static void 339 parse_sdvo_panel_data(struct drm_i915_private *dev_priv, 340 const struct bdb_header *bdb) 341 { 342 const struct lvds_dvo_timing *dvo_timing; 343 struct drm_display_mode *panel_fixed_mode; 344 int index; 345 346 index = i915.vbt_sdvo_panel_type; 347 if (index == -2) { 348 DRM_DEBUG_KMS("Ignore SDVO panel mode from BIOS VBT tables.\n"); 349 return; 350 } 351 352 if (index == -1) { 353 const struct bdb_sdvo_lvds_options *sdvo_lvds_options; 354 355 sdvo_lvds_options = find_section(bdb, BDB_SDVO_LVDS_OPTIONS); 356 if (!sdvo_lvds_options) 357 return; 358 359 index = sdvo_lvds_options->panel_type; 360 } 361 362 dvo_timing = find_section(bdb, BDB_SDVO_PANEL_DTDS); 363 if (!dvo_timing) 364 return; 365 366 panel_fixed_mode = kzalloc(sizeof(*panel_fixed_mode), GFP_KERNEL); 367 if (!panel_fixed_mode) 368 return; 369 370 fill_detail_timing_data(panel_fixed_mode, dvo_timing + index); 371 372 dev_priv->vbt.sdvo_lvds_vbt_mode = panel_fixed_mode; 373 374 DRM_DEBUG_KMS("Found SDVO panel mode in BIOS VBT tables:\n"); 375 drm_mode_debug_printmodeline(panel_fixed_mode); 376 } 377 378 static int intel_bios_ssc_frequency(struct drm_i915_private *dev_priv, 379 bool alternate) 380 { 381 switch (INTEL_INFO(dev_priv)->gen) { 382 case 2: 383 return alternate ? 66667 : 48000; 384 case 3: 385 case 4: 386 return alternate ? 100000 : 96000; 387 default: 388 return alternate ? 100000 : 120000; 389 } 390 } 391 392 static void 393 parse_general_features(struct drm_i915_private *dev_priv, 394 const struct bdb_header *bdb) 395 { 396 const struct bdb_general_features *general; 397 398 general = find_section(bdb, BDB_GENERAL_FEATURES); 399 if (!general) 400 return; 401 402 dev_priv->vbt.int_tv_support = general->int_tv_support; 403 /* int_crt_support can't be trusted on earlier platforms */ 404 if (bdb->version >= 155 && 405 (HAS_DDI(dev_priv) || IS_VALLEYVIEW(dev_priv))) 406 dev_priv->vbt.int_crt_support = general->int_crt_support; 407 dev_priv->vbt.lvds_use_ssc = general->enable_ssc; 408 dev_priv->vbt.lvds_ssc_freq = 409 intel_bios_ssc_frequency(dev_priv, general->ssc_freq); 410 dev_priv->vbt.display_clock_mode = general->display_clock_mode; 411 dev_priv->vbt.fdi_rx_polarity_inverted = general->fdi_rx_polarity_inverted; 412 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", 413 dev_priv->vbt.int_tv_support, 414 dev_priv->vbt.int_crt_support, 415 dev_priv->vbt.lvds_use_ssc, 416 dev_priv->vbt.lvds_ssc_freq, 417 dev_priv->vbt.display_clock_mode, 418 dev_priv->vbt.fdi_rx_polarity_inverted); 419 } 420 421 static void 422 parse_general_definitions(struct drm_i915_private *dev_priv, 423 const struct bdb_header *bdb) 424 { 425 const struct bdb_general_definitions *general; 426 427 general = find_section(bdb, BDB_GENERAL_DEFINITIONS); 428 if (general) { 429 u16 block_size = get_blocksize(general); 430 if (block_size >= sizeof(*general)) { 431 int bus_pin = general->crt_ddc_gmbus_pin; 432 DRM_DEBUG_KMS("crt_ddc_bus_pin: %d\n", bus_pin); 433 if (intel_gmbus_is_valid_pin(dev_priv, bus_pin)) 434 dev_priv->vbt.crt_ddc_pin = bus_pin; 435 } else { 436 DRM_DEBUG_KMS("BDB_GD too small (%d). Invalid.\n", 437 block_size); 438 } 439 } 440 } 441 442 static const union child_device_config * 443 child_device_ptr(const struct bdb_general_definitions *p_defs, int i) 444 { 445 return (const void *) &p_defs->devices[i * p_defs->child_dev_size]; 446 } 447 448 static void 449 parse_sdvo_device_mapping(struct drm_i915_private *dev_priv, 450 const struct bdb_header *bdb) 451 { 452 struct sdvo_device_mapping *p_mapping; 453 const struct bdb_general_definitions *p_defs; 454 const struct old_child_dev_config *child; /* legacy */ 455 int i, child_device_num, count; 456 u16 block_size; 457 458 p_defs = find_section(bdb, BDB_GENERAL_DEFINITIONS); 459 if (!p_defs) { 460 DRM_DEBUG_KMS("No general definition block is found, unable to construct sdvo mapping.\n"); 461 return; 462 } 463 464 /* 465 * Only parse SDVO mappings when the general definitions block child 466 * device size matches that of the *legacy* child device config 467 * struct. Thus, SDVO mapping will be skipped for newer VBT. 468 */ 469 if (p_defs->child_dev_size != sizeof(*child)) { 470 DRM_DEBUG_KMS("Unsupported child device size for SDVO mapping.\n"); 471 return; 472 } 473 /* get the block size of general definitions */ 474 block_size = get_blocksize(p_defs); 475 /* get the number of child device */ 476 child_device_num = (block_size - sizeof(*p_defs)) / 477 p_defs->child_dev_size; 478 count = 0; 479 for (i = 0; i < child_device_num; i++) { 480 child = &child_device_ptr(p_defs, i)->old; 481 if (!child->device_type) { 482 /* skip the device block if device type is invalid */ 483 continue; 484 } 485 if (child->slave_addr != SLAVE_ADDR1 && 486 child->slave_addr != SLAVE_ADDR2) { 487 /* 488 * If the slave address is neither 0x70 nor 0x72, 489 * it is not a SDVO device. Skip it. 490 */ 491 continue; 492 } 493 if (child->dvo_port != DEVICE_PORT_DVOB && 494 child->dvo_port != DEVICE_PORT_DVOC) { 495 /* skip the incorrect SDVO port */ 496 DRM_DEBUG_KMS("Incorrect SDVO port. Skip it\n"); 497 continue; 498 } 499 DRM_DEBUG_KMS("the SDVO device with slave addr %2x is found on" 500 " %s port\n", 501 child->slave_addr, 502 (child->dvo_port == DEVICE_PORT_DVOB) ? 503 "SDVOB" : "SDVOC"); 504 p_mapping = &dev_priv->vbt.sdvo_mappings[child->dvo_port - 1]; 505 if (!p_mapping->initialized) { 506 p_mapping->dvo_port = child->dvo_port; 507 p_mapping->slave_addr = child->slave_addr; 508 p_mapping->dvo_wiring = child->dvo_wiring; 509 p_mapping->ddc_pin = child->ddc_pin; 510 p_mapping->i2c_pin = child->i2c_pin; 511 p_mapping->initialized = 1; 512 DRM_DEBUG_KMS("SDVO device: dvo=%x, addr=%x, wiring=%d, ddc_pin=%d, i2c_pin=%d\n", 513 p_mapping->dvo_port, 514 p_mapping->slave_addr, 515 p_mapping->dvo_wiring, 516 p_mapping->ddc_pin, 517 p_mapping->i2c_pin); 518 } else { 519 DRM_DEBUG_KMS("Maybe one SDVO port is shared by " 520 "two SDVO device.\n"); 521 } 522 if (child->slave2_addr) { 523 /* Maybe this is a SDVO device with multiple inputs */ 524 /* And the mapping info is not added */ 525 DRM_DEBUG_KMS("there exists the slave2_addr. Maybe this" 526 " is a SDVO device with multiple inputs.\n"); 527 } 528 count++; 529 } 530 531 if (!count) { 532 /* No SDVO device info is found */ 533 DRM_DEBUG_KMS("No SDVO device info is found in VBT\n"); 534 } 535 return; 536 } 537 538 static void 539 parse_driver_features(struct drm_i915_private *dev_priv, 540 const struct bdb_header *bdb) 541 { 542 const struct bdb_driver_features *driver; 543 544 driver = find_section(bdb, BDB_DRIVER_FEATURES); 545 if (!driver) 546 return; 547 548 if (driver->lvds_config == BDB_DRIVER_FEATURE_EDP) 549 dev_priv->vbt.edp.support = 1; 550 551 DRM_DEBUG_KMS("DRRS State Enabled:%d\n", driver->drrs_enabled); 552 /* 553 * If DRRS is not supported, drrs_type has to be set to 0. 554 * This is because, VBT is configured in such a way that 555 * static DRRS is 0 and DRRS not supported is represented by 556 * driver->drrs_enabled=false 557 */ 558 if (!driver->drrs_enabled) 559 dev_priv->vbt.drrs_type = DRRS_NOT_SUPPORTED; 560 } 561 562 static void 563 parse_edp(struct drm_i915_private *dev_priv, const struct bdb_header *bdb) 564 { 565 const struct bdb_edp *edp; 566 const struct edp_power_seq *edp_pps; 567 const struct edp_link_params *edp_link_params; 568 int panel_type = dev_priv->vbt.panel_type; 569 570 edp = find_section(bdb, BDB_EDP); 571 if (!edp) { 572 if (dev_priv->vbt.edp.support) 573 DRM_DEBUG_KMS("No eDP BDB found but eDP panel supported.\n"); 574 return; 575 } 576 577 switch ((edp->color_depth >> (panel_type * 2)) & 3) { 578 case EDP_18BPP: 579 dev_priv->vbt.edp.bpp = 18; 580 break; 581 case EDP_24BPP: 582 dev_priv->vbt.edp.bpp = 24; 583 break; 584 case EDP_30BPP: 585 dev_priv->vbt.edp.bpp = 30; 586 break; 587 } 588 589 /* Get the eDP sequencing and link info */ 590 edp_pps = &edp->power_seqs[panel_type]; 591 edp_link_params = &edp->link_params[panel_type]; 592 593 dev_priv->vbt.edp.pps = *edp_pps; 594 595 switch (edp_link_params->rate) { 596 case EDP_RATE_1_62: 597 dev_priv->vbt.edp.rate = DP_LINK_BW_1_62; 598 break; 599 case EDP_RATE_2_7: 600 dev_priv->vbt.edp.rate = DP_LINK_BW_2_7; 601 break; 602 default: 603 DRM_DEBUG_KMS("VBT has unknown eDP link rate value %u\n", 604 edp_link_params->rate); 605 break; 606 } 607 608 switch (edp_link_params->lanes) { 609 case EDP_LANE_1: 610 dev_priv->vbt.edp.lanes = 1; 611 break; 612 case EDP_LANE_2: 613 dev_priv->vbt.edp.lanes = 2; 614 break; 615 case EDP_LANE_4: 616 dev_priv->vbt.edp.lanes = 4; 617 break; 618 default: 619 DRM_DEBUG_KMS("VBT has unknown eDP lane count value %u\n", 620 edp_link_params->lanes); 621 break; 622 } 623 624 switch (edp_link_params->preemphasis) { 625 case EDP_PREEMPHASIS_NONE: 626 dev_priv->vbt.edp.preemphasis = DP_TRAIN_PRE_EMPH_LEVEL_0; 627 break; 628 case EDP_PREEMPHASIS_3_5dB: 629 dev_priv->vbt.edp.preemphasis = DP_TRAIN_PRE_EMPH_LEVEL_1; 630 break; 631 case EDP_PREEMPHASIS_6dB: 632 dev_priv->vbt.edp.preemphasis = DP_TRAIN_PRE_EMPH_LEVEL_2; 633 break; 634 case EDP_PREEMPHASIS_9_5dB: 635 dev_priv->vbt.edp.preemphasis = DP_TRAIN_PRE_EMPH_LEVEL_3; 636 break; 637 default: 638 DRM_DEBUG_KMS("VBT has unknown eDP pre-emphasis value %u\n", 639 edp_link_params->preemphasis); 640 break; 641 } 642 643 switch (edp_link_params->vswing) { 644 case EDP_VSWING_0_4V: 645 dev_priv->vbt.edp.vswing = DP_TRAIN_VOLTAGE_SWING_LEVEL_0; 646 break; 647 case EDP_VSWING_0_6V: 648 dev_priv->vbt.edp.vswing = DP_TRAIN_VOLTAGE_SWING_LEVEL_1; 649 break; 650 case EDP_VSWING_0_8V: 651 dev_priv->vbt.edp.vswing = DP_TRAIN_VOLTAGE_SWING_LEVEL_2; 652 break; 653 case EDP_VSWING_1_2V: 654 dev_priv->vbt.edp.vswing = DP_TRAIN_VOLTAGE_SWING_LEVEL_3; 655 break; 656 default: 657 DRM_DEBUG_KMS("VBT has unknown eDP voltage swing value %u\n", 658 edp_link_params->vswing); 659 break; 660 } 661 662 if (bdb->version >= 173) { 663 uint8_t vswing; 664 665 /* Don't read from VBT if module parameter has valid value*/ 666 if (i915.edp_vswing) { 667 dev_priv->vbt.edp.low_vswing = i915.edp_vswing == 1; 668 } else { 669 vswing = (edp->edp_vswing_preemph >> (panel_type * 4)) & 0xF; 670 dev_priv->vbt.edp.low_vswing = vswing == 0; 671 } 672 } 673 } 674 675 static void 676 parse_psr(struct drm_i915_private *dev_priv, const struct bdb_header *bdb) 677 { 678 const struct bdb_psr *psr; 679 const struct psr_table *psr_table; 680 int panel_type = dev_priv->vbt.panel_type; 681 682 psr = find_section(bdb, BDB_PSR); 683 if (!psr) { 684 DRM_DEBUG_KMS("No PSR BDB found.\n"); 685 return; 686 } 687 688 psr_table = &psr->psr_table[panel_type]; 689 690 dev_priv->vbt.psr.full_link = psr_table->full_link; 691 dev_priv->vbt.psr.require_aux_wakeup = psr_table->require_aux_to_wakeup; 692 693 /* Allowed VBT values goes from 0 to 15 */ 694 dev_priv->vbt.psr.idle_frames = psr_table->idle_frames < 0 ? 0 : 695 psr_table->idle_frames > 15 ? 15 : psr_table->idle_frames; 696 697 switch (psr_table->lines_to_wait) { 698 case 0: 699 dev_priv->vbt.psr.lines_to_wait = PSR_0_LINES_TO_WAIT; 700 break; 701 case 1: 702 dev_priv->vbt.psr.lines_to_wait = PSR_1_LINE_TO_WAIT; 703 break; 704 case 2: 705 dev_priv->vbt.psr.lines_to_wait = PSR_4_LINES_TO_WAIT; 706 break; 707 case 3: 708 dev_priv->vbt.psr.lines_to_wait = PSR_8_LINES_TO_WAIT; 709 break; 710 default: 711 DRM_DEBUG_KMS("VBT has unknown PSR lines to wait %u\n", 712 psr_table->lines_to_wait); 713 break; 714 } 715 716 dev_priv->vbt.psr.tp1_wakeup_time = psr_table->tp1_wakeup_time; 717 dev_priv->vbt.psr.tp2_tp3_wakeup_time = psr_table->tp2_tp3_wakeup_time; 718 } 719 720 static void 721 parse_mipi_config(struct drm_i915_private *dev_priv, 722 const struct bdb_header *bdb) 723 { 724 const struct bdb_mipi_config *start; 725 const struct mipi_config *config; 726 const struct mipi_pps_data *pps; 727 int panel_type = dev_priv->vbt.panel_type; 728 729 /* parse MIPI blocks only if LFP type is MIPI */ 730 if (!intel_bios_is_dsi_present(dev_priv, NULL)) 731 return; 732 733 /* Initialize this to undefined indicating no generic MIPI support */ 734 dev_priv->vbt.dsi.panel_id = MIPI_DSI_UNDEFINED_PANEL_ID; 735 736 /* Block #40 is already parsed and panel_fixed_mode is 737 * stored in dev_priv->lfp_lvds_vbt_mode 738 * resuse this when needed 739 */ 740 741 /* Parse #52 for panel index used from panel_type already 742 * parsed 743 */ 744 start = find_section(bdb, BDB_MIPI_CONFIG); 745 if (!start) { 746 DRM_DEBUG_KMS("No MIPI config BDB found"); 747 return; 748 } 749 750 DRM_DEBUG_DRIVER("Found MIPI Config block, panel index = %d\n", 751 panel_type); 752 753 /* 754 * get hold of the correct configuration block and pps data as per 755 * the panel_type as index 756 */ 757 config = &start->config[panel_type]; 758 pps = &start->pps[panel_type]; 759 760 /* store as of now full data. Trim when we realise all is not needed */ 761 dev_priv->vbt.dsi.config = kmemdup(config, sizeof(struct mipi_config), GFP_KERNEL); 762 if (!dev_priv->vbt.dsi.config) 763 return; 764 765 dev_priv->vbt.dsi.pps = kmemdup(pps, sizeof(struct mipi_pps_data), GFP_KERNEL); 766 if (!dev_priv->vbt.dsi.pps) { 767 kfree(dev_priv->vbt.dsi.config); 768 return; 769 } 770 771 /* We have mandatory mipi config blocks. Initialize as generic panel */ 772 dev_priv->vbt.dsi.panel_id = MIPI_DSI_GENERIC_PANEL_ID; 773 } 774 775 /* Find the sequence block and size for the given panel. */ 776 static const u8 * 777 find_panel_sequence_block(const struct bdb_mipi_sequence *sequence, 778 u16 panel_id, u32 *seq_size) 779 { 780 u32 total = get_blocksize(sequence); 781 const u8 *data = &sequence->data[0]; 782 u8 current_id; 783 u32 current_size; 784 int header_size = sequence->version >= 3 ? 5 : 3; 785 int index = 0; 786 int i; 787 788 /* skip new block size */ 789 if (sequence->version >= 3) 790 data += 4; 791 792 for (i = 0; i < MAX_MIPI_CONFIGURATIONS && index < total; i++) { 793 if (index + header_size > total) { 794 DRM_ERROR("Invalid sequence block (header)\n"); 795 return NULL; 796 } 797 798 current_id = *(data + index); 799 if (sequence->version >= 3) 800 current_size = *((const u32 *)(data + index + 1)); 801 else 802 current_size = *((const u16 *)(data + index + 1)); 803 804 index += header_size; 805 806 if (index + current_size > total) { 807 DRM_ERROR("Invalid sequence block\n"); 808 return NULL; 809 } 810 811 if (current_id == panel_id) { 812 *seq_size = current_size; 813 return data + index; 814 } 815 816 index += current_size; 817 } 818 819 DRM_ERROR("Sequence block detected but no valid configuration\n"); 820 821 return NULL; 822 } 823 824 static int goto_next_sequence(const u8 *data, int index, int total) 825 { 826 u16 len; 827 828 /* Skip Sequence Byte. */ 829 for (index = index + 1; index < total; index += len) { 830 u8 operation_byte = *(data + index); 831 index++; 832 833 switch (operation_byte) { 834 case MIPI_SEQ_ELEM_END: 835 return index; 836 case MIPI_SEQ_ELEM_SEND_PKT: 837 if (index + 4 > total) 838 return 0; 839 840 len = *((const u16 *)(data + index + 2)) + 4; 841 break; 842 case MIPI_SEQ_ELEM_DELAY: 843 len = 4; 844 break; 845 case MIPI_SEQ_ELEM_GPIO: 846 len = 2; 847 break; 848 case MIPI_SEQ_ELEM_I2C: 849 if (index + 7 > total) 850 return 0; 851 len = *(data + index + 6) + 7; 852 break; 853 default: 854 DRM_ERROR("Unknown operation byte\n"); 855 return 0; 856 } 857 } 858 859 return 0; 860 } 861 862 static int goto_next_sequence_v3(const u8 *data, int index, int total) 863 { 864 int seq_end; 865 u16 len; 866 u32 size_of_sequence; 867 868 /* 869 * Could skip sequence based on Size of Sequence alone, but also do some 870 * checking on the structure. 871 */ 872 if (total < 5) { 873 DRM_ERROR("Too small sequence size\n"); 874 return 0; 875 } 876 877 /* Skip Sequence Byte. */ 878 index++; 879 880 /* 881 * Size of Sequence. Excludes the Sequence Byte and the size itself, 882 * includes MIPI_SEQ_ELEM_END byte, excludes the final MIPI_SEQ_END 883 * byte. 884 */ 885 size_of_sequence = *((const uint32_t *)(data + index)); 886 index += 4; 887 888 seq_end = index + size_of_sequence; 889 if (seq_end > total) { 890 DRM_ERROR("Invalid sequence size\n"); 891 return 0; 892 } 893 894 for (; index < total; index += len) { 895 u8 operation_byte = *(data + index); 896 index++; 897 898 if (operation_byte == MIPI_SEQ_ELEM_END) { 899 if (index != seq_end) { 900 DRM_ERROR("Invalid element structure\n"); 901 return 0; 902 } 903 return index; 904 } 905 906 len = *(data + index); 907 index++; 908 909 /* 910 * FIXME: Would be nice to check elements like for v1/v2 in 911 * goto_next_sequence() above. 912 */ 913 switch (operation_byte) { 914 case MIPI_SEQ_ELEM_SEND_PKT: 915 case MIPI_SEQ_ELEM_DELAY: 916 case MIPI_SEQ_ELEM_GPIO: 917 case MIPI_SEQ_ELEM_I2C: 918 case MIPI_SEQ_ELEM_SPI: 919 case MIPI_SEQ_ELEM_PMIC: 920 break; 921 default: 922 DRM_ERROR("Unknown operation byte %u\n", 923 operation_byte); 924 break; 925 } 926 } 927 928 return 0; 929 } 930 931 static void 932 parse_mipi_sequence(struct drm_i915_private *dev_priv, 933 const struct bdb_header *bdb) 934 { 935 int panel_type = dev_priv->vbt.panel_type; 936 const struct bdb_mipi_sequence *sequence; 937 const u8 *seq_data; 938 u32 seq_size; 939 u8 *data; 940 int index = 0; 941 942 /* Only our generic panel driver uses the sequence block. */ 943 if (dev_priv->vbt.dsi.panel_id != MIPI_DSI_GENERIC_PANEL_ID) 944 return; 945 946 sequence = find_section(bdb, BDB_MIPI_SEQUENCE); 947 if (!sequence) { 948 DRM_DEBUG_KMS("No MIPI Sequence found, parsing complete\n"); 949 return; 950 } 951 952 /* Fail gracefully for forward incompatible sequence block. */ 953 if (sequence->version >= 4) { 954 DRM_ERROR("Unable to parse MIPI Sequence Block v%u\n", 955 sequence->version); 956 return; 957 } 958 959 DRM_DEBUG_DRIVER("Found MIPI sequence block v%u\n", sequence->version); 960 961 seq_data = find_panel_sequence_block(sequence, panel_type, &seq_size); 962 if (!seq_data) 963 return; 964 965 data = kmemdup(seq_data, seq_size, GFP_KERNEL); 966 if (!data) 967 return; 968 969 /* Parse the sequences, store pointers to each sequence. */ 970 for (;;) { 971 u8 seq_id = *(data + index); 972 if (seq_id == MIPI_SEQ_END) 973 break; 974 975 if (seq_id >= MIPI_SEQ_MAX) { 976 DRM_ERROR("Unknown sequence %u\n", seq_id); 977 goto err; 978 } 979 980 dev_priv->vbt.dsi.sequence[seq_id] = data + index; 981 982 if (sequence->version >= 3) 983 index = goto_next_sequence_v3(data, index, seq_size); 984 else 985 index = goto_next_sequence(data, index, seq_size); 986 if (!index) { 987 DRM_ERROR("Invalid sequence %u\n", seq_id); 988 goto err; 989 } 990 } 991 992 dev_priv->vbt.dsi.data = data; 993 dev_priv->vbt.dsi.size = seq_size; 994 dev_priv->vbt.dsi.seq_version = sequence->version; 995 996 DRM_DEBUG_DRIVER("MIPI related VBT parsing complete\n"); 997 return; 998 999 err: 1000 kfree(data); 1001 memset(dev_priv->vbt.dsi.sequence, 0, sizeof(dev_priv->vbt.dsi.sequence)); 1002 } 1003 1004 static u8 translate_iboost(u8 val) 1005 { 1006 static const u8 mapping[] = { 1, 3, 7 }; /* See VBT spec */ 1007 1008 if (val >= ARRAY_SIZE(mapping)) { 1009 DRM_DEBUG_KMS("Unsupported I_boost value found in VBT (%d), display may not work properly\n", val); 1010 return 0; 1011 } 1012 return mapping[val]; 1013 } 1014 1015 static void parse_ddi_port(struct drm_i915_private *dev_priv, enum port port, 1016 const struct bdb_header *bdb) 1017 { 1018 union child_device_config *it, *child = NULL; 1019 struct ddi_vbt_port_info *info = &dev_priv->vbt.ddi_port_info[port]; 1020 uint8_t hdmi_level_shift; 1021 int i, j; 1022 bool is_dvi, is_hdmi, is_dp, is_edp, is_crt; 1023 uint8_t aux_channel, ddc_pin; 1024 /* Each DDI port can have more than one value on the "DVO Port" field, 1025 * so look for all the possible values for each port and abort if more 1026 * than one is found. */ 1027 int dvo_ports[][3] = { 1028 {DVO_PORT_HDMIA, DVO_PORT_DPA, -1}, 1029 {DVO_PORT_HDMIB, DVO_PORT_DPB, -1}, 1030 {DVO_PORT_HDMIC, DVO_PORT_DPC, -1}, 1031 {DVO_PORT_HDMID, DVO_PORT_DPD, -1}, 1032 {DVO_PORT_CRT, DVO_PORT_HDMIE, DVO_PORT_DPE}, 1033 }; 1034 1035 /* Find the child device to use, abort if more than one found. */ 1036 for (i = 0; i < dev_priv->vbt.child_dev_num; i++) { 1037 it = dev_priv->vbt.child_dev + i; 1038 1039 for (j = 0; j < 3; j++) { 1040 if (dvo_ports[port][j] == -1) 1041 break; 1042 1043 if (it->common.dvo_port == dvo_ports[port][j]) { 1044 if (child) { 1045 DRM_DEBUG_KMS("More than one child device for port %c in VBT.\n", 1046 port_name(port)); 1047 return; 1048 } 1049 child = it; 1050 } 1051 } 1052 } 1053 if (!child) 1054 return; 1055 1056 aux_channel = child->raw[25]; 1057 ddc_pin = child->common.ddc_pin; 1058 1059 is_dvi = child->common.device_type & DEVICE_TYPE_TMDS_DVI_SIGNALING; 1060 is_dp = child->common.device_type & DEVICE_TYPE_DISPLAYPORT_OUTPUT; 1061 is_crt = child->common.device_type & DEVICE_TYPE_ANALOG_OUTPUT; 1062 is_hdmi = is_dvi && (child->common.device_type & DEVICE_TYPE_NOT_HDMI_OUTPUT) == 0; 1063 is_edp = is_dp && (child->common.device_type & DEVICE_TYPE_INTERNAL_CONNECTOR); 1064 1065 info->supports_dvi = is_dvi; 1066 info->supports_hdmi = is_hdmi; 1067 info->supports_dp = is_dp; 1068 1069 DRM_DEBUG_KMS("Port %c VBT info: DP:%d HDMI:%d DVI:%d EDP:%d CRT:%d\n", 1070 port_name(port), is_dp, is_hdmi, is_dvi, is_edp, is_crt); 1071 1072 if (is_edp && is_dvi) 1073 DRM_DEBUG_KMS("Internal DP port %c is TMDS compatible\n", 1074 port_name(port)); 1075 if (is_crt && port != PORT_E) 1076 DRM_DEBUG_KMS("Port %c is analog\n", port_name(port)); 1077 if (is_crt && (is_dvi || is_dp)) 1078 DRM_DEBUG_KMS("Analog port %c is also DP or TMDS compatible\n", 1079 port_name(port)); 1080 if (is_dvi && (port == PORT_A || port == PORT_E)) 1081 DRM_DEBUG_KMS("Port %c is TMDS compatible\n", port_name(port)); 1082 if (!is_dvi && !is_dp && !is_crt) 1083 DRM_DEBUG_KMS("Port %c is not DP/TMDS/CRT compatible\n", 1084 port_name(port)); 1085 if (is_edp && (port == PORT_B || port == PORT_C || port == PORT_E)) 1086 DRM_DEBUG_KMS("Port %c is internal DP\n", port_name(port)); 1087 1088 if (is_dvi) { 1089 if (port == PORT_E) { 1090 info->alternate_ddc_pin = ddc_pin; 1091 /* if DDIE share ddc pin with other port, then 1092 * dvi/hdmi couldn't exist on the shared port. 1093 * Otherwise they share the same ddc bin and system 1094 * couldn't communicate with them seperately. */ 1095 if (ddc_pin == DDC_PIN_B) { 1096 dev_priv->vbt.ddi_port_info[PORT_B].supports_dvi = 0; 1097 dev_priv->vbt.ddi_port_info[PORT_B].supports_hdmi = 0; 1098 } else if (ddc_pin == DDC_PIN_C) { 1099 dev_priv->vbt.ddi_port_info[PORT_C].supports_dvi = 0; 1100 dev_priv->vbt.ddi_port_info[PORT_C].supports_hdmi = 0; 1101 } else if (ddc_pin == DDC_PIN_D) { 1102 dev_priv->vbt.ddi_port_info[PORT_D].supports_dvi = 0; 1103 dev_priv->vbt.ddi_port_info[PORT_D].supports_hdmi = 0; 1104 } 1105 } else if (ddc_pin == DDC_PIN_B && port != PORT_B) 1106 DRM_DEBUG_KMS("Unexpected DDC pin for port B\n"); 1107 else if (ddc_pin == DDC_PIN_C && port != PORT_C) 1108 DRM_DEBUG_KMS("Unexpected DDC pin for port C\n"); 1109 else if (ddc_pin == DDC_PIN_D && port != PORT_D) 1110 DRM_DEBUG_KMS("Unexpected DDC pin for port D\n"); 1111 } 1112 1113 if (is_dp) { 1114 if (port == PORT_E) { 1115 info->alternate_aux_channel = aux_channel; 1116 /* if DDIE share aux channel with other port, then 1117 * DP couldn't exist on the shared port. Otherwise 1118 * they share the same aux channel and system 1119 * couldn't communicate with them seperately. */ 1120 if (aux_channel == DP_AUX_A) 1121 dev_priv->vbt.ddi_port_info[PORT_A].supports_dp = 0; 1122 else if (aux_channel == DP_AUX_B) 1123 dev_priv->vbt.ddi_port_info[PORT_B].supports_dp = 0; 1124 else if (aux_channel == DP_AUX_C) 1125 dev_priv->vbt.ddi_port_info[PORT_C].supports_dp = 0; 1126 else if (aux_channel == DP_AUX_D) 1127 dev_priv->vbt.ddi_port_info[PORT_D].supports_dp = 0; 1128 } 1129 else if (aux_channel == DP_AUX_A && port != PORT_A) 1130 DRM_DEBUG_KMS("Unexpected AUX channel for port A\n"); 1131 else if (aux_channel == DP_AUX_B && port != PORT_B) 1132 DRM_DEBUG_KMS("Unexpected AUX channel for port B\n"); 1133 else if (aux_channel == DP_AUX_C && port != PORT_C) 1134 DRM_DEBUG_KMS("Unexpected AUX channel for port C\n"); 1135 else if (aux_channel == DP_AUX_D && port != PORT_D) 1136 DRM_DEBUG_KMS("Unexpected AUX channel for port D\n"); 1137 } 1138 1139 if (bdb->version >= 158) { 1140 /* The VBT HDMI level shift values match the table we have. */ 1141 hdmi_level_shift = child->raw[7] & 0xF; 1142 DRM_DEBUG_KMS("VBT HDMI level shift for port %c: %d\n", 1143 port_name(port), 1144 hdmi_level_shift); 1145 info->hdmi_level_shift = hdmi_level_shift; 1146 } 1147 1148 /* Parse the I_boost config for SKL and above */ 1149 if (bdb->version >= 196 && child->common.iboost) { 1150 info->dp_boost_level = translate_iboost(child->common.iboost_level & 0xF); 1151 DRM_DEBUG_KMS("VBT (e)DP boost level for port %c: %d\n", 1152 port_name(port), info->dp_boost_level); 1153 info->hdmi_boost_level = translate_iboost(child->common.iboost_level >> 4); 1154 DRM_DEBUG_KMS("VBT HDMI boost level for port %c: %d\n", 1155 port_name(port), info->hdmi_boost_level); 1156 } 1157 } 1158 1159 static void parse_ddi_ports(struct drm_i915_private *dev_priv, 1160 const struct bdb_header *bdb) 1161 { 1162 enum port port; 1163 1164 if (!HAS_DDI(dev_priv)) 1165 return; 1166 1167 if (!dev_priv->vbt.child_dev_num) 1168 return; 1169 1170 if (bdb->version < 155) 1171 return; 1172 1173 for (port = PORT_A; port < I915_MAX_PORTS; port++) 1174 parse_ddi_port(dev_priv, port, bdb); 1175 } 1176 1177 static void 1178 parse_device_mapping(struct drm_i915_private *dev_priv, 1179 const struct bdb_header *bdb) 1180 { 1181 const struct bdb_general_definitions *p_defs; 1182 const union child_device_config *p_child; 1183 union child_device_config *child_dev_ptr; 1184 int i, child_device_num, count; 1185 u8 expected_size; 1186 u16 block_size; 1187 1188 p_defs = find_section(bdb, BDB_GENERAL_DEFINITIONS); 1189 if (!p_defs) { 1190 DRM_DEBUG_KMS("No general definition block is found, no devices defined.\n"); 1191 return; 1192 } 1193 if (bdb->version < 106) { 1194 expected_size = 22; 1195 } else if (bdb->version < 111) { 1196 expected_size = 27; 1197 } else if (bdb->version < 195) { 1198 BUILD_BUG_ON(sizeof(struct old_child_dev_config) != 33); 1199 expected_size = sizeof(struct old_child_dev_config); 1200 } else if (bdb->version == 195) { 1201 expected_size = 37; 1202 } else if (bdb->version <= 197) { 1203 expected_size = 38; 1204 } else { 1205 expected_size = 38; 1206 BUILD_BUG_ON(sizeof(*p_child) < 38); 1207 DRM_DEBUG_DRIVER("Expected child device config size for VBT version %u not known; assuming %u\n", 1208 bdb->version, expected_size); 1209 } 1210 1211 /* Flag an error for unexpected size, but continue anyway. */ 1212 if (p_defs->child_dev_size != expected_size) 1213 DRM_ERROR("Unexpected child device config size %u (expected %u for VBT version %u)\n", 1214 p_defs->child_dev_size, expected_size, bdb->version); 1215 1216 /* The legacy sized child device config is the minimum we need. */ 1217 if (p_defs->child_dev_size < sizeof(struct old_child_dev_config)) { 1218 DRM_DEBUG_KMS("Child device config size %u is too small.\n", 1219 p_defs->child_dev_size); 1220 return; 1221 } 1222 1223 /* get the block size of general definitions */ 1224 block_size = get_blocksize(p_defs); 1225 /* get the number of child device */ 1226 child_device_num = (block_size - sizeof(*p_defs)) / 1227 p_defs->child_dev_size; 1228 count = 0; 1229 /* get the number of child device that is present */ 1230 for (i = 0; i < child_device_num; i++) { 1231 p_child = child_device_ptr(p_defs, i); 1232 if (!p_child->common.device_type) { 1233 /* skip the device block if device type is invalid */ 1234 continue; 1235 } 1236 count++; 1237 } 1238 if (!count) { 1239 DRM_DEBUG_KMS("no child dev is parsed from VBT\n"); 1240 return; 1241 } 1242 dev_priv->vbt.child_dev = kcalloc(count, sizeof(*p_child), GFP_KERNEL); 1243 if (!dev_priv->vbt.child_dev) { 1244 DRM_DEBUG_KMS("No memory space for child device\n"); 1245 return; 1246 } 1247 1248 dev_priv->vbt.child_dev_num = count; 1249 count = 0; 1250 for (i = 0; i < child_device_num; i++) { 1251 p_child = child_device_ptr(p_defs, i); 1252 if (!p_child->common.device_type) { 1253 /* skip the device block if device type is invalid */ 1254 continue; 1255 } 1256 1257 child_dev_ptr = dev_priv->vbt.child_dev + count; 1258 count++; 1259 1260 /* 1261 * Copy as much as we know (sizeof) and is available 1262 * (child_dev_size) of the child device. Accessing the data must 1263 * depend on VBT version. 1264 */ 1265 memcpy(child_dev_ptr, p_child, 1266 min_t(size_t, p_defs->child_dev_size, sizeof(*p_child))); 1267 1268 /* 1269 * copied full block, now init values when they are not 1270 * available in current version 1271 */ 1272 if (bdb->version < 196) { 1273 /* Set default values for bits added from v196 */ 1274 child_dev_ptr->common.iboost = 0; 1275 child_dev_ptr->common.hpd_invert = 0; 1276 } 1277 1278 if (bdb->version < 192) 1279 child_dev_ptr->common.lspcon = 0; 1280 } 1281 return; 1282 } 1283 1284 static void 1285 init_vbt_defaults(struct drm_i915_private *dev_priv) 1286 { 1287 enum port port; 1288 1289 dev_priv->vbt.crt_ddc_pin = GMBUS_PIN_VGADDC; 1290 1291 /* Default to having backlight */ 1292 dev_priv->vbt.backlight.present = true; 1293 1294 /* LFP panel data */ 1295 dev_priv->vbt.lvds_dither = 1; 1296 dev_priv->vbt.lvds_vbt = 0; 1297 1298 /* SDVO panel data */ 1299 dev_priv->vbt.sdvo_lvds_vbt_mode = NULL; 1300 1301 /* general features */ 1302 dev_priv->vbt.int_tv_support = 1; 1303 dev_priv->vbt.int_crt_support = 1; 1304 1305 /* Default to using SSC */ 1306 dev_priv->vbt.lvds_use_ssc = 1; 1307 /* 1308 * Core/SandyBridge/IvyBridge use alternative (120MHz) reference 1309 * clock for LVDS. 1310 */ 1311 dev_priv->vbt.lvds_ssc_freq = intel_bios_ssc_frequency(dev_priv, 1312 !HAS_PCH_SPLIT(dev_priv)); 1313 DRM_DEBUG_KMS("Set default to SSC at %d kHz\n", dev_priv->vbt.lvds_ssc_freq); 1314 1315 for (port = PORT_A; port < I915_MAX_PORTS; port++) { 1316 struct ddi_vbt_port_info *info = 1317 &dev_priv->vbt.ddi_port_info[port]; 1318 1319 info->hdmi_level_shift = HDMI_LEVEL_SHIFT_UNKNOWN; 1320 1321 info->supports_dvi = (port != PORT_A && port != PORT_E); 1322 info->supports_hdmi = info->supports_dvi; 1323 info->supports_dp = (port != PORT_E); 1324 } 1325 } 1326 1327 static const struct bdb_header *get_bdb_header(const struct vbt_header *vbt) 1328 { 1329 const char *_vbt = (const char *)vbt; 1330 1331 return (const struct bdb_header *)(_vbt + vbt->bdb_offset); 1332 } 1333 1334 /** 1335 * intel_bios_is_valid_vbt - does the given buffer contain a valid VBT 1336 * @buf: pointer to a buffer to validate 1337 * @size: size of the buffer 1338 * 1339 * Returns true on valid VBT. 1340 */ 1341 bool intel_bios_is_valid_vbt(const void *buf, size_t size) 1342 { 1343 const struct vbt_header *vbt = buf; 1344 const struct bdb_header *bdb; 1345 1346 if (!vbt) 1347 return false; 1348 1349 if (sizeof(struct vbt_header) > size) { 1350 DRM_DEBUG_DRIVER("VBT header incomplete\n"); 1351 return false; 1352 } 1353 1354 if (memcmp(vbt->signature, "$VBT", 4)) { 1355 DRM_DEBUG_DRIVER("VBT invalid signature\n"); 1356 return false; 1357 } 1358 1359 if (vbt->bdb_offset + sizeof(struct bdb_header) > size) { 1360 DRM_DEBUG_DRIVER("BDB header incomplete\n"); 1361 return false; 1362 } 1363 1364 bdb = get_bdb_header(vbt); 1365 if (vbt->bdb_offset + bdb->bdb_size > size) { 1366 DRM_DEBUG_DRIVER("BDB incomplete\n"); 1367 return false; 1368 } 1369 1370 return vbt; 1371 } 1372 1373 static const struct vbt_header *find_vbt(void __iomem *bios, size_t size) 1374 { 1375 size_t i; 1376 1377 /* Scour memory looking for the VBT signature. */ 1378 for (i = 0; i + 4 < size; i++) { 1379 void *vbt; 1380 1381 if (ioread32(bios + i) != *((const u32 *) "$VBT")) 1382 continue; 1383 1384 /* 1385 * This is the one place where we explicitly discard the address 1386 * space (__iomem) of the BIOS/VBT. 1387 */ 1388 vbt = (char __force *) bios + i; 1389 if (intel_bios_is_valid_vbt(vbt, size - i)) 1390 return vbt; 1391 1392 break; 1393 } 1394 1395 return NULL; 1396 } 1397 1398 /** 1399 * intel_bios_init - find VBT and initialize settings from the BIOS 1400 * @dev_priv: i915 device instance 1401 * 1402 * Loads the Video BIOS and checks that the VBT exists. Sets scratch registers 1403 * to appropriate values. 1404 * 1405 * Returns 0 on success, nonzero on failure. 1406 */ 1407 int 1408 intel_bios_init(struct drm_i915_private *dev_priv) 1409 { 1410 #if 0 1411 struct pci_dev *pdev = dev_priv->dev->pdev; 1412 #endif 1413 const struct vbt_header *vbt = dev_priv->opregion.vbt; 1414 const struct bdb_header *bdb; 1415 u8 __iomem *bios = NULL; 1416 1417 if (HAS_PCH_NOP(dev_priv)) 1418 return -ENODEV; 1419 1420 init_vbt_defaults(dev_priv); 1421 1422 if (!vbt) { 1423 size_t size; 1424 1425 #if 0 1426 bios = pci_map_rom(pdev, &size); 1427 if (!bios) 1428 #endif 1429 return -1; 1430 1431 vbt = find_vbt(bios, size); 1432 if (!vbt) { 1433 #if 0 1434 pci_unmap_rom(pdev, bios); 1435 #endif 1436 return -1; 1437 } 1438 1439 DRM_DEBUG_KMS("Found valid VBT in PCI ROM\n"); 1440 } 1441 1442 bdb = get_bdb_header(vbt); 1443 1444 DRM_DEBUG_KMS("VBT signature \"%.*s\", BDB version %d\n", 1445 (int)sizeof(vbt->signature), vbt->signature, bdb->version); 1446 1447 /* Grab useful general definitions */ 1448 parse_general_features(dev_priv, bdb); 1449 parse_general_definitions(dev_priv, bdb); 1450 parse_lfp_panel_data(dev_priv, bdb); 1451 parse_lfp_backlight(dev_priv, bdb); 1452 parse_sdvo_panel_data(dev_priv, bdb); 1453 parse_sdvo_device_mapping(dev_priv, bdb); 1454 parse_device_mapping(dev_priv, bdb); 1455 parse_driver_features(dev_priv, bdb); 1456 parse_edp(dev_priv, bdb); 1457 parse_psr(dev_priv, bdb); 1458 parse_mipi_config(dev_priv, bdb); 1459 parse_mipi_sequence(dev_priv, bdb); 1460 parse_ddi_ports(dev_priv, bdb); 1461 1462 #if 0 1463 if (bios) 1464 pci_unmap_rom(pdev, bios); 1465 #endif 1466 1467 return 0; 1468 } 1469 1470 /** 1471 * intel_bios_is_tv_present - is integrated TV present in VBT 1472 * @dev_priv: i915 device instance 1473 * 1474 * Return true if TV is present. If no child devices were parsed from VBT, 1475 * assume TV is present. 1476 */ 1477 bool intel_bios_is_tv_present(struct drm_i915_private *dev_priv) 1478 { 1479 union child_device_config *p_child; 1480 int i; 1481 1482 if (!dev_priv->vbt.int_tv_support) 1483 return false; 1484 1485 if (!dev_priv->vbt.child_dev_num) 1486 return true; 1487 1488 for (i = 0; i < dev_priv->vbt.child_dev_num; i++) { 1489 p_child = dev_priv->vbt.child_dev + i; 1490 /* 1491 * If the device type is not TV, continue. 1492 */ 1493 switch (p_child->old.device_type) { 1494 case DEVICE_TYPE_INT_TV: 1495 case DEVICE_TYPE_TV: 1496 case DEVICE_TYPE_TV_SVIDEO_COMPOSITE: 1497 break; 1498 default: 1499 continue; 1500 } 1501 /* Only when the addin_offset is non-zero, it is regarded 1502 * as present. 1503 */ 1504 if (p_child->old.addin_offset) 1505 return true; 1506 } 1507 1508 return false; 1509 } 1510 1511 /** 1512 * intel_bios_is_lvds_present - is LVDS present in VBT 1513 * @dev_priv: i915 device instance 1514 * @i2c_pin: i2c pin for LVDS if present 1515 * 1516 * Return true if LVDS is present. If no child devices were parsed from VBT, 1517 * assume LVDS is present. 1518 */ 1519 bool intel_bios_is_lvds_present(struct drm_i915_private *dev_priv, u8 *i2c_pin) 1520 { 1521 int i; 1522 1523 if (!dev_priv->vbt.child_dev_num) 1524 return true; 1525 1526 for (i = 0; i < dev_priv->vbt.child_dev_num; i++) { 1527 union child_device_config *uchild = dev_priv->vbt.child_dev + i; 1528 struct old_child_dev_config *child = &uchild->old; 1529 1530 /* If the device type is not LFP, continue. 1531 * We have to check both the new identifiers as well as the 1532 * old for compatibility with some BIOSes. 1533 */ 1534 if (child->device_type != DEVICE_TYPE_INT_LFP && 1535 child->device_type != DEVICE_TYPE_LFP) 1536 continue; 1537 1538 if (intel_gmbus_is_valid_pin(dev_priv, child->i2c_pin)) 1539 *i2c_pin = child->i2c_pin; 1540 1541 /* However, we cannot trust the BIOS writers to populate 1542 * the VBT correctly. Since LVDS requires additional 1543 * information from AIM blocks, a non-zero addin offset is 1544 * a good indicator that the LVDS is actually present. 1545 */ 1546 if (child->addin_offset) 1547 return true; 1548 1549 /* But even then some BIOS writers perform some black magic 1550 * and instantiate the device without reference to any 1551 * additional data. Trust that if the VBT was written into 1552 * the OpRegion then they have validated the LVDS's existence. 1553 */ 1554 if (dev_priv->opregion.vbt) 1555 return true; 1556 } 1557 1558 return false; 1559 } 1560 1561 /** 1562 * intel_bios_is_port_present - is the specified digital port present 1563 * @dev_priv: i915 device instance 1564 * @port: port to check 1565 * 1566 * Return true if the device in %port is present. 1567 */ 1568 bool intel_bios_is_port_present(struct drm_i915_private *dev_priv, enum port port) 1569 { 1570 static const struct { 1571 u16 dp, hdmi; 1572 } port_mapping[] = { 1573 [PORT_B] = { DVO_PORT_DPB, DVO_PORT_HDMIB, }, 1574 [PORT_C] = { DVO_PORT_DPC, DVO_PORT_HDMIC, }, 1575 [PORT_D] = { DVO_PORT_DPD, DVO_PORT_HDMID, }, 1576 [PORT_E] = { DVO_PORT_DPE, DVO_PORT_HDMIE, }, 1577 }; 1578 int i; 1579 1580 /* FIXME maybe deal with port A as well? */ 1581 if (WARN_ON(port == PORT_A) || port >= ARRAY_SIZE(port_mapping)) 1582 return false; 1583 1584 if (!dev_priv->vbt.child_dev_num) 1585 return false; 1586 1587 for (i = 0; i < dev_priv->vbt.child_dev_num; i++) { 1588 const union child_device_config *p_child = 1589 &dev_priv->vbt.child_dev[i]; 1590 if ((p_child->common.dvo_port == port_mapping[port].dp || 1591 p_child->common.dvo_port == port_mapping[port].hdmi) && 1592 (p_child->common.device_type & (DEVICE_TYPE_TMDS_DVI_SIGNALING | 1593 DEVICE_TYPE_DISPLAYPORT_OUTPUT))) 1594 return true; 1595 } 1596 1597 return false; 1598 } 1599 1600 /** 1601 * intel_bios_is_port_edp - is the device in given port eDP 1602 * @dev_priv: i915 device instance 1603 * @port: port to check 1604 * 1605 * Return true if the device in %port is eDP. 1606 */ 1607 bool intel_bios_is_port_edp(struct drm_i915_private *dev_priv, enum port port) 1608 { 1609 union child_device_config *p_child; 1610 static const short port_mapping[] = { 1611 [PORT_B] = DVO_PORT_DPB, 1612 [PORT_C] = DVO_PORT_DPC, 1613 [PORT_D] = DVO_PORT_DPD, 1614 [PORT_E] = DVO_PORT_DPE, 1615 }; 1616 int i; 1617 1618 if (!dev_priv->vbt.child_dev_num) 1619 return false; 1620 1621 for (i = 0; i < dev_priv->vbt.child_dev_num; i++) { 1622 p_child = dev_priv->vbt.child_dev + i; 1623 1624 if (p_child->common.dvo_port == port_mapping[port] && 1625 (p_child->common.device_type & DEVICE_TYPE_eDP_BITS) == 1626 (DEVICE_TYPE_eDP & DEVICE_TYPE_eDP_BITS)) 1627 return true; 1628 } 1629 1630 return false; 1631 } 1632 1633 bool intel_bios_is_port_dp_dual_mode(struct drm_i915_private *dev_priv, enum port port) 1634 { 1635 static const struct { 1636 u16 dp, hdmi; 1637 } port_mapping[] = { 1638 /* 1639 * Buggy VBTs may declare DP ports as having 1640 * HDMI type dvo_port :( So let's check both. 1641 */ 1642 [PORT_B] = { DVO_PORT_DPB, DVO_PORT_HDMIB, }, 1643 [PORT_C] = { DVO_PORT_DPC, DVO_PORT_HDMIC, }, 1644 [PORT_D] = { DVO_PORT_DPD, DVO_PORT_HDMID, }, 1645 [PORT_E] = { DVO_PORT_DPE, DVO_PORT_HDMIE, }, 1646 }; 1647 int i; 1648 1649 if (port == PORT_A || port >= ARRAY_SIZE(port_mapping)) 1650 return false; 1651 1652 if (!dev_priv->vbt.child_dev_num) 1653 return false; 1654 1655 for (i = 0; i < dev_priv->vbt.child_dev_num; i++) { 1656 const union child_device_config *p_child = 1657 &dev_priv->vbt.child_dev[i]; 1658 1659 if ((p_child->common.dvo_port == port_mapping[port].dp || 1660 p_child->common.dvo_port == port_mapping[port].hdmi) && 1661 (p_child->common.device_type & DEVICE_TYPE_DP_DUAL_MODE_BITS) == 1662 (DEVICE_TYPE_DP_DUAL_MODE & DEVICE_TYPE_DP_DUAL_MODE_BITS)) 1663 return true; 1664 } 1665 1666 return false; 1667 } 1668 1669 /** 1670 * intel_bios_is_dsi_present - is DSI present in VBT 1671 * @dev_priv: i915 device instance 1672 * @port: port for DSI if present 1673 * 1674 * Return true if DSI is present, and return the port in %port. 1675 */ 1676 bool intel_bios_is_dsi_present(struct drm_i915_private *dev_priv, 1677 enum port *port) 1678 { 1679 union child_device_config *p_child; 1680 u8 dvo_port; 1681 int i; 1682 1683 for (i = 0; i < dev_priv->vbt.child_dev_num; i++) { 1684 p_child = dev_priv->vbt.child_dev + i; 1685 1686 if (!(p_child->common.device_type & DEVICE_TYPE_MIPI_OUTPUT)) 1687 continue; 1688 1689 dvo_port = p_child->common.dvo_port; 1690 1691 switch (dvo_port) { 1692 case DVO_PORT_MIPIA: 1693 case DVO_PORT_MIPIC: 1694 if (port) 1695 *port = dvo_port - DVO_PORT_MIPIA; 1696 return true; 1697 case DVO_PORT_MIPIB: 1698 case DVO_PORT_MIPID: 1699 DRM_DEBUG_KMS("VBT has unsupported DSI port %c\n", 1700 port_name(dvo_port - DVO_PORT_MIPIA)); 1701 break; 1702 } 1703 } 1704 1705 return false; 1706 } 1707 1708 /** 1709 * intel_bios_is_port_hpd_inverted - is HPD inverted for %port 1710 * @dev_priv: i915 device instance 1711 * @port: port to check 1712 * 1713 * Return true if HPD should be inverted for %port. 1714 */ 1715 bool 1716 intel_bios_is_port_hpd_inverted(struct drm_i915_private *dev_priv, 1717 enum port port) 1718 { 1719 int i; 1720 1721 if (WARN_ON_ONCE(!IS_BROXTON(dev_priv))) 1722 return false; 1723 1724 for (i = 0; i < dev_priv->vbt.child_dev_num; i++) { 1725 if (!dev_priv->vbt.child_dev[i].common.hpd_invert) 1726 continue; 1727 1728 switch (dev_priv->vbt.child_dev[i].common.dvo_port) { 1729 case DVO_PORT_DPA: 1730 case DVO_PORT_HDMIA: 1731 if (port == PORT_A) 1732 return true; 1733 break; 1734 case DVO_PORT_DPB: 1735 case DVO_PORT_HDMIB: 1736 if (port == PORT_B) 1737 return true; 1738 break; 1739 case DVO_PORT_DPC: 1740 case DVO_PORT_HDMIC: 1741 if (port == PORT_C) 1742 return true; 1743 break; 1744 default: 1745 break; 1746 } 1747 } 1748 1749 return false; 1750 } 1751