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 "drmP.h" 28#include "drm.h" 29#include "i915_drm.h" 30#include "i915_drv.h" 31#include "intel_bios.h" 32 33#define SLAVE_ADDR1 0x70 34#define SLAVE_ADDR2 0x72 35 36static int panel_type; 37 38static void * 39find_section(struct bdb_header *bdb, int section_id) 40{ 41 u8 *base = (u8 *)bdb; 42 int index = 0; 43 u16 total, current_size; 44 u8 current_id; 45 46 /* skip to first section */ 47 index += bdb->header_size; 48 total = bdb->bdb_size; 49 50 /* walk the sections looking for section_id */ 51 while (index < total) { 52 current_id = *(base + index); 53 index++; 54 current_size = *((u16 *)(base + index)); 55 index += 2; 56 if (current_id == section_id) 57 return base + index; 58 index += current_size; 59 } 60 61 return NULL; 62} 63 64static u16 65get_blocksize(void *p) 66{ 67 u16 *block_ptr, block_size; 68 69 block_ptr = (u16 *)((char *)p - 2); 70 block_size = *block_ptr; 71 return block_size; 72} 73 74static void 75fill_detail_timing_data(struct drm_display_mode *panel_fixed_mode, 76 struct lvds_dvo_timing *dvo_timing) 77{ 78 panel_fixed_mode->hdisplay = (dvo_timing->hactive_hi << 8) | 79 dvo_timing->hactive_lo; 80 panel_fixed_mode->hsync_start = panel_fixed_mode->hdisplay + 81 ((dvo_timing->hsync_off_hi << 8) | dvo_timing->hsync_off_lo); 82 panel_fixed_mode->hsync_end = panel_fixed_mode->hsync_start + 83 dvo_timing->hsync_pulse_width; 84 panel_fixed_mode->htotal = panel_fixed_mode->hdisplay + 85 ((dvo_timing->hblank_hi << 8) | dvo_timing->hblank_lo); 86 87 panel_fixed_mode->vdisplay = (dvo_timing->vactive_hi << 8) | 88 dvo_timing->vactive_lo; 89 panel_fixed_mode->vsync_start = panel_fixed_mode->vdisplay + 90 dvo_timing->vsync_off; 91 panel_fixed_mode->vsync_end = panel_fixed_mode->vsync_start + 92 dvo_timing->vsync_pulse_width; 93 panel_fixed_mode->vtotal = panel_fixed_mode->vdisplay + 94 ((dvo_timing->vblank_hi << 8) | dvo_timing->vblank_lo); 95 panel_fixed_mode->clock = dvo_timing->clock * 10; 96 panel_fixed_mode->type = DRM_MODE_TYPE_PREFERRED; 97 98 if (dvo_timing->hsync_positive) 99 panel_fixed_mode->flags |= DRM_MODE_FLAG_PHSYNC; 100 else 101 panel_fixed_mode->flags |= DRM_MODE_FLAG_NHSYNC; 102 103 if (dvo_timing->vsync_positive) 104 panel_fixed_mode->flags |= DRM_MODE_FLAG_PVSYNC; 105 else 106 panel_fixed_mode->flags |= DRM_MODE_FLAG_NVSYNC; 107 108 /* Some VBTs have bogus h/vtotal values */ 109 if (panel_fixed_mode->hsync_end > panel_fixed_mode->htotal) 110 panel_fixed_mode->htotal = panel_fixed_mode->hsync_end + 1; 111 if (panel_fixed_mode->vsync_end > panel_fixed_mode->vtotal) 112 panel_fixed_mode->vtotal = panel_fixed_mode->vsync_end + 1; 113 114 drm_mode_set_name(panel_fixed_mode); 115} 116 117/* Try to find integrated panel data */ 118static void 119parse_lfp_panel_data(struct drm_i915_private *dev_priv, 120 struct bdb_header *bdb) 121{ 122 struct bdb_lvds_options *lvds_options; 123 struct bdb_lvds_lfp_data *lvds_lfp_data; 124 struct bdb_lvds_lfp_data_ptrs *lvds_lfp_data_ptrs; 125 struct bdb_lvds_lfp_data_entry *entry; 126 struct lvds_dvo_timing *dvo_timing; 127 struct drm_display_mode *panel_fixed_mode; 128 int lfp_data_size, dvo_timing_offset; 129 int i, temp_downclock; 130 struct drm_display_mode *temp_mode; 131 132 /* Defaults if we can't find VBT info */ 133 dev_priv->lvds_dither = 0; 134 dev_priv->lvds_vbt = 0; 135 136 lvds_options = find_section(bdb, BDB_LVDS_OPTIONS); 137 if (!lvds_options) 138 return; 139 140 dev_priv->lvds_dither = lvds_options->pixel_dither; 141 if (lvds_options->panel_type == 0xff) 142 return; 143 panel_type = lvds_options->panel_type; 144 145 lvds_lfp_data = find_section(bdb, BDB_LVDS_LFP_DATA); 146 if (!lvds_lfp_data) 147 return; 148 149 lvds_lfp_data_ptrs = find_section(bdb, BDB_LVDS_LFP_DATA_PTRS); 150 if (!lvds_lfp_data_ptrs) 151 return; 152 153 dev_priv->lvds_vbt = 1; 154 155 lfp_data_size = lvds_lfp_data_ptrs->ptr[1].dvo_timing_offset - 156 lvds_lfp_data_ptrs->ptr[0].dvo_timing_offset; 157 entry = (struct bdb_lvds_lfp_data_entry *) 158 ((uint8_t *)lvds_lfp_data->data + (lfp_data_size * 159 lvds_options->panel_type)); 160 dvo_timing_offset = lvds_lfp_data_ptrs->ptr[0].dvo_timing_offset - 161 lvds_lfp_data_ptrs->ptr[0].fp_timing_offset; 162 163 /* 164 * the size of fp_timing varies on the different platform. 165 * So calculate the DVO timing relative offset in LVDS data 166 * entry to get the DVO timing entry 167 */ 168 dvo_timing = (struct lvds_dvo_timing *) 169 ((unsigned char *)entry + dvo_timing_offset); 170 171 panel_fixed_mode = kzalloc(sizeof(*panel_fixed_mode), GFP_KERNEL); 172 173 fill_detail_timing_data(panel_fixed_mode, dvo_timing); 174 175 dev_priv->lfp_lvds_vbt_mode = panel_fixed_mode; 176 177 DRM_DEBUG_KMS("Found panel mode in BIOS VBT tables:\n"); 178 drm_mode_debug_printmodeline(panel_fixed_mode); 179 180 temp_mode = kzalloc(sizeof(*temp_mode), GFP_KERNEL); 181 temp_downclock = panel_fixed_mode->clock; 182 /* 183 * enumerate the LVDS panel timing info entry in VBT to check whether 184 * the LVDS downclock is found. 185 */ 186 for (i = 0; i < 16; i++) { 187 entry = (struct bdb_lvds_lfp_data_entry *) 188 ((uint8_t *)lvds_lfp_data->data + (lfp_data_size * i)); 189 dvo_timing = (struct lvds_dvo_timing *) 190 ((unsigned char *)entry + dvo_timing_offset); 191 192 fill_detail_timing_data(temp_mode, dvo_timing); 193 194 if (temp_mode->hdisplay == panel_fixed_mode->hdisplay && 195 temp_mode->hsync_start == panel_fixed_mode->hsync_start && 196 temp_mode->hsync_end == panel_fixed_mode->hsync_end && 197 temp_mode->htotal == panel_fixed_mode->htotal && 198 temp_mode->vdisplay == panel_fixed_mode->vdisplay && 199 temp_mode->vsync_start == panel_fixed_mode->vsync_start && 200 temp_mode->vsync_end == panel_fixed_mode->vsync_end && 201 temp_mode->vtotal == panel_fixed_mode->vtotal && 202 temp_mode->clock < temp_downclock) { 203 /* 204 * downclock is already found. But we expect 205 * to find the lower downclock. 206 */ 207 temp_downclock = temp_mode->clock; 208 } 209 /* clear it to zero */ 210 memset(temp_mode, 0, sizeof(*temp_mode)); 211 } 212 kfree(temp_mode); 213 if (temp_downclock < panel_fixed_mode->clock && 214 i915_lvds_downclock) { 215 dev_priv->lvds_downclock_avail = 1; 216 dev_priv->lvds_downclock = temp_downclock; 217 DRM_DEBUG_KMS("LVDS downclock is found in VBT. ", 218 "Normal Clock %dKHz, downclock %dKHz\n", 219 temp_downclock, panel_fixed_mode->clock); 220 } 221 return; 222} 223 224/* Try to find sdvo panel data */ 225static void 226parse_sdvo_panel_data(struct drm_i915_private *dev_priv, 227 struct bdb_header *bdb) 228{ 229 struct bdb_sdvo_lvds_options *sdvo_lvds_options; 230 struct lvds_dvo_timing *dvo_timing; 231 struct drm_display_mode *panel_fixed_mode; 232 233 dev_priv->sdvo_lvds_vbt_mode = NULL; 234 235 sdvo_lvds_options = find_section(bdb, BDB_SDVO_LVDS_OPTIONS); 236 if (!sdvo_lvds_options) 237 return; 238 239 dvo_timing = find_section(bdb, BDB_SDVO_PANEL_DTDS); 240 if (!dvo_timing) 241 return; 242 243 panel_fixed_mode = kzalloc(sizeof(*panel_fixed_mode), GFP_KERNEL); 244 245 if (!panel_fixed_mode) 246 return; 247 248 fill_detail_timing_data(panel_fixed_mode, 249 dvo_timing + sdvo_lvds_options->panel_type); 250 251 dev_priv->sdvo_lvds_vbt_mode = panel_fixed_mode; 252 253 return; 254} 255 256static void 257parse_general_features(struct drm_i915_private *dev_priv, 258 struct bdb_header *bdb) 259{ 260 struct drm_device *dev = dev_priv->dev; 261 struct bdb_general_features *general; 262 263 /* Set sensible defaults in case we can't find the general block */ 264 dev_priv->int_tv_support = 1; 265 dev_priv->int_crt_support = 1; 266 267 general = find_section(bdb, BDB_GENERAL_FEATURES); 268 if (general) { 269 dev_priv->int_tv_support = general->int_tv_support; 270 dev_priv->int_crt_support = general->int_crt_support; 271 dev_priv->lvds_use_ssc = general->enable_ssc; 272 273 if (dev_priv->lvds_use_ssc) { 274 if (IS_I85X(dev_priv->dev)) 275 dev_priv->lvds_ssc_freq = 276 general->ssc_freq ? 66 : 48; 277 else if (IS_IRONLAKE(dev_priv->dev) || IS_GEN6(dev)) 278 dev_priv->lvds_ssc_freq = 279 general->ssc_freq ? 100 : 120; 280 else 281 dev_priv->lvds_ssc_freq = 282 general->ssc_freq ? 100 : 96; 283 } 284 } 285} 286 287static void 288parse_general_definitions(struct drm_i915_private *dev_priv, 289 struct bdb_header *bdb) 290{ 291 struct bdb_general_definitions *general; 292 const int crt_bus_map_table[] = { 293 GPIOB, 294 GPIOA, 295 GPIOC, 296 GPIOD, 297 GPIOE, 298 GPIOF, 299 }; 300 301 general = find_section(bdb, BDB_GENERAL_DEFINITIONS); 302 if (general) { 303 u16 block_size = get_blocksize(general); 304 if (block_size >= sizeof(*general)) { 305 int bus_pin = general->crt_ddc_gmbus_pin; 306 DRM_DEBUG_KMS("crt_ddc_bus_pin: %d\n", bus_pin); 307 if ((bus_pin >= 1) && (bus_pin <= 6)) { 308 dev_priv->crt_ddc_bus = 309 crt_bus_map_table[bus_pin-1]; 310 } 311 } else { 312 DRM_DEBUG_KMS("BDB_GD too small (%d). Invalid.\n", 313 block_size); 314 } 315 } 316} 317 318static void 319parse_sdvo_device_mapping(struct drm_i915_private *dev_priv, 320 struct bdb_header *bdb) 321{ 322 struct sdvo_device_mapping *p_mapping; 323 struct bdb_general_definitions *p_defs; 324 struct child_device_config *p_child; 325 int i, child_device_num, count; 326 u16 block_size; 327 328 p_defs = find_section(bdb, BDB_GENERAL_DEFINITIONS); 329 if (!p_defs) { 330 DRM_DEBUG_KMS("No general definition block is found\n"); 331 return; 332 } 333 /* judge whether the size of child device meets the requirements. 334 * If the child device size obtained from general definition block 335 * is different with sizeof(struct child_device_config), skip the 336 * parsing of sdvo device info 337 */ 338 if (p_defs->child_dev_size != sizeof(*p_child)) { 339 /* different child dev size . Ignore it */ 340 DRM_DEBUG_KMS("different child size is found. Invalid.\n"); 341 return; 342 } 343 /* get the block size of general definitions */ 344 block_size = get_blocksize(p_defs); 345 /* get the number of child device */ 346 child_device_num = (block_size - sizeof(*p_defs)) / 347 sizeof(*p_child); 348 count = 0; 349 for (i = 0; i < child_device_num; i++) { 350 p_child = &(p_defs->devices[i]); 351 if (!p_child->device_type) { 352 /* skip the device block if device type is invalid */ 353 continue; 354 } 355 if (p_child->slave_addr != SLAVE_ADDR1 && 356 p_child->slave_addr != SLAVE_ADDR2) { 357 /* 358 * If the slave address is neither 0x70 nor 0x72, 359 * it is not a SDVO device. Skip it. 360 */ 361 continue; 362 } 363 if (p_child->dvo_port != DEVICE_PORT_DVOB && 364 p_child->dvo_port != DEVICE_PORT_DVOC) { 365 /* skip the incorrect SDVO port */ 366 DRM_DEBUG_KMS("Incorrect SDVO port. Skip it \n"); 367 continue; 368 } 369 DRM_DEBUG_KMS("the SDVO device with slave addr %2x is found on" 370 " %s port\n", 371 p_child->slave_addr, 372 (p_child->dvo_port == DEVICE_PORT_DVOB) ? 373 "SDVOB" : "SDVOC"); 374 p_mapping = &(dev_priv->sdvo_mappings[p_child->dvo_port - 1]); 375 if (!p_mapping->initialized) { 376 p_mapping->dvo_port = p_child->dvo_port; 377 p_mapping->slave_addr = p_child->slave_addr; 378 p_mapping->dvo_wiring = p_child->dvo_wiring; 379 p_mapping->ddc_pin = p_child->ddc_pin; 380 p_mapping->initialized = 1; 381 } else { 382 DRM_DEBUG_KMS("Maybe one SDVO port is shared by " 383 "two SDVO device.\n"); 384 } 385 if (p_child->slave2_addr) { 386 /* Maybe this is a SDVO device with multiple inputs */ 387 /* And the mapping info is not added */ 388 DRM_DEBUG_KMS("there exists the slave2_addr. Maybe this" 389 " is a SDVO device with multiple inputs.\n"); 390 } 391 count++; 392 } 393 394 if (!count) { 395 /* No SDVO device info is found */ 396 DRM_DEBUG_KMS("No SDVO device info is found in VBT\n"); 397 } 398 return; 399} 400 401static void 402parse_driver_features(struct drm_i915_private *dev_priv, 403 struct bdb_header *bdb) 404{ 405 struct drm_device *dev = dev_priv->dev; 406 struct bdb_driver_features *driver; 407 408 driver = find_section(bdb, BDB_DRIVER_FEATURES); 409 if (!driver) 410 return; 411 412 if (driver && SUPPORTS_EDP(dev) && 413 driver->lvds_config == BDB_DRIVER_FEATURE_EDP) { 414 dev_priv->edp_support = 1; 415 } else { 416 dev_priv->edp_support = 0; 417 } 418 419 if (driver && driver->dual_frequency) 420 dev_priv->render_reclock_avail = true; 421} 422 423static void 424parse_edp(struct drm_i915_private *dev_priv, struct bdb_header *bdb) 425{ 426 struct bdb_edp *edp; 427 428 edp = find_section(bdb, BDB_EDP); 429 if (!edp) { 430 if (SUPPORTS_EDP(dev_priv->dev) && dev_priv->edp_support) { 431 DRM_DEBUG_KMS("No eDP BDB found but eDP panel " 432 "supported, assume 18bpp panel color " 433 "depth.\n"); 434 dev_priv->edp_bpp = 18; 435 } 436 return; 437 } 438 439 switch ((edp->color_depth >> (panel_type * 2)) & 3) { 440 case EDP_18BPP: 441 dev_priv->edp_bpp = 18; 442 break; 443 case EDP_24BPP: 444 dev_priv->edp_bpp = 24; 445 break; 446 case EDP_30BPP: 447 dev_priv->edp_bpp = 30; 448 break; 449 } 450} 451 452static void 453parse_device_mapping(struct drm_i915_private *dev_priv, 454 struct bdb_header *bdb) 455{ 456 struct bdb_general_definitions *p_defs; 457 struct child_device_config *p_child, *child_dev_ptr; 458 int i, child_device_num, count; 459 u16 block_size; 460 461 p_defs = find_section(bdb, BDB_GENERAL_DEFINITIONS); 462 if (!p_defs) { 463 DRM_DEBUG_KMS("No general definition block is found\n"); 464 return; 465 } 466 /* judge whether the size of child device meets the requirements. 467 * If the child device size obtained from general definition block 468 * is different with sizeof(struct child_device_config), skip the 469 * parsing of sdvo device info 470 */ 471 if (p_defs->child_dev_size != sizeof(*p_child)) { 472 /* different child dev size . Ignore it */ 473 DRM_DEBUG_KMS("different child size is found. Invalid.\n"); 474 return; 475 } 476 /* get the block size of general definitions */ 477 block_size = get_blocksize(p_defs); 478 /* get the number of child device */ 479 child_device_num = (block_size - sizeof(*p_defs)) / 480 sizeof(*p_child); 481 count = 0; 482 /* get the number of child device that is present */ 483 for (i = 0; i < child_device_num; i++) { 484 p_child = &(p_defs->devices[i]); 485 if (!p_child->device_type) { 486 /* skip the device block if device type is invalid */ 487 continue; 488 } 489 count++; 490 } 491 if (!count) { 492 DRM_DEBUG_KMS("no child dev is parsed from VBT \n"); 493 return; 494 } 495 dev_priv->child_dev = kzalloc(sizeof(*p_child) * count, GFP_KERNEL); 496 if (!dev_priv->child_dev) { 497 DRM_DEBUG_KMS("No memory space for child device\n"); 498 return; 499 } 500 501 dev_priv->child_dev_num = count; 502 count = 0; 503 for (i = 0; i < child_device_num; i++) { 504 p_child = &(p_defs->devices[i]); 505 if (!p_child->device_type) { 506 /* skip the device block if device type is invalid */ 507 continue; 508 } 509 child_dev_ptr = dev_priv->child_dev + count; 510 count++; 511 memcpy((void *)child_dev_ptr, (void *)p_child, 512 sizeof(*p_child)); 513 } 514 return; 515} 516/** 517 * intel_init_bios - initialize VBIOS settings & find VBT 518 * @dev: DRM device 519 * 520 * Loads the Video BIOS and checks that the VBT exists. Sets scratch registers 521 * to appropriate values. 522 * 523 * VBT existence is a sanity check that is relied on by other i830_bios.c code. 524 * Note that it would be better to use a BIOS call to get the VBT, as BIOSes may 525 * feed an updated VBT back through that, compared to what we'll fetch using 526 * this method of groping around in the BIOS data. 527 * 528 * Returns 0 on success, nonzero on failure. 529 */ 530bool 531intel_init_bios(struct drm_device *dev) 532{ 533 struct drm_i915_private *dev_priv = dev->dev_private; 534 struct pci_dev *pdev = dev->pdev; 535 struct vbt_header *vbt = NULL; 536 struct bdb_header *bdb; 537 u8 __iomem *bios; 538 size_t size; 539 int i; 540 541 bios = pci_map_rom(pdev, &size); 542 if (!bios) 543 return -1; 544 545 /* Scour memory looking for the VBT signature */ 546 for (i = 0; i + 4 < size; i++) { 547 if (!memcmp(bios + i, "$VBT", 4)) { 548 vbt = (struct vbt_header *)(bios + i); 549 break; 550 } 551 } 552 553 if (!vbt) { 554 DRM_ERROR("VBT signature missing\n"); 555 pci_unmap_rom(pdev, bios); 556 return -1; 557 } 558 559 bdb = (struct bdb_header *)(bios + i + vbt->bdb_offset); 560 561 /* Grab useful general definitions */ 562 parse_general_features(dev_priv, bdb); 563 parse_general_definitions(dev_priv, bdb); 564 parse_lfp_panel_data(dev_priv, bdb); 565 parse_sdvo_panel_data(dev_priv, bdb); 566 parse_sdvo_device_mapping(dev_priv, bdb); 567 parse_device_mapping(dev_priv, bdb); 568 parse_driver_features(dev_priv, bdb); 569 parse_edp(dev_priv, bdb); 570 571 pci_unmap_rom(pdev, bios); 572 573 return 0; 574} 575