Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/anholt/drm-intel

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/anholt/drm-intel: (22 commits)
drm/i915: Fix read outside array bounds in restoring the SWF10 range.
drm/i915: Use our own workqueue to avoid wedging the system along with the GPU.
drm/i915: Add support for dual-channel LVDS on 8xx.
drm/i915: Return disconnected for SDVO DVI when there's no digital EDID.
drm/i915: Choose real sdvo output according to result from detection
drm/i915: Set preferred mode for integrated TV according to TV format
drm/i915: fix 845G FIFO size & burst length
drm/i915: fix VGA detect on IGDNG
drm/i915: Add eDP support on IGDNG mobile chip
drm/i915: enable DisplayPort support on IGDNG
drm/i915: Fix channel ending action for DP aux transaction
drm/i915: fix issue in display pipe setup on IGDNG
drm/i915: disable VGA plane reliably
drm/I915: Fix offset to DVO timings in LVDS data
drm/i915: hdmi detection according by reading edid
drm/i915: correct self-refresh calculation in "everything off" case
drm/i915: handle FIFO oversubsription correctly
drm/i915: FIFO watermark calculation fixes
drm/i915: ignore lvds on AOpen Mini PC MP-915
drm/i915: Allow frame buffers up to 4096x4096 on 915/945 class hardware
...

+1232 -524
+13 -2
drivers/gpu/drm/i915/i915_dma.c
··· 1186 1186 if (ret) 1187 1187 goto out_iomapfree; 1188 1188 1189 + dev_priv->wq = create_workqueue("i915"); 1190 + if (dev_priv->wq == NULL) { 1191 + DRM_ERROR("Failed to create our workqueue.\n"); 1192 + ret = -ENOMEM; 1193 + goto out_iomapfree; 1194 + } 1195 + 1189 1196 /* enable GEM by default */ 1190 1197 dev_priv->has_gem = 1; 1191 1198 ··· 1218 1211 if (!I915_NEED_GFX_HWS(dev)) { 1219 1212 ret = i915_init_phys_hws(dev); 1220 1213 if (ret != 0) 1221 - goto out_iomapfree; 1214 + goto out_workqueue_free; 1222 1215 } 1223 1216 1224 1217 i915_get_mem_freq(dev); ··· 1252 1245 ret = i915_load_modeset_init(dev, prealloc_size, agp_size); 1253 1246 if (ret < 0) { 1254 1247 DRM_ERROR("failed to init modeset\n"); 1255 - goto out_rmmap; 1248 + goto out_workqueue_free; 1256 1249 } 1257 1250 } 1258 1251 ··· 1263 1256 1264 1257 return 0; 1265 1258 1259 + out_workqueue_free: 1260 + destroy_workqueue(dev_priv->wq); 1266 1261 out_iomapfree: 1267 1262 io_mapping_free(dev_priv->mm.gtt_mapping); 1268 1263 out_rmmap: ··· 1277 1268 int i915_driver_unload(struct drm_device *dev) 1278 1269 { 1279 1270 struct drm_i915_private *dev_priv = dev->dev_private; 1271 + 1272 + destroy_workqueue(dev_priv->wq); 1280 1273 1281 1274 io_mapping_free(dev_priv->mm.gtt_mapping); 1282 1275 if (dev_priv->mm.gtt_mtrr >= 0) {
+4
drivers/gpu/drm/i915/i915_drv.h
··· 219 219 unsigned int lvds_vbt:1; 220 220 unsigned int int_crt_support:1; 221 221 unsigned int lvds_use_ssc:1; 222 + unsigned int edp_support:1; 222 223 int lvds_ssc_freq; 223 224 224 225 struct drm_i915_fence_reg fence_regs[16]; /* assume 965 */ ··· 230 229 231 230 spinlock_t error_lock; 232 231 struct drm_i915_error_state *first_error; 232 + struct work_struct error_work; 233 + struct workqueue_struct *wq; 233 234 234 235 /* Register state */ 235 236 u8 saveLBB; ··· 891 888 IS_I915GM(dev))) 892 889 #define SUPPORTS_INTEGRATED_HDMI(dev) (IS_G4X(dev) || IS_IGDNG(dev)) 893 890 #define SUPPORTS_INTEGRATED_DP(dev) (IS_G4X(dev) || IS_IGDNG(dev)) 891 + #define SUPPORTS_EDP(dev) (IS_IGDNG_M(dev)) 894 892 #define I915_HAS_HOTPLUG(dev) (IS_I945G(dev) || IS_I945GM(dev) || IS_I965G(dev)) 895 893 /* dsparb controlled by hw only */ 896 894 #define DSPARB_HWCONTROL(dev) (IS_G4X(dev) || IS_IGDNG(dev))
+2 -2
drivers/gpu/drm/i915/i915_gem.c
··· 1570 1570 } 1571 1571 1572 1572 if (was_empty && !dev_priv->mm.suspended) 1573 - schedule_delayed_work(&dev_priv->mm.retire_work, HZ); 1573 + queue_delayed_work(dev_priv->wq, &dev_priv->mm.retire_work, HZ); 1574 1574 return seqno; 1575 1575 } 1576 1576 ··· 1719 1719 i915_gem_retire_requests(dev); 1720 1720 if (!dev_priv->mm.suspended && 1721 1721 !list_empty(&dev_priv->mm.request_list)) 1722 - schedule_delayed_work(&dev_priv->mm.retire_work, HZ); 1722 + queue_delayed_work(dev_priv->wq, &dev_priv->mm.retire_work, HZ); 1723 1723 mutex_unlock(&dev->struct_mutex); 1724 1724 } 1725 1725
+2
drivers/gpu/drm/i915/i915_gem_debugfs.c
··· 343 343 344 344 error = dev_priv->first_error; 345 345 346 + seq_printf(m, "Time: %ld s %ld us\n", error->time.tv_sec, 347 + error->time.tv_usec); 346 348 seq_printf(m, "EIR: 0x%08x\n", error->eir); 347 349 seq_printf(m, " PGTBL_ER: 0x%08x\n", error->pgtbl_er); 348 350 seq_printf(m, " INSTPM: 0x%08x\n", error->instpm);
+160 -75
drivers/gpu/drm/i915/i915_irq.c
··· 290 290 return ret; 291 291 } 292 292 293 + /** 294 + * i915_error_work_func - do process context error handling work 295 + * @work: work struct 296 + * 297 + * Fire an error uevent so userspace can see that a hang or error 298 + * was detected. 299 + */ 300 + static void i915_error_work_func(struct work_struct *work) 301 + { 302 + drm_i915_private_t *dev_priv = container_of(work, drm_i915_private_t, 303 + error_work); 304 + struct drm_device *dev = dev_priv->dev; 305 + char *event_string = "ERROR=1"; 306 + char *envp[] = { event_string, NULL }; 307 + 308 + DRM_DEBUG("generating error event\n"); 309 + 310 + kobject_uevent_env(&dev->primary->kdev.kobj, KOBJ_CHANGE, envp); 311 + } 312 + 313 + /** 314 + * i915_capture_error_state - capture an error record for later analysis 315 + * @dev: drm device 316 + * 317 + * Should be called when an error is detected (either a hang or an error 318 + * interrupt) to capture error state from the time of the error. Fills 319 + * out a structure which becomes available in debugfs for user level tools 320 + * to pick up. 321 + */ 293 322 static void i915_capture_error_state(struct drm_device *dev) 294 323 { 295 324 struct drm_i915_private *dev_priv = dev->dev_private; ··· 354 325 error->acthd = I915_READ(ACTHD_I965); 355 326 } 356 327 328 + do_gettimeofday(&error->time); 329 + 357 330 dev_priv->first_error = error; 358 331 359 332 out: 360 333 spin_unlock_irqrestore(&dev_priv->error_lock, flags); 334 + } 335 + 336 + /** 337 + * i915_handle_error - handle an error interrupt 338 + * @dev: drm device 339 + * 340 + * Do some basic checking of regsiter state at error interrupt time and 341 + * dump it to the syslog. Also call i915_capture_error_state() to make 342 + * sure we get a record and make it available in debugfs. Fire a uevent 343 + * so userspace knows something bad happened (should trigger collection 344 + * of a ring dump etc.). 345 + */ 346 + static void i915_handle_error(struct drm_device *dev) 347 + { 348 + struct drm_i915_private *dev_priv = dev->dev_private; 349 + u32 eir = I915_READ(EIR); 350 + u32 pipea_stats = I915_READ(PIPEASTAT); 351 + u32 pipeb_stats = I915_READ(PIPEBSTAT); 352 + 353 + i915_capture_error_state(dev); 354 + 355 + printk(KERN_ERR "render error detected, EIR: 0x%08x\n", 356 + eir); 357 + 358 + if (IS_G4X(dev)) { 359 + if (eir & (GM45_ERROR_MEM_PRIV | GM45_ERROR_CP_PRIV)) { 360 + u32 ipeir = I915_READ(IPEIR_I965); 361 + 362 + printk(KERN_ERR " IPEIR: 0x%08x\n", 363 + I915_READ(IPEIR_I965)); 364 + printk(KERN_ERR " IPEHR: 0x%08x\n", 365 + I915_READ(IPEHR_I965)); 366 + printk(KERN_ERR " INSTDONE: 0x%08x\n", 367 + I915_READ(INSTDONE_I965)); 368 + printk(KERN_ERR " INSTPS: 0x%08x\n", 369 + I915_READ(INSTPS)); 370 + printk(KERN_ERR " INSTDONE1: 0x%08x\n", 371 + I915_READ(INSTDONE1)); 372 + printk(KERN_ERR " ACTHD: 0x%08x\n", 373 + I915_READ(ACTHD_I965)); 374 + I915_WRITE(IPEIR_I965, ipeir); 375 + (void)I915_READ(IPEIR_I965); 376 + } 377 + if (eir & GM45_ERROR_PAGE_TABLE) { 378 + u32 pgtbl_err = I915_READ(PGTBL_ER); 379 + printk(KERN_ERR "page table error\n"); 380 + printk(KERN_ERR " PGTBL_ER: 0x%08x\n", 381 + pgtbl_err); 382 + I915_WRITE(PGTBL_ER, pgtbl_err); 383 + (void)I915_READ(PGTBL_ER); 384 + } 385 + } 386 + 387 + if (IS_I9XX(dev)) { 388 + if (eir & I915_ERROR_PAGE_TABLE) { 389 + u32 pgtbl_err = I915_READ(PGTBL_ER); 390 + printk(KERN_ERR "page table error\n"); 391 + printk(KERN_ERR " PGTBL_ER: 0x%08x\n", 392 + pgtbl_err); 393 + I915_WRITE(PGTBL_ER, pgtbl_err); 394 + (void)I915_READ(PGTBL_ER); 395 + } 396 + } 397 + 398 + if (eir & I915_ERROR_MEMORY_REFRESH) { 399 + printk(KERN_ERR "memory refresh error\n"); 400 + printk(KERN_ERR "PIPEASTAT: 0x%08x\n", 401 + pipea_stats); 402 + printk(KERN_ERR "PIPEBSTAT: 0x%08x\n", 403 + pipeb_stats); 404 + /* pipestat has already been acked */ 405 + } 406 + if (eir & I915_ERROR_INSTRUCTION) { 407 + printk(KERN_ERR "instruction error\n"); 408 + printk(KERN_ERR " INSTPM: 0x%08x\n", 409 + I915_READ(INSTPM)); 410 + if (!IS_I965G(dev)) { 411 + u32 ipeir = I915_READ(IPEIR); 412 + 413 + printk(KERN_ERR " IPEIR: 0x%08x\n", 414 + I915_READ(IPEIR)); 415 + printk(KERN_ERR " IPEHR: 0x%08x\n", 416 + I915_READ(IPEHR)); 417 + printk(KERN_ERR " INSTDONE: 0x%08x\n", 418 + I915_READ(INSTDONE)); 419 + printk(KERN_ERR " ACTHD: 0x%08x\n", 420 + I915_READ(ACTHD)); 421 + I915_WRITE(IPEIR, ipeir); 422 + (void)I915_READ(IPEIR); 423 + } else { 424 + u32 ipeir = I915_READ(IPEIR_I965); 425 + 426 + printk(KERN_ERR " IPEIR: 0x%08x\n", 427 + I915_READ(IPEIR_I965)); 428 + printk(KERN_ERR " IPEHR: 0x%08x\n", 429 + I915_READ(IPEHR_I965)); 430 + printk(KERN_ERR " INSTDONE: 0x%08x\n", 431 + I915_READ(INSTDONE_I965)); 432 + printk(KERN_ERR " INSTPS: 0x%08x\n", 433 + I915_READ(INSTPS)); 434 + printk(KERN_ERR " INSTDONE1: 0x%08x\n", 435 + I915_READ(INSTDONE1)); 436 + printk(KERN_ERR " ACTHD: 0x%08x\n", 437 + I915_READ(ACTHD_I965)); 438 + I915_WRITE(IPEIR_I965, ipeir); 439 + (void)I915_READ(IPEIR_I965); 440 + } 441 + } 442 + 443 + I915_WRITE(EIR, eir); 444 + (void)I915_READ(EIR); 445 + eir = I915_READ(EIR); 446 + if (eir) { 447 + /* 448 + * some errors might have become stuck, 449 + * mask them. 450 + */ 451 + DRM_ERROR("EIR stuck: 0x%08x, masking\n", eir); 452 + I915_WRITE(EMR, I915_READ(EMR) | eir); 453 + I915_WRITE(IIR, I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT); 454 + } 455 + 456 + queue_work(dev_priv->wq, &dev_priv->error_work); 361 457 } 362 458 363 459 irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS) ··· 526 372 pipea_stats = I915_READ(PIPEASTAT); 527 373 pipeb_stats = I915_READ(PIPEBSTAT); 528 374 375 + if (iir & I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT) 376 + i915_handle_error(dev); 377 + 529 378 /* 530 379 * Clear the PIPE(A|B)STAT regs before the IIR 531 380 */ ··· 560 403 DRM_DEBUG("hotplug event received, stat 0x%08x\n", 561 404 hotplug_status); 562 405 if (hotplug_status & dev_priv->hotplug_supported_mask) 563 - schedule_work(&dev_priv->hotplug_work); 406 + queue_work(dev_priv->wq, 407 + &dev_priv->hotplug_work); 564 408 565 409 I915_WRITE(PORT_HOTPLUG_STAT, hotplug_status); 566 410 I915_READ(PORT_HOTPLUG_STAT); 567 - } 568 - 569 - if (iir & I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT) { 570 - u32 eir = I915_READ(EIR); 571 - 572 - i915_capture_error_state(dev); 573 - 574 - printk(KERN_ERR "render error detected, EIR: 0x%08x\n", 575 - eir); 576 - if (eir & I915_ERROR_PAGE_TABLE) { 577 - u32 pgtbl_err = I915_READ(PGTBL_ER); 578 - printk(KERN_ERR "page table error\n"); 579 - printk(KERN_ERR " PGTBL_ER: 0x%08x\n", 580 - pgtbl_err); 581 - I915_WRITE(PGTBL_ER, pgtbl_err); 582 - (void)I915_READ(PGTBL_ER); 583 - } 584 - if (eir & I915_ERROR_MEMORY_REFRESH) { 585 - printk(KERN_ERR "memory refresh error\n"); 586 - printk(KERN_ERR "PIPEASTAT: 0x%08x\n", 587 - pipea_stats); 588 - printk(KERN_ERR "PIPEBSTAT: 0x%08x\n", 589 - pipeb_stats); 590 - /* pipestat has already been acked */ 591 - } 592 - if (eir & I915_ERROR_INSTRUCTION) { 593 - printk(KERN_ERR "instruction error\n"); 594 - printk(KERN_ERR " INSTPM: 0x%08x\n", 595 - I915_READ(INSTPM)); 596 - if (!IS_I965G(dev)) { 597 - u32 ipeir = I915_READ(IPEIR); 598 - 599 - printk(KERN_ERR " IPEIR: 0x%08x\n", 600 - I915_READ(IPEIR)); 601 - printk(KERN_ERR " IPEHR: 0x%08x\n", 602 - I915_READ(IPEHR)); 603 - printk(KERN_ERR " INSTDONE: 0x%08x\n", 604 - I915_READ(INSTDONE)); 605 - printk(KERN_ERR " ACTHD: 0x%08x\n", 606 - I915_READ(ACTHD)); 607 - I915_WRITE(IPEIR, ipeir); 608 - (void)I915_READ(IPEIR); 609 - } else { 610 - u32 ipeir = I915_READ(IPEIR_I965); 611 - 612 - printk(KERN_ERR " IPEIR: 0x%08x\n", 613 - I915_READ(IPEIR_I965)); 614 - printk(KERN_ERR " IPEHR: 0x%08x\n", 615 - I915_READ(IPEHR_I965)); 616 - printk(KERN_ERR " INSTDONE: 0x%08x\n", 617 - I915_READ(INSTDONE_I965)); 618 - printk(KERN_ERR " INSTPS: 0x%08x\n", 619 - I915_READ(INSTPS)); 620 - printk(KERN_ERR " INSTDONE1: 0x%08x\n", 621 - I915_READ(INSTDONE1)); 622 - printk(KERN_ERR " ACTHD: 0x%08x\n", 623 - I915_READ(ACTHD_I965)); 624 - I915_WRITE(IPEIR_I965, ipeir); 625 - (void)I915_READ(IPEIR_I965); 626 - } 627 - } 628 - 629 - I915_WRITE(EIR, eir); 630 - (void)I915_READ(EIR); 631 - eir = I915_READ(EIR); 632 - if (eir) { 633 - /* 634 - * some errors might have become stuck, 635 - * mask them. 636 - */ 637 - DRM_ERROR("EIR stuck: 0x%08x, masking\n", eir); 638 - I915_WRITE(EMR, I915_READ(EMR) | eir); 639 - I915_WRITE(IIR, I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT); 640 - } 641 411 } 642 412 643 413 I915_WRITE(IIR, iir); ··· 914 830 atomic_set(&dev_priv->irq_received, 0); 915 831 916 832 INIT_WORK(&dev_priv->hotplug_work, i915_hotplug_work_func); 833 + INIT_WORK(&dev_priv->error_work, i915_error_work_func); 917 834 918 835 if (IS_IGDNG(dev)) { 919 836 igdng_irq_preinstall(dev);
+44 -1
drivers/gpu/drm/i915/i915_reg.h
··· 1395 1395 #define TV_V_CHROMA_42 0x684a8 1396 1396 1397 1397 /* Display Port */ 1398 + #define DP_A 0x64000 /* eDP */ 1398 1399 #define DP_B 0x64100 1399 1400 #define DP_C 0x64200 1400 1401 #define DP_D 0x64300 ··· 1438 1437 /* Mystic DPCD version 1.1 special mode */ 1439 1438 #define DP_ENHANCED_FRAMING (1 << 18) 1440 1439 1440 + /* eDP */ 1441 + #define DP_PLL_FREQ_270MHZ (0 << 16) 1442 + #define DP_PLL_FREQ_160MHZ (1 << 16) 1443 + #define DP_PLL_FREQ_MASK (3 << 16) 1444 + 1441 1445 /** locked once port is enabled */ 1442 1446 #define DP_PORT_REVERSAL (1 << 15) 1447 + 1448 + /* eDP */ 1449 + #define DP_PLL_ENABLE (1 << 14) 1443 1450 1444 1451 /** sends the clock on lane 15 of the PEG for debug */ 1445 1452 #define DP_CLOCK_OUTPUT_ENABLE (1 << 13) 1446 1453 1447 1454 #define DP_SCRAMBLING_DISABLE (1 << 12) 1455 + #define DP_SCRAMBLING_DISABLE_IGDNG (1 << 7) 1448 1456 1449 1457 /** limit RGB values to avoid confusing TVs */ 1450 1458 #define DP_COLOR_RANGE_16_235 (1 << 8) ··· 1473 1463 * is 20 bytes in each direction, hence the 5 fixed 1474 1464 * data registers 1475 1465 */ 1466 + #define DPA_AUX_CH_CTL 0x64010 1467 + #define DPA_AUX_CH_DATA1 0x64014 1468 + #define DPA_AUX_CH_DATA2 0x64018 1469 + #define DPA_AUX_CH_DATA3 0x6401c 1470 + #define DPA_AUX_CH_DATA4 0x64020 1471 + #define DPA_AUX_CH_DATA5 0x64024 1472 + 1476 1473 #define DPB_AUX_CH_CTL 0x64110 1477 1474 #define DPB_AUX_CH_DATA1 0x64114 1478 1475 #define DPB_AUX_CH_DATA2 0x64118 ··· 1635 1618 #define I830_FIFO_LINE_SIZE 32 1636 1619 #define I945_FIFO_SIZE 127 /* 945 & 965 */ 1637 1620 #define I915_FIFO_SIZE 95 1638 - #define I855GM_FIFO_SIZE 255 1621 + #define I855GM_FIFO_SIZE 127 /* In cachelines */ 1639 1622 #define I830_FIFO_SIZE 95 1640 1623 #define I915_MAX_WM 0x3f 1641 1624 ··· 1865 1848 #define PFA_CTL_1 0x68080 1866 1849 #define PFB_CTL_1 0x68880 1867 1850 #define PF_ENABLE (1<<31) 1851 + #define PFA_WIN_SZ 0x68074 1852 + #define PFB_WIN_SZ 0x68874 1868 1853 1869 1854 /* legacy palette */ 1870 1855 #define LGC_PALETTE_A 0x4a000 ··· 2226 2207 #define EDP_PANEL (1 << 30) 2227 2208 #define PCH_PP_OFF_DELAYS 0xc720c 2228 2209 #define PCH_PP_DIVISOR 0xc7210 2210 + 2211 + #define PCH_DP_B 0xe4100 2212 + #define PCH_DPB_AUX_CH_CTL 0xe4110 2213 + #define PCH_DPB_AUX_CH_DATA1 0xe4114 2214 + #define PCH_DPB_AUX_CH_DATA2 0xe4118 2215 + #define PCH_DPB_AUX_CH_DATA3 0xe411c 2216 + #define PCH_DPB_AUX_CH_DATA4 0xe4120 2217 + #define PCH_DPB_AUX_CH_DATA5 0xe4124 2218 + 2219 + #define PCH_DP_C 0xe4200 2220 + #define PCH_DPC_AUX_CH_CTL 0xe4210 2221 + #define PCH_DPC_AUX_CH_DATA1 0xe4214 2222 + #define PCH_DPC_AUX_CH_DATA2 0xe4218 2223 + #define PCH_DPC_AUX_CH_DATA3 0xe421c 2224 + #define PCH_DPC_AUX_CH_DATA4 0xe4220 2225 + #define PCH_DPC_AUX_CH_DATA5 0xe4224 2226 + 2227 + #define PCH_DP_D 0xe4300 2228 + #define PCH_DPD_AUX_CH_CTL 0xe4310 2229 + #define PCH_DPD_AUX_CH_DATA1 0xe4314 2230 + #define PCH_DPD_AUX_CH_DATA2 0xe4318 2231 + #define PCH_DPD_AUX_CH_DATA3 0xe431c 2232 + #define PCH_DPD_AUX_CH_DATA4 0xe4320 2233 + #define PCH_DPD_AUX_CH_DATA5 0xe4324 2229 2234 2230 2235 #endif /* _I915_REG_H_ */
+1 -1
drivers/gpu/drm/i915/i915_suspend.c
··· 598 598 599 599 for (i = 0; i < 16; i++) { 600 600 I915_WRITE(SWF00 + (i << 2), dev_priv->saveSWF0[i]); 601 - I915_WRITE(SWF10 + (i << 2), dev_priv->saveSWF1[i+7]); 601 + I915_WRITE(SWF10 + (i << 2), dev_priv->saveSWF1[i]); 602 602 } 603 603 for (i = 0; i < 3; i++) 604 604 I915_WRITE(SWF30 + (i << 2), dev_priv->saveSWF2[i]);
+31 -9
drivers/gpu/drm/i915/intel_bios.c
··· 97 97 parse_lfp_panel_data(struct drm_i915_private *dev_priv, 98 98 struct bdb_header *bdb) 99 99 { 100 - struct drm_device *dev = dev_priv->dev; 101 100 struct bdb_lvds_options *lvds_options; 102 101 struct bdb_lvds_lfp_data *lvds_lfp_data; 103 102 struct bdb_lvds_lfp_data_ptrs *lvds_lfp_data_ptrs; 104 103 struct bdb_lvds_lfp_data_entry *entry; 105 104 struct lvds_dvo_timing *dvo_timing; 106 105 struct drm_display_mode *panel_fixed_mode; 107 - int lfp_data_size; 106 + int lfp_data_size, dvo_timing_offset; 108 107 109 108 /* Defaults if we can't find VBT info */ 110 109 dev_priv->lvds_dither = 0; ··· 132 133 entry = (struct bdb_lvds_lfp_data_entry *) 133 134 ((uint8_t *)lvds_lfp_data->data + (lfp_data_size * 134 135 lvds_options->panel_type)); 136 + dvo_timing_offset = lvds_lfp_data_ptrs->ptr[0].dvo_timing_offset - 137 + lvds_lfp_data_ptrs->ptr[0].fp_timing_offset; 135 138 136 - /* On IGDNG mobile, LVDS data block removes panel fitting registers. 137 - So dec 2 dword from dvo_timing offset */ 138 - if (IS_IGDNG(dev)) 139 - dvo_timing = (struct lvds_dvo_timing *) 140 - ((u8 *)&entry->dvo_timing - 8); 141 - else 142 - dvo_timing = &entry->dvo_timing; 139 + /* 140 + * the size of fp_timing varies on the different platform. 141 + * So calculate the DVO timing relative offset in LVDS data 142 + * entry to get the DVO timing entry 143 + */ 144 + dvo_timing = (struct lvds_dvo_timing *) 145 + ((unsigned char *)entry + dvo_timing_offset); 143 146 144 147 panel_fixed_mode = kzalloc(sizeof(*panel_fixed_mode), GFP_KERNEL); 145 148 ··· 296 295 } 297 296 return; 298 297 } 298 + 299 + static void 300 + parse_driver_features(struct drm_i915_private *dev_priv, 301 + struct bdb_header *bdb) 302 + { 303 + struct drm_device *dev = dev_priv->dev; 304 + struct bdb_driver_features *driver; 305 + 306 + /* set default for chips without eDP */ 307 + if (!SUPPORTS_EDP(dev)) { 308 + dev_priv->edp_support = 0; 309 + return; 310 + } 311 + 312 + driver = find_section(bdb, BDB_DRIVER_FEATURES); 313 + if (driver && driver->lvds_config == BDB_DRIVER_FEATURE_EDP) 314 + dev_priv->edp_support = 1; 315 + } 316 + 299 317 /** 300 318 * intel_init_bios - initialize VBIOS settings & find VBT 301 319 * @dev: DRM device ··· 365 345 parse_lfp_panel_data(dev_priv, bdb); 366 346 parse_sdvo_panel_data(dev_priv, bdb); 367 347 parse_sdvo_device_mapping(dev_priv, bdb); 348 + parse_driver_features(dev_priv, bdb); 349 + 368 350 pci_unmap_rom(pdev, bios); 369 351 370 352 return 0;
+45
drivers/gpu/drm/i915/intel_bios.h
··· 381 381 } __attribute__((packed)); 382 382 383 383 384 + #define BDB_DRIVER_FEATURE_NO_LVDS 0 385 + #define BDB_DRIVER_FEATURE_INT_LVDS 1 386 + #define BDB_DRIVER_FEATURE_SDVO_LVDS 2 387 + #define BDB_DRIVER_FEATURE_EDP 3 388 + 389 + struct bdb_driver_features { 390 + u8 boot_dev_algorithm:1; 391 + u8 block_display_switch:1; 392 + u8 allow_display_switch:1; 393 + u8 hotplug_dvo:1; 394 + u8 dual_view_zoom:1; 395 + u8 int15h_hook:1; 396 + u8 sprite_in_clone:1; 397 + u8 primary_lfp_id:1; 398 + 399 + u16 boot_mode_x; 400 + u16 boot_mode_y; 401 + u8 boot_mode_bpp; 402 + u8 boot_mode_refresh; 403 + 404 + u16 enable_lfp_primary:1; 405 + u16 selective_mode_pruning:1; 406 + u16 dual_frequency:1; 407 + u16 render_clock_freq:1; /* 0: high freq; 1: low freq */ 408 + u16 nt_clone_support:1; 409 + u16 power_scheme_ui:1; /* 0: CUI; 1: 3rd party */ 410 + u16 sprite_display_assign:1; /* 0: secondary; 1: primary */ 411 + u16 cui_aspect_scaling:1; 412 + u16 preserve_aspect_ratio:1; 413 + u16 sdvo_device_power_down:1; 414 + u16 crt_hotplug:1; 415 + u16 lvds_config:2; 416 + u16 tv_hotplug:1; 417 + u16 hdmi_config:2; 418 + 419 + u8 static_display:1; 420 + u8 reserved2:7; 421 + u16 legacy_crt_max_x; 422 + u16 legacy_crt_max_y; 423 + u8 legacy_crt_max_refresh; 424 + 425 + u8 hdmi_termination; 426 + u8 custom_vbt_version; 427 + } __attribute__((packed)); 428 + 384 429 bool intel_init_bios(struct drm_device *dev); 385 430 386 431 /*
+8 -4
drivers/gpu/drm/i915/intel_crt.c
··· 156 156 157 157 temp = adpa = I915_READ(PCH_ADPA); 158 158 159 + adpa &= ~ADPA_DAC_ENABLE; 160 + I915_WRITE(PCH_ADPA, adpa); 161 + 159 162 adpa &= ~ADPA_CRT_HOTPLUG_MASK; 160 163 161 164 adpa |= (ADPA_CRT_HOTPLUG_PERIOD_128 | ··· 172 169 DRM_DEBUG("pch crt adpa 0x%x", adpa); 173 170 I915_WRITE(PCH_ADPA, adpa); 174 171 175 - /* This might not be needed as not specified in spec...*/ 176 - udelay(1000); 172 + while ((I915_READ(PCH_ADPA) & ADPA_CRT_HOTPLUG_FORCE_TRIGGER) != 0) 173 + ; 177 174 178 175 /* Check the status to see if both blue and green are on now */ 179 176 adpa = I915_READ(PCH_ADPA); 180 - if ((adpa & ADPA_CRT_HOTPLUG_MONITOR_MASK) == 181 - ADPA_CRT_HOTPLUG_MONITOR_COLOR) 177 + adpa &= ADPA_CRT_HOTPLUG_MONITOR_MASK; 178 + if ((adpa == ADPA_CRT_HOTPLUG_MONITOR_COLOR) || 179 + (adpa == ADPA_CRT_HOTPLUG_MONITOR_MONO)) 182 180 ret = true; 183 181 else 184 182 ret = false;
+520 -261
drivers/gpu/drm/i915/intel_display.c
··· 34 34 35 35 #include "drm_crtc_helper.h" 36 36 37 + #define HAS_eDP (intel_pipe_has_type(crtc, INTEL_OUTPUT_EDP)) 38 + 37 39 bool intel_pipe_has_type (struct drm_crtc *crtc, int type); 38 40 static void intel_update_watermarks(struct drm_device *dev); 39 41 ··· 90 88 #define I8XX_P2_SLOW 4 91 89 #define I8XX_P2_FAST 2 92 90 #define I8XX_P2_LVDS_SLOW 14 93 - #define I8XX_P2_LVDS_FAST 14 /* No fast option */ 91 + #define I8XX_P2_LVDS_FAST 7 94 92 #define I8XX_P2_SLOW_LIMIT 165000 95 93 96 94 #define I9XX_DOT_MIN 20000 ··· 269 267 270 268 static bool 271 269 intel_find_pll_g4x_dp(const intel_limit_t *, struct drm_crtc *crtc, 270 + int target, int refclk, intel_clock_t *best_clock); 271 + static bool 272 + intel_find_pll_igdng_dp(const intel_limit_t *, struct drm_crtc *crtc, 272 273 int target, int refclk, intel_clock_t *best_clock); 273 274 274 275 static const intel_limit_t intel_limits_i8xx_dvo = { ··· 603 598 return false; 604 599 } 605 600 601 + struct drm_connector * 602 + intel_pipe_get_output (struct drm_crtc *crtc) 603 + { 604 + struct drm_device *dev = crtc->dev; 605 + struct drm_mode_config *mode_config = &dev->mode_config; 606 + struct drm_connector *l_entry, *ret = NULL; 607 + 608 + list_for_each_entry(l_entry, &mode_config->connector_list, head) { 609 + if (l_entry->encoder && 610 + l_entry->encoder->crtc == crtc) { 611 + ret = l_entry; 612 + break; 613 + } 614 + } 615 + return ret; 616 + } 617 + 606 618 #define INTELPllInvalid(s) do { /* DRM_DEBUG(s); */ return false; } while (0) 607 619 /** 608 620 * Returns whether the given set of divisors are valid for a given refclk with ··· 667 645 int err = target; 668 646 669 647 if (IS_I9XX(dev) && intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS) && 670 - (I915_READ(LVDS) & LVDS_PORT_EN) != 0) { 648 + (I915_READ(LVDS)) != 0) { 671 649 /* 672 650 * For LVDS, if the panel is on, just rely on its current 673 651 * settings for dual-channel. We haven't figured out how to ··· 774 752 } 775 753 776 754 static bool 755 + intel_find_pll_igdng_dp(const intel_limit_t *limit, struct drm_crtc *crtc, 756 + int target, int refclk, intel_clock_t *best_clock) 757 + { 758 + struct drm_device *dev = crtc->dev; 759 + intel_clock_t clock; 760 + if (target < 200000) { 761 + clock.n = 1; 762 + clock.p1 = 2; 763 + clock.p2 = 10; 764 + clock.m1 = 12; 765 + clock.m2 = 9; 766 + } else { 767 + clock.n = 2; 768 + clock.p1 = 1; 769 + clock.p2 = 10; 770 + clock.m1 = 14; 771 + clock.m2 = 8; 772 + } 773 + intel_clock(dev, refclk, &clock); 774 + memcpy(best_clock, &clock, sizeof(intel_clock_t)); 775 + return true; 776 + } 777 + 778 + static bool 777 779 intel_igdng_find_best_PLL(const intel_limit_t *limit, struct drm_crtc *crtc, 778 780 int target, int refclk, intel_clock_t *best_clock) 779 781 { ··· 808 762 bool found; 809 763 int err_most = 47; 810 764 found = false; 765 + 766 + /* eDP has only 2 clock choice, no n/m/p setting */ 767 + if (HAS_eDP) 768 + return true; 769 + 770 + if (intel_pipe_has_type(crtc, INTEL_OUTPUT_DISPLAYPORT)) 771 + return intel_find_pll_igdng_dp(limit, crtc, target, 772 + refclk, best_clock); 811 773 812 774 if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) { 813 775 if ((I915_READ(LVDS) & LVDS_CLKB_POWER_MASK) == ··· 1052 998 return 0; 1053 999 } 1054 1000 1001 + /* Disable the VGA plane that we never use */ 1002 + static void i915_disable_vga (struct drm_device *dev) 1003 + { 1004 + struct drm_i915_private *dev_priv = dev->dev_private; 1005 + u8 sr1; 1006 + u32 vga_reg; 1007 + 1008 + if (IS_IGDNG(dev)) 1009 + vga_reg = CPU_VGACNTRL; 1010 + else 1011 + vga_reg = VGACNTRL; 1012 + 1013 + if (I915_READ(vga_reg) & VGA_DISP_DISABLE) 1014 + return; 1015 + 1016 + I915_WRITE8(VGA_SR_INDEX, 1); 1017 + sr1 = I915_READ8(VGA_SR_DATA); 1018 + I915_WRITE8(VGA_SR_DATA, sr1 | (1 << 5)); 1019 + udelay(100); 1020 + 1021 + I915_WRITE(vga_reg, VGA_DISP_DISABLE); 1022 + } 1023 + 1024 + static void igdng_disable_pll_edp (struct drm_crtc *crtc) 1025 + { 1026 + struct drm_device *dev = crtc->dev; 1027 + struct drm_i915_private *dev_priv = dev->dev_private; 1028 + u32 dpa_ctl; 1029 + 1030 + DRM_DEBUG("\n"); 1031 + dpa_ctl = I915_READ(DP_A); 1032 + dpa_ctl &= ~DP_PLL_ENABLE; 1033 + I915_WRITE(DP_A, dpa_ctl); 1034 + } 1035 + 1036 + static void igdng_enable_pll_edp (struct drm_crtc *crtc) 1037 + { 1038 + struct drm_device *dev = crtc->dev; 1039 + struct drm_i915_private *dev_priv = dev->dev_private; 1040 + u32 dpa_ctl; 1041 + 1042 + dpa_ctl = I915_READ(DP_A); 1043 + dpa_ctl |= DP_PLL_ENABLE; 1044 + I915_WRITE(DP_A, dpa_ctl); 1045 + udelay(200); 1046 + } 1047 + 1048 + 1049 + static void igdng_set_pll_edp (struct drm_crtc *crtc, int clock) 1050 + { 1051 + struct drm_device *dev = crtc->dev; 1052 + struct drm_i915_private *dev_priv = dev->dev_private; 1053 + u32 dpa_ctl; 1054 + 1055 + DRM_DEBUG("eDP PLL enable for clock %d\n", clock); 1056 + dpa_ctl = I915_READ(DP_A); 1057 + dpa_ctl &= ~DP_PLL_FREQ_MASK; 1058 + 1059 + if (clock < 200000) { 1060 + u32 temp; 1061 + dpa_ctl |= DP_PLL_FREQ_160MHZ; 1062 + /* workaround for 160Mhz: 1063 + 1) program 0x4600c bits 15:0 = 0x8124 1064 + 2) program 0x46010 bit 0 = 1 1065 + 3) program 0x46034 bit 24 = 1 1066 + 4) program 0x64000 bit 14 = 1 1067 + */ 1068 + temp = I915_READ(0x4600c); 1069 + temp &= 0xffff0000; 1070 + I915_WRITE(0x4600c, temp | 0x8124); 1071 + 1072 + temp = I915_READ(0x46010); 1073 + I915_WRITE(0x46010, temp | 1); 1074 + 1075 + temp = I915_READ(0x46034); 1076 + I915_WRITE(0x46034, temp | (1 << 24)); 1077 + } else { 1078 + dpa_ctl |= DP_PLL_FREQ_270MHZ; 1079 + } 1080 + I915_WRITE(DP_A, dpa_ctl); 1081 + 1082 + udelay(500); 1083 + } 1084 + 1055 1085 static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode) 1056 1086 { 1057 1087 struct drm_device *dev = crtc->dev; ··· 1153 1015 int fdi_rx_imr_reg = (pipe == 0) ? FDI_RXA_IMR : FDI_RXB_IMR; 1154 1016 int transconf_reg = (pipe == 0) ? TRANSACONF : TRANSBCONF; 1155 1017 int pf_ctl_reg = (pipe == 0) ? PFA_CTL_1 : PFB_CTL_1; 1018 + int pf_win_size = (pipe == 0) ? PFA_WIN_SZ : PFB_WIN_SZ; 1156 1019 int cpu_htot_reg = (pipe == 0) ? HTOTAL_A : HTOTAL_B; 1157 1020 int cpu_hblank_reg = (pipe == 0) ? HBLANK_A : HBLANK_B; 1158 1021 int cpu_hsync_reg = (pipe == 0) ? HSYNC_A : HSYNC_B; ··· 1167 1028 int trans_vblank_reg = (pipe == 0) ? TRANS_VBLANK_A : TRANS_VBLANK_B; 1168 1029 int trans_vsync_reg = (pipe == 0) ? TRANS_VSYNC_A : TRANS_VSYNC_B; 1169 1030 u32 temp; 1170 - int tries = 5, j; 1031 + int tries = 5, j, n; 1171 1032 1172 1033 /* XXX: When our outputs are all unaware of DPMS modes other than off 1173 1034 * and on, we should map those modes to DRM_MODE_DPMS_OFF in the CRTC. ··· 1177 1038 case DRM_MODE_DPMS_STANDBY: 1178 1039 case DRM_MODE_DPMS_SUSPEND: 1179 1040 DRM_DEBUG("crtc %d dpms on\n", pipe); 1180 - /* enable PCH DPLL */ 1181 - temp = I915_READ(pch_dpll_reg); 1182 - if ((temp & DPLL_VCO_ENABLE) == 0) { 1183 - I915_WRITE(pch_dpll_reg, temp | DPLL_VCO_ENABLE); 1184 - I915_READ(pch_dpll_reg); 1185 - } 1041 + if (HAS_eDP) { 1042 + /* enable eDP PLL */ 1043 + igdng_enable_pll_edp(crtc); 1044 + } else { 1045 + /* enable PCH DPLL */ 1046 + temp = I915_READ(pch_dpll_reg); 1047 + if ((temp & DPLL_VCO_ENABLE) == 0) { 1048 + I915_WRITE(pch_dpll_reg, temp | DPLL_VCO_ENABLE); 1049 + I915_READ(pch_dpll_reg); 1050 + } 1186 1051 1187 - /* enable PCH FDI RX PLL, wait warmup plus DMI latency */ 1188 - temp = I915_READ(fdi_rx_reg); 1189 - I915_WRITE(fdi_rx_reg, temp | FDI_RX_PLL_ENABLE | 1190 - FDI_SEL_PCDCLK | 1191 - FDI_DP_PORT_WIDTH_X4); /* default 4 lanes */ 1192 - I915_READ(fdi_rx_reg); 1193 - udelay(200); 1052 + /* enable PCH FDI RX PLL, wait warmup plus DMI latency */ 1053 + temp = I915_READ(fdi_rx_reg); 1054 + I915_WRITE(fdi_rx_reg, temp | FDI_RX_PLL_ENABLE | 1055 + FDI_SEL_PCDCLK | 1056 + FDI_DP_PORT_WIDTH_X4); /* default 4 lanes */ 1057 + I915_READ(fdi_rx_reg); 1058 + udelay(200); 1194 1059 1195 - /* Enable CPU FDI TX PLL, always on for IGDNG */ 1196 - temp = I915_READ(fdi_tx_reg); 1197 - if ((temp & FDI_TX_PLL_ENABLE) == 0) { 1198 - I915_WRITE(fdi_tx_reg, temp | FDI_TX_PLL_ENABLE); 1199 - I915_READ(fdi_tx_reg); 1200 - udelay(100); 1060 + /* Enable CPU FDI TX PLL, always on for IGDNG */ 1061 + temp = I915_READ(fdi_tx_reg); 1062 + if ((temp & FDI_TX_PLL_ENABLE) == 0) { 1063 + I915_WRITE(fdi_tx_reg, temp | FDI_TX_PLL_ENABLE); 1064 + I915_READ(fdi_tx_reg); 1065 + udelay(100); 1066 + } 1201 1067 } 1202 1068 1203 1069 /* Enable CPU pipe */ ··· 1221 1077 I915_WRITE(dspbase_reg, I915_READ(dspbase_reg)); 1222 1078 } 1223 1079 1224 - /* enable CPU FDI TX and PCH FDI RX */ 1225 - temp = I915_READ(fdi_tx_reg); 1226 - temp |= FDI_TX_ENABLE; 1227 - temp |= FDI_DP_PORT_WIDTH_X4; /* default */ 1228 - temp &= ~FDI_LINK_TRAIN_NONE; 1229 - temp |= FDI_LINK_TRAIN_PATTERN_1; 1230 - I915_WRITE(fdi_tx_reg, temp); 1231 - I915_READ(fdi_tx_reg); 1080 + if (!HAS_eDP) { 1081 + /* enable CPU FDI TX and PCH FDI RX */ 1082 + temp = I915_READ(fdi_tx_reg); 1083 + temp |= FDI_TX_ENABLE; 1084 + temp |= FDI_DP_PORT_WIDTH_X4; /* default */ 1085 + temp &= ~FDI_LINK_TRAIN_NONE; 1086 + temp |= FDI_LINK_TRAIN_PATTERN_1; 1087 + I915_WRITE(fdi_tx_reg, temp); 1088 + I915_READ(fdi_tx_reg); 1232 1089 1233 - temp = I915_READ(fdi_rx_reg); 1234 - temp &= ~FDI_LINK_TRAIN_NONE; 1235 - temp |= FDI_LINK_TRAIN_PATTERN_1; 1236 - I915_WRITE(fdi_rx_reg, temp | FDI_RX_ENABLE); 1237 - I915_READ(fdi_rx_reg); 1090 + temp = I915_READ(fdi_rx_reg); 1091 + temp &= ~FDI_LINK_TRAIN_NONE; 1092 + temp |= FDI_LINK_TRAIN_PATTERN_1; 1093 + I915_WRITE(fdi_rx_reg, temp | FDI_RX_ENABLE); 1094 + I915_READ(fdi_rx_reg); 1238 1095 1239 - udelay(150); 1096 + udelay(150); 1240 1097 1241 - /* Train FDI. */ 1242 - /* umask FDI RX Interrupt symbol_lock and bit_lock bit 1243 - for train result */ 1244 - temp = I915_READ(fdi_rx_imr_reg); 1245 - temp &= ~FDI_RX_SYMBOL_LOCK; 1246 - temp &= ~FDI_RX_BIT_LOCK; 1247 - I915_WRITE(fdi_rx_imr_reg, temp); 1248 - I915_READ(fdi_rx_imr_reg); 1249 - udelay(150); 1098 + /* Train FDI. */ 1099 + /* umask FDI RX Interrupt symbol_lock and bit_lock bit 1100 + for train result */ 1101 + temp = I915_READ(fdi_rx_imr_reg); 1102 + temp &= ~FDI_RX_SYMBOL_LOCK; 1103 + temp &= ~FDI_RX_BIT_LOCK; 1104 + I915_WRITE(fdi_rx_imr_reg, temp); 1105 + I915_READ(fdi_rx_imr_reg); 1106 + udelay(150); 1250 1107 1251 - temp = I915_READ(fdi_rx_iir_reg); 1252 - DRM_DEBUG("FDI_RX_IIR 0x%x\n", temp); 1108 + temp = I915_READ(fdi_rx_iir_reg); 1109 + DRM_DEBUG("FDI_RX_IIR 0x%x\n", temp); 1253 1110 1254 - if ((temp & FDI_RX_BIT_LOCK) == 0) { 1255 - for (j = 0; j < tries; j++) { 1256 - temp = I915_READ(fdi_rx_iir_reg); 1257 - DRM_DEBUG("FDI_RX_IIR 0x%x\n", temp); 1258 - if (temp & FDI_RX_BIT_LOCK) 1259 - break; 1260 - udelay(200); 1261 - } 1262 - if (j != tries) 1111 + if ((temp & FDI_RX_BIT_LOCK) == 0) { 1112 + for (j = 0; j < tries; j++) { 1113 + temp = I915_READ(fdi_rx_iir_reg); 1114 + DRM_DEBUG("FDI_RX_IIR 0x%x\n", temp); 1115 + if (temp & FDI_RX_BIT_LOCK) 1116 + break; 1117 + udelay(200); 1118 + } 1119 + if (j != tries) 1120 + I915_WRITE(fdi_rx_iir_reg, 1121 + temp | FDI_RX_BIT_LOCK); 1122 + else 1123 + DRM_DEBUG("train 1 fail\n"); 1124 + } else { 1263 1125 I915_WRITE(fdi_rx_iir_reg, 1264 1126 temp | FDI_RX_BIT_LOCK); 1265 - else 1266 - DRM_DEBUG("train 1 fail\n"); 1267 - } else { 1268 - I915_WRITE(fdi_rx_iir_reg, 1269 - temp | FDI_RX_BIT_LOCK); 1270 - DRM_DEBUG("train 1 ok 2!\n"); 1271 - } 1272 - temp = I915_READ(fdi_tx_reg); 1273 - temp &= ~FDI_LINK_TRAIN_NONE; 1274 - temp |= FDI_LINK_TRAIN_PATTERN_2; 1275 - I915_WRITE(fdi_tx_reg, temp); 1276 - 1277 - temp = I915_READ(fdi_rx_reg); 1278 - temp &= ~FDI_LINK_TRAIN_NONE; 1279 - temp |= FDI_LINK_TRAIN_PATTERN_2; 1280 - I915_WRITE(fdi_rx_reg, temp); 1281 - 1282 - udelay(150); 1283 - 1284 - temp = I915_READ(fdi_rx_iir_reg); 1285 - DRM_DEBUG("FDI_RX_IIR 0x%x\n", temp); 1286 - 1287 - if ((temp & FDI_RX_SYMBOL_LOCK) == 0) { 1288 - for (j = 0; j < tries; j++) { 1289 - temp = I915_READ(fdi_rx_iir_reg); 1290 - DRM_DEBUG("FDI_RX_IIR 0x%x\n", temp); 1291 - if (temp & FDI_RX_SYMBOL_LOCK) 1292 - break; 1293 - udelay(200); 1127 + DRM_DEBUG("train 1 ok 2!\n"); 1294 1128 } 1295 - if (j != tries) { 1129 + temp = I915_READ(fdi_tx_reg); 1130 + temp &= ~FDI_LINK_TRAIN_NONE; 1131 + temp |= FDI_LINK_TRAIN_PATTERN_2; 1132 + I915_WRITE(fdi_tx_reg, temp); 1133 + 1134 + temp = I915_READ(fdi_rx_reg); 1135 + temp &= ~FDI_LINK_TRAIN_NONE; 1136 + temp |= FDI_LINK_TRAIN_PATTERN_2; 1137 + I915_WRITE(fdi_rx_reg, temp); 1138 + 1139 + udelay(150); 1140 + 1141 + temp = I915_READ(fdi_rx_iir_reg); 1142 + DRM_DEBUG("FDI_RX_IIR 0x%x\n", temp); 1143 + 1144 + if ((temp & FDI_RX_SYMBOL_LOCK) == 0) { 1145 + for (j = 0; j < tries; j++) { 1146 + temp = I915_READ(fdi_rx_iir_reg); 1147 + DRM_DEBUG("FDI_RX_IIR 0x%x\n", temp); 1148 + if (temp & FDI_RX_SYMBOL_LOCK) 1149 + break; 1150 + udelay(200); 1151 + } 1152 + if (j != tries) { 1153 + I915_WRITE(fdi_rx_iir_reg, 1154 + temp | FDI_RX_SYMBOL_LOCK); 1155 + DRM_DEBUG("train 2 ok 1!\n"); 1156 + } else 1157 + DRM_DEBUG("train 2 fail\n"); 1158 + } else { 1296 1159 I915_WRITE(fdi_rx_iir_reg, 1297 1160 temp | FDI_RX_SYMBOL_LOCK); 1298 - DRM_DEBUG("train 2 ok 1!\n"); 1299 - } else 1300 - DRM_DEBUG("train 2 fail\n"); 1301 - } else { 1302 - I915_WRITE(fdi_rx_iir_reg, temp | FDI_RX_SYMBOL_LOCK); 1303 - DRM_DEBUG("train 2 ok 2!\n"); 1161 + DRM_DEBUG("train 2 ok 2!\n"); 1162 + } 1163 + DRM_DEBUG("train done\n"); 1164 + 1165 + /* set transcoder timing */ 1166 + I915_WRITE(trans_htot_reg, I915_READ(cpu_htot_reg)); 1167 + I915_WRITE(trans_hblank_reg, I915_READ(cpu_hblank_reg)); 1168 + I915_WRITE(trans_hsync_reg, I915_READ(cpu_hsync_reg)); 1169 + 1170 + I915_WRITE(trans_vtot_reg, I915_READ(cpu_vtot_reg)); 1171 + I915_WRITE(trans_vblank_reg, I915_READ(cpu_vblank_reg)); 1172 + I915_WRITE(trans_vsync_reg, I915_READ(cpu_vsync_reg)); 1173 + 1174 + /* enable PCH transcoder */ 1175 + temp = I915_READ(transconf_reg); 1176 + I915_WRITE(transconf_reg, temp | TRANS_ENABLE); 1177 + I915_READ(transconf_reg); 1178 + 1179 + while ((I915_READ(transconf_reg) & TRANS_STATE_ENABLE) == 0) 1180 + ; 1181 + 1182 + /* enable normal */ 1183 + 1184 + temp = I915_READ(fdi_tx_reg); 1185 + temp &= ~FDI_LINK_TRAIN_NONE; 1186 + I915_WRITE(fdi_tx_reg, temp | FDI_LINK_TRAIN_NONE | 1187 + FDI_TX_ENHANCE_FRAME_ENABLE); 1188 + I915_READ(fdi_tx_reg); 1189 + 1190 + temp = I915_READ(fdi_rx_reg); 1191 + temp &= ~FDI_LINK_TRAIN_NONE; 1192 + I915_WRITE(fdi_rx_reg, temp | FDI_LINK_TRAIN_NONE | 1193 + FDI_RX_ENHANCE_FRAME_ENABLE); 1194 + I915_READ(fdi_rx_reg); 1195 + 1196 + /* wait one idle pattern time */ 1197 + udelay(100); 1198 + 1304 1199 } 1305 - DRM_DEBUG("train done\n"); 1306 - 1307 - /* set transcoder timing */ 1308 - I915_WRITE(trans_htot_reg, I915_READ(cpu_htot_reg)); 1309 - I915_WRITE(trans_hblank_reg, I915_READ(cpu_hblank_reg)); 1310 - I915_WRITE(trans_hsync_reg, I915_READ(cpu_hsync_reg)); 1311 - 1312 - I915_WRITE(trans_vtot_reg, I915_READ(cpu_vtot_reg)); 1313 - I915_WRITE(trans_vblank_reg, I915_READ(cpu_vblank_reg)); 1314 - I915_WRITE(trans_vsync_reg, I915_READ(cpu_vsync_reg)); 1315 - 1316 - /* enable PCH transcoder */ 1317 - temp = I915_READ(transconf_reg); 1318 - I915_WRITE(transconf_reg, temp | TRANS_ENABLE); 1319 - I915_READ(transconf_reg); 1320 - 1321 - while ((I915_READ(transconf_reg) & TRANS_STATE_ENABLE) == 0) 1322 - ; 1323 - 1324 - /* enable normal */ 1325 - 1326 - temp = I915_READ(fdi_tx_reg); 1327 - temp &= ~FDI_LINK_TRAIN_NONE; 1328 - I915_WRITE(fdi_tx_reg, temp | FDI_LINK_TRAIN_NONE | 1329 - FDI_TX_ENHANCE_FRAME_ENABLE); 1330 - I915_READ(fdi_tx_reg); 1331 - 1332 - temp = I915_READ(fdi_rx_reg); 1333 - temp &= ~FDI_LINK_TRAIN_NONE; 1334 - I915_WRITE(fdi_rx_reg, temp | FDI_LINK_TRAIN_NONE | 1335 - FDI_RX_ENHANCE_FRAME_ENABLE); 1336 - I915_READ(fdi_rx_reg); 1337 - 1338 - /* wait one idle pattern time */ 1339 - udelay(100); 1340 1200 1341 1201 intel_crtc_load_lut(crtc); 1342 1202 ··· 1348 1200 case DRM_MODE_DPMS_OFF: 1349 1201 DRM_DEBUG("crtc %d dpms off\n", pipe); 1350 1202 1351 - /* Disable the VGA plane that we never use */ 1352 - I915_WRITE(CPU_VGACNTRL, VGA_DISP_DISABLE); 1203 + i915_disable_vga(dev); 1353 1204 1354 1205 /* Disable display plane */ 1355 1206 temp = I915_READ(dspcntr_reg); ··· 1364 1217 if ((temp & PIPEACONF_ENABLE) != 0) { 1365 1218 I915_WRITE(pipeconf_reg, temp & ~PIPEACONF_ENABLE); 1366 1219 I915_READ(pipeconf_reg); 1220 + n = 0; 1367 1221 /* wait for cpu pipe off, pipe state */ 1368 - while ((I915_READ(pipeconf_reg) & I965_PIPECONF_ACTIVE) != 0) 1369 - ; 1222 + while ((I915_READ(pipeconf_reg) & I965_PIPECONF_ACTIVE) != 0) { 1223 + n++; 1224 + if (n < 60) { 1225 + udelay(500); 1226 + continue; 1227 + } else { 1228 + DRM_DEBUG("pipe %d off delay\n", pipe); 1229 + break; 1230 + } 1231 + } 1370 1232 } else 1371 1233 DRM_DEBUG("crtc %d is disabled\n", pipe); 1372 1234 1373 - /* IGDNG-A : disable cpu panel fitter ? */ 1374 - temp = I915_READ(pf_ctl_reg); 1375 - if ((temp & PF_ENABLE) != 0) { 1376 - I915_WRITE(pf_ctl_reg, temp & ~PF_ENABLE); 1377 - I915_READ(pf_ctl_reg); 1235 + if (HAS_eDP) { 1236 + igdng_disable_pll_edp(crtc); 1378 1237 } 1379 1238 1380 1239 /* disable CPU FDI tx and PCH FDI rx */ ··· 1391 1238 temp = I915_READ(fdi_rx_reg); 1392 1239 I915_WRITE(fdi_rx_reg, temp & ~FDI_RX_ENABLE); 1393 1240 I915_READ(fdi_rx_reg); 1241 + 1242 + udelay(100); 1394 1243 1395 1244 /* still set train pattern 1 */ 1396 1245 temp = I915_READ(fdi_tx_reg); ··· 1405 1250 temp |= FDI_LINK_TRAIN_PATTERN_1; 1406 1251 I915_WRITE(fdi_rx_reg, temp); 1407 1252 1253 + udelay(100); 1254 + 1408 1255 /* disable PCH transcoder */ 1409 1256 temp = I915_READ(transconf_reg); 1410 1257 if ((temp & TRANS_ENABLE) != 0) { 1411 1258 I915_WRITE(transconf_reg, temp & ~TRANS_ENABLE); 1412 1259 I915_READ(transconf_reg); 1260 + n = 0; 1413 1261 /* wait for PCH transcoder off, transcoder state */ 1414 - while ((I915_READ(transconf_reg) & TRANS_STATE_ENABLE) != 0) 1415 - ; 1262 + while ((I915_READ(transconf_reg) & TRANS_STATE_ENABLE) != 0) { 1263 + n++; 1264 + if (n < 60) { 1265 + udelay(500); 1266 + continue; 1267 + } else { 1268 + DRM_DEBUG("transcoder %d off delay\n", pipe); 1269 + break; 1270 + } 1271 + } 1416 1272 } 1417 1273 1418 1274 /* disable PCH DPLL */ ··· 1440 1274 I915_WRITE(fdi_rx_reg, temp); 1441 1275 I915_READ(fdi_rx_reg); 1442 1276 } 1277 + 1278 + /* Disable CPU FDI TX PLL */ 1279 + temp = I915_READ(fdi_tx_reg); 1280 + if ((temp & FDI_TX_PLL_ENABLE) != 0) { 1281 + I915_WRITE(fdi_tx_reg, temp & ~FDI_TX_PLL_ENABLE); 1282 + I915_READ(fdi_tx_reg); 1283 + udelay(100); 1284 + } 1285 + 1286 + /* Disable PF */ 1287 + temp = I915_READ(pf_ctl_reg); 1288 + if ((temp & PF_ENABLE) != 0) { 1289 + I915_WRITE(pf_ctl_reg, temp & ~PF_ENABLE); 1290 + I915_READ(pf_ctl_reg); 1291 + } 1292 + I915_WRITE(pf_win_size, 0); 1443 1293 1444 1294 /* Wait for the clocks to turn off. */ 1445 1295 udelay(150); ··· 1524 1342 //intel_crtc_dpms_video(crtc, FALSE); TODO 1525 1343 1526 1344 /* Disable the VGA plane that we never use */ 1527 - I915_WRITE(VGACNTRL, VGA_DISP_DISABLE); 1345 + i915_disable_vga(dev); 1528 1346 1529 1347 /* Disable display plane */ 1530 1348 temp = I915_READ(dspcntr_reg); ··· 1805 1623 IGD_FIFO_LINE_SIZE 1806 1624 }; 1807 1625 static struct intel_watermark_params i945_wm_info = { 1808 - I915_FIFO_LINE_SIZE, 1809 - I915_MAX_WM, 1810 - 1, 1811 - 0, 1812 - IGD_FIFO_LINE_SIZE 1813 - }; 1814 - static struct intel_watermark_params i915_wm_info = { 1815 1626 I945_FIFO_SIZE, 1816 1627 I915_MAX_WM, 1817 1628 1, 1818 - 0, 1629 + 2, 1630 + I915_FIFO_LINE_SIZE 1631 + }; 1632 + static struct intel_watermark_params i915_wm_info = { 1633 + I915_FIFO_SIZE, 1634 + I915_MAX_WM, 1635 + 1, 1636 + 2, 1819 1637 I915_FIFO_LINE_SIZE 1820 1638 }; 1821 1639 static struct intel_watermark_params i855_wm_info = { 1822 1640 I855GM_FIFO_SIZE, 1823 1641 I915_MAX_WM, 1824 1642 1, 1825 - 0, 1643 + 2, 1826 1644 I830_FIFO_LINE_SIZE 1827 1645 }; 1828 1646 static struct intel_watermark_params i830_wm_info = { 1829 1647 I830_FIFO_SIZE, 1830 1648 I915_MAX_WM, 1831 1649 1, 1832 - 0, 1650 + 2, 1833 1651 I830_FIFO_LINE_SIZE 1834 1652 }; 1835 1653 1654 + /** 1655 + * intel_calculate_wm - calculate watermark level 1656 + * @clock_in_khz: pixel clock 1657 + * @wm: chip FIFO params 1658 + * @pixel_size: display pixel size 1659 + * @latency_ns: memory latency for the platform 1660 + * 1661 + * Calculate the watermark level (the level at which the display plane will 1662 + * start fetching from memory again). Each chip has a different display 1663 + * FIFO size and allocation, so the caller needs to figure that out and pass 1664 + * in the correct intel_watermark_params structure. 1665 + * 1666 + * As the pixel clock runs, the FIFO will be drained at a rate that depends 1667 + * on the pixel size. When it reaches the watermark level, it'll start 1668 + * fetching FIFO line sized based chunks from memory until the FIFO fills 1669 + * past the watermark point. If the FIFO drains completely, a FIFO underrun 1670 + * will occur, and a display engine hang could result. 1671 + */ 1836 1672 static unsigned long intel_calculate_wm(unsigned long clock_in_khz, 1837 1673 struct intel_watermark_params *wm, 1838 1674 int pixel_size, 1839 1675 unsigned long latency_ns) 1840 1676 { 1841 - unsigned long bytes_required, wm_size; 1677 + long entries_required, wm_size; 1842 1678 1843 - bytes_required = (clock_in_khz * pixel_size * latency_ns) / 1000000; 1844 - bytes_required /= wm->cacheline_size; 1845 - wm_size = wm->fifo_size - bytes_required - wm->guard_size; 1679 + entries_required = (clock_in_khz * pixel_size * latency_ns) / 1000000; 1680 + entries_required /= wm->cacheline_size; 1846 1681 1847 - if (wm_size > wm->max_wm) 1682 + DRM_DEBUG("FIFO entries required for mode: %d\n", entries_required); 1683 + 1684 + wm_size = wm->fifo_size - (entries_required + wm->guard_size); 1685 + 1686 + DRM_DEBUG("FIFO watermark level: %d\n", wm_size); 1687 + 1688 + /* Don't promote wm_size to unsigned... */ 1689 + if (wm_size > (long)wm->max_wm) 1848 1690 wm_size = wm->max_wm; 1849 - if (wm_size == 0) 1691 + if (wm_size <= 0) 1850 1692 wm_size = wm->default_wm; 1851 1693 return wm_size; 1852 1694 } ··· 2005 1799 return; 2006 1800 } 2007 1801 2008 - const static int latency_ns = 5000; /* default for non-igd platforms */ 1802 + const static int latency_ns = 3000; /* default for non-igd platforms */ 2009 1803 1804 + static int intel_get_fifo_size(struct drm_device *dev, int plane) 1805 + { 1806 + struct drm_i915_private *dev_priv = dev->dev_private; 1807 + uint32_t dsparb = I915_READ(DSPARB); 1808 + int size; 1809 + 1810 + if (IS_I9XX(dev)) { 1811 + if (plane == 0) 1812 + size = dsparb & 0x7f; 1813 + else 1814 + size = ((dsparb >> DSPARB_CSTART_SHIFT) & 0x7f) - 1815 + (dsparb & 0x7f); 1816 + } else if (IS_I85X(dev)) { 1817 + if (plane == 0) 1818 + size = dsparb & 0x1ff; 1819 + else 1820 + size = ((dsparb >> DSPARB_BEND_SHIFT) & 0x1ff) - 1821 + (dsparb & 0x1ff); 1822 + size >>= 1; /* Convert to cachelines */ 1823 + } else if (IS_845G(dev)) { 1824 + size = dsparb & 0x7f; 1825 + size >>= 2; /* Convert to cachelines */ 1826 + } else { 1827 + size = dsparb & 0x7f; 1828 + size >>= 1; /* Convert to cachelines */ 1829 + } 1830 + 1831 + DRM_DEBUG("FIFO size - (0x%08x) %s: %d\n", dsparb, plane ? "B" : "A", 1832 + size); 1833 + 1834 + return size; 1835 + } 2010 1836 2011 1837 static void i965_update_wm(struct drm_device *dev) 2012 1838 { ··· 2055 1817 int planeb_clock, int sr_hdisplay, int pixel_size) 2056 1818 { 2057 1819 struct drm_i915_private *dev_priv = dev->dev_private; 2058 - uint32_t fwater_lo = I915_READ(FW_BLC) & MM_FIFO_WATERMARK; 2059 - uint32_t fwater_hi = I915_READ(FW_BLC2) & LM_FIFO_WATERMARK; 2060 - int bsize, asize, cwm, bwm = 1, awm = 1, srwm = 1; 2061 - uint32_t dsparb = I915_READ(DSPARB); 2062 - int planea_entries, planeb_entries; 2063 - struct intel_watermark_params *wm_params; 1820 + uint32_t fwater_lo; 1821 + uint32_t fwater_hi; 1822 + int total_size, cacheline_size, cwm, srwm = 1; 1823 + int planea_wm, planeb_wm; 1824 + struct intel_watermark_params planea_params, planeb_params; 2064 1825 unsigned long line_time_us; 2065 1826 int sr_clock, sr_entries = 0; 2066 1827 1828 + /* Create copies of the base settings for each pipe */ 2067 1829 if (IS_I965GM(dev) || IS_I945GM(dev)) 2068 - wm_params = &i945_wm_info; 1830 + planea_params = planeb_params = i945_wm_info; 2069 1831 else if (IS_I9XX(dev)) 2070 - wm_params = &i915_wm_info; 1832 + planea_params = planeb_params = i915_wm_info; 2071 1833 else 2072 - wm_params = &i855_wm_info; 1834 + planea_params = planeb_params = i855_wm_info; 2073 1835 2074 - planea_entries = intel_calculate_wm(planea_clock, wm_params, 2075 - pixel_size, latency_ns); 2076 - planeb_entries = intel_calculate_wm(planeb_clock, wm_params, 2077 - pixel_size, latency_ns); 1836 + /* Grab a couple of global values before we overwrite them */ 1837 + total_size = planea_params.fifo_size; 1838 + cacheline_size = planea_params.cacheline_size; 2078 1839 2079 - DRM_DEBUG("FIFO entries - A: %d, B: %d\n", planea_entries, 2080 - planeb_entries); 1840 + /* Update per-plane FIFO sizes */ 1841 + planea_params.fifo_size = intel_get_fifo_size(dev, 0); 1842 + planeb_params.fifo_size = intel_get_fifo_size(dev, 1); 2081 1843 2082 - if (IS_I9XX(dev)) { 2083 - asize = dsparb & 0x7f; 2084 - bsize = (dsparb >> DSPARB_CSTART_SHIFT) & 0x7f; 2085 - } else { 2086 - asize = dsparb & 0x1ff; 2087 - bsize = (dsparb >> DSPARB_BEND_SHIFT) & 0x1ff; 2088 - } 2089 - DRM_DEBUG("FIFO size - A: %d, B: %d\n", asize, bsize); 2090 - 2091 - /* Two extra entries for padding */ 2092 - awm = asize - (planea_entries + 2); 2093 - bwm = bsize - (planeb_entries + 2); 2094 - 2095 - /* Sanity check against potentially bad FIFO allocations */ 2096 - if (awm <= 0) { 2097 - /* pipe is on but has too few FIFO entries */ 2098 - if (planea_entries != 0) 2099 - DRM_DEBUG("plane A needs more FIFO entries\n"); 2100 - awm = 1; 2101 - } 2102 - if (bwm <= 0) { 2103 - if (planeb_entries != 0) 2104 - DRM_DEBUG("plane B needs more FIFO entries\n"); 2105 - bwm = 1; 2106 - } 1844 + planea_wm = intel_calculate_wm(planea_clock, &planea_params, 1845 + pixel_size, latency_ns); 1846 + planeb_wm = intel_calculate_wm(planeb_clock, &planeb_params, 1847 + pixel_size, latency_ns); 1848 + DRM_DEBUG("FIFO watermarks - A: %d, B: %d\n", planea_wm, planeb_wm); 2107 1849 2108 1850 /* 2109 1851 * Overlay gets an aggressive default since video jitter is bad. 2110 1852 */ 2111 1853 cwm = 2; 2112 1854 2113 - /* Calc sr entries for one pipe configs */ 2114 - if (!planea_clock || !planeb_clock) { 1855 + /* Calc sr entries for one plane configs */ 1856 + if (sr_hdisplay && (!planea_clock || !planeb_clock)) { 1857 + /* self-refresh has much higher latency */ 1858 + const static int sr_latency_ns = 6000; 1859 + 2115 1860 sr_clock = planea_clock ? planea_clock : planeb_clock; 2116 - line_time_us = (sr_hdisplay * 1000) / sr_clock; 2117 - sr_entries = (((latency_ns / line_time_us) + 1) * pixel_size * 2118 - sr_hdisplay) / 1000; 2119 - sr_entries = roundup(sr_entries / wm_params->cacheline_size, 1); 2120 - if (sr_entries < wm_params->fifo_size) 2121 - srwm = wm_params->fifo_size - sr_entries; 1861 + line_time_us = ((sr_hdisplay * 1000) / sr_clock); 1862 + 1863 + /* Use ns/us then divide to preserve precision */ 1864 + sr_entries = (((sr_latency_ns / line_time_us) + 1) * 1865 + pixel_size * sr_hdisplay) / 1000; 1866 + sr_entries = roundup(sr_entries / cacheline_size, 1); 1867 + DRM_DEBUG("self-refresh entries: %d\n", sr_entries); 1868 + srwm = total_size - sr_entries; 1869 + if (srwm < 0) 1870 + srwm = 1; 1871 + if (IS_I9XX(dev)) 1872 + I915_WRITE(FW_BLC_SELF, (srwm & 0x3f)); 2122 1873 } 2123 1874 2124 1875 DRM_DEBUG("Setting FIFO watermarks - A: %d, B: %d, C: %d, SR %d\n", 2125 - awm, bwm, cwm, srwm); 1876 + planea_wm, planeb_wm, cwm, srwm); 2126 1877 2127 - fwater_lo = fwater_lo | ((bwm & 0x3f) << 16) | (awm & 0x3f); 2128 - fwater_hi = fwater_hi | (cwm & 0x1f); 1878 + fwater_lo = ((planeb_wm & 0x3f) << 16) | (planea_wm & 0x3f); 1879 + fwater_hi = (cwm & 0x1f); 1880 + 1881 + /* Set request length to 8 cachelines per fetch */ 1882 + fwater_lo = fwater_lo | (1 << 24) | (1 << 8); 1883 + fwater_hi = fwater_hi | (1 << 8); 2129 1884 2130 1885 I915_WRITE(FW_BLC, fwater_lo); 2131 1886 I915_WRITE(FW_BLC2, fwater_hi); 2132 - if (IS_I9XX(dev)) 2133 - I915_WRITE(FW_BLC_SELF, FW_BLC_SELF_EN | (srwm & 0x3f)); 2134 1887 } 2135 1888 2136 1889 static void i830_update_wm(struct drm_device *dev, int planea_clock, 2137 1890 int pixel_size) 2138 1891 { 2139 1892 struct drm_i915_private *dev_priv = dev->dev_private; 2140 - uint32_t dsparb = I915_READ(DSPARB); 2141 - uint32_t fwater_lo = I915_READ(FW_BLC) & MM_FIFO_WATERMARK; 2142 - unsigned int asize, awm; 2143 - int planea_entries; 1893 + uint32_t fwater_lo = I915_READ(FW_BLC) & ~0xfff; 1894 + int planea_wm; 2144 1895 2145 - planea_entries = intel_calculate_wm(planea_clock, &i830_wm_info, 2146 - pixel_size, latency_ns); 1896 + i830_wm_info.fifo_size = intel_get_fifo_size(dev, 0); 2147 1897 2148 - asize = dsparb & 0x7f; 1898 + planea_wm = intel_calculate_wm(planea_clock, &i830_wm_info, 1899 + pixel_size, latency_ns); 1900 + fwater_lo |= (3<<8) | planea_wm; 2149 1901 2150 - awm = asize - planea_entries; 2151 - 2152 - fwater_lo = fwater_lo | awm; 1902 + DRM_DEBUG("Setting FIFO watermarks - A: %d\n", planea_wm); 2153 1903 2154 1904 I915_WRITE(FW_BLC, fwater_lo); 2155 1905 } ··· 2210 1984 if (enabled <= 0) 2211 1985 return; 2212 1986 2213 - /* Single pipe configs can enable self refresh */ 1987 + /* Single plane configs can enable self refresh */ 2214 1988 if (enabled == 1 && IS_IGD(dev)) 2215 1989 igd_enable_cxsr(dev, sr_clock, pixel_size); 2216 1990 else if (IS_IGD(dev)) ··· 2254 2028 u32 dpll = 0, fp = 0, dspcntr, pipeconf; 2255 2029 bool ok, is_sdvo = false, is_dvo = false; 2256 2030 bool is_crt = false, is_lvds = false, is_tv = false, is_dp = false; 2031 + bool is_edp = false; 2257 2032 struct drm_mode_config *mode_config = &dev->mode_config; 2258 2033 struct drm_connector *connector; 2259 2034 const intel_limit_t *limit; ··· 2270 2043 int lvds_reg = LVDS; 2271 2044 u32 temp; 2272 2045 int sdvo_pixel_multiply; 2046 + int target_clock; 2273 2047 2274 2048 drm_vblank_pre_modeset(dev, pipe); 2275 2049 ··· 2301 2073 break; 2302 2074 case INTEL_OUTPUT_DISPLAYPORT: 2303 2075 is_dp = true; 2076 + break; 2077 + case INTEL_OUTPUT_EDP: 2078 + is_edp = true; 2304 2079 break; 2305 2080 } 2306 2081 ··· 2356 2125 } 2357 2126 2358 2127 /* FDI link */ 2359 - if (IS_IGDNG(dev)) 2360 - igdng_compute_m_n(3, 4, /* lane num 4 */ 2361 - adjusted_mode->clock, 2362 - 270000, /* lane clock */ 2363 - &m_n); 2128 + if (IS_IGDNG(dev)) { 2129 + int lane, link_bw; 2130 + /* eDP doesn't require FDI link, so just set DP M/N 2131 + according to current link config */ 2132 + if (is_edp) { 2133 + struct drm_connector *edp; 2134 + target_clock = mode->clock; 2135 + edp = intel_pipe_get_output(crtc); 2136 + intel_edp_link_config(to_intel_output(edp), 2137 + &lane, &link_bw); 2138 + } else { 2139 + /* DP over FDI requires target mode clock 2140 + instead of link clock */ 2141 + if (is_dp) 2142 + target_clock = mode->clock; 2143 + else 2144 + target_clock = adjusted_mode->clock; 2145 + lane = 4; 2146 + link_bw = 270000; 2147 + } 2148 + igdng_compute_m_n(3, lane, target_clock, 2149 + link_bw, &m_n); 2150 + } 2364 2151 2365 2152 if (IS_IGD(dev)) 2366 2153 fp = (1 << clock.n) << 16 | clock.m1 << 8 | clock.m2; ··· 2499 2250 dpll_reg = pch_dpll_reg; 2500 2251 } 2501 2252 2502 - if (dpll & DPLL_VCO_ENABLE) { 2253 + if (is_edp) { 2254 + igdng_disable_pll_edp(crtc); 2255 + } else if ((dpll & DPLL_VCO_ENABLE)) { 2503 2256 I915_WRITE(fp_reg, fp); 2504 2257 I915_WRITE(dpll_reg, dpll & ~DPLL_VCO_ENABLE); 2505 2258 I915_READ(dpll_reg); 2506 2259 udelay(150); 2507 - } 2508 - 2509 - if (IS_IGDNG(dev)) { 2510 - /* enable PCH clock reference source */ 2511 - /* XXX need to change the setting for other outputs */ 2512 - u32 temp; 2513 - temp = I915_READ(PCH_DREF_CONTROL); 2514 - temp &= ~DREF_NONSPREAD_SOURCE_MASK; 2515 - temp |= DREF_NONSPREAD_CK505_ENABLE; 2516 - temp &= ~DREF_SSC_SOURCE_MASK; 2517 - temp |= DREF_SSC_SOURCE_ENABLE; 2518 - temp &= ~DREF_SSC1_ENABLE; 2519 - /* if no eDP, disable source output to CPU */ 2520 - temp &= ~DREF_CPU_SOURCE_OUTPUT_MASK; 2521 - temp |= DREF_CPU_SOURCE_OUTPUT_DISABLE; 2522 - I915_WRITE(PCH_DREF_CONTROL, temp); 2523 2260 } 2524 2261 2525 2262 /* The LVDS pin pair needs to be on before the DPLLs are enabled. ··· 2539 2304 if (is_dp) 2540 2305 intel_dp_set_m_n(crtc, mode, adjusted_mode); 2541 2306 2542 - I915_WRITE(fp_reg, fp); 2543 - I915_WRITE(dpll_reg, dpll); 2544 - I915_READ(dpll_reg); 2545 - /* Wait for the clocks to stabilize. */ 2546 - udelay(150); 2547 - 2548 - if (IS_I965G(dev) && !IS_IGDNG(dev)) { 2549 - sdvo_pixel_multiply = adjusted_mode->clock / mode->clock; 2550 - I915_WRITE(dpll_md_reg, (0 << DPLL_MD_UDI_DIVIDER_SHIFT) | 2551 - ((sdvo_pixel_multiply - 1) << DPLL_MD_UDI_MULTIPLIER_SHIFT)); 2552 - } else { 2553 - /* write it again -- the BIOS does, after all */ 2307 + if (!is_edp) { 2308 + I915_WRITE(fp_reg, fp); 2554 2309 I915_WRITE(dpll_reg, dpll); 2310 + I915_READ(dpll_reg); 2311 + /* Wait for the clocks to stabilize. */ 2312 + udelay(150); 2313 + 2314 + if (IS_I965G(dev) && !IS_IGDNG(dev)) { 2315 + sdvo_pixel_multiply = adjusted_mode->clock / mode->clock; 2316 + I915_WRITE(dpll_md_reg, (0 << DPLL_MD_UDI_DIVIDER_SHIFT) | 2317 + ((sdvo_pixel_multiply - 1) << DPLL_MD_UDI_MULTIPLIER_SHIFT)); 2318 + } else { 2319 + /* write it again -- the BIOS does, after all */ 2320 + I915_WRITE(dpll_reg, dpll); 2321 + } 2322 + I915_READ(dpll_reg); 2323 + /* Wait for the clocks to stabilize. */ 2324 + udelay(150); 2555 2325 } 2556 - I915_READ(dpll_reg); 2557 - /* Wait for the clocks to stabilize. */ 2558 - udelay(150); 2559 2326 2560 2327 I915_WRITE(htot_reg, (adjusted_mode->crtc_hdisplay - 1) | 2561 2328 ((adjusted_mode->crtc_htotal - 1) << 16)); ··· 2587 2350 I915_WRITE(link_m1_reg, m_n.link_m); 2588 2351 I915_WRITE(link_n1_reg, m_n.link_n); 2589 2352 2590 - /* enable FDI RX PLL too */ 2591 - temp = I915_READ(fdi_rx_reg); 2592 - I915_WRITE(fdi_rx_reg, temp | FDI_RX_PLL_ENABLE); 2593 - udelay(200); 2353 + if (is_edp) { 2354 + igdng_set_pll_edp(crtc, adjusted_mode->clock); 2355 + } else { 2356 + /* enable FDI RX PLL too */ 2357 + temp = I915_READ(fdi_rx_reg); 2358 + I915_WRITE(fdi_rx_reg, temp | FDI_RX_PLL_ENABLE); 2359 + udelay(200); 2360 + } 2594 2361 } 2595 2362 2596 2363 I915_WRITE(pipeconf_reg, pipeconf); ··· 3192 2951 if (IS_IGDNG(dev)) { 3193 2952 int found; 3194 2953 2954 + if (IS_MOBILE(dev) && (I915_READ(DP_A) & DP_DETECTED)) 2955 + intel_dp_init(dev, DP_A); 2956 + 3195 2957 if (I915_READ(HDMIB) & PORT_DETECTED) { 3196 2958 /* check SDVOB */ 3197 2959 /* found = intel_sdvo_init(dev, HDMIB); */ 3198 2960 found = 0; 3199 2961 if (!found) 3200 2962 intel_hdmi_init(dev, HDMIB); 2963 + if (!found && (I915_READ(PCH_DP_B) & DP_DETECTED)) 2964 + intel_dp_init(dev, PCH_DP_B); 3201 2965 } 3202 2966 3203 2967 if (I915_READ(HDMIC) & PORT_DETECTED) ··· 3210 2964 3211 2965 if (I915_READ(HDMID) & PORT_DETECTED) 3212 2966 intel_hdmi_init(dev, HDMID); 2967 + 2968 + if (I915_READ(PCH_DP_C) & DP_DETECTED) 2969 + intel_dp_init(dev, PCH_DP_C); 2970 + 2971 + if (I915_READ(PCH_DP_D) & DP_DETECTED) 2972 + intel_dp_init(dev, PCH_DP_D); 3213 2973 3214 2974 } else if (IS_I9XX(dev)) { 3215 2975 int found; ··· 3290 3038 crtc_mask = ((1 << 0) | 3291 3039 (1 << 1)); 3292 3040 clone_mask = (1 << INTEL_OUTPUT_DISPLAYPORT); 3041 + break; 3042 + case INTEL_OUTPUT_EDP: 3043 + crtc_mask = (1 << 1); 3044 + clone_mask = (1 << INTEL_OUTPUT_EDP); 3293 3045 break; 3294 3046 } 3295 3047 encoder->possible_crtcs = crtc_mask; ··· 3404 3148 if (IS_I965G(dev)) { 3405 3149 dev->mode_config.max_width = 8192; 3406 3150 dev->mode_config.max_height = 8192; 3151 + } else if (IS_I9XX(dev)) { 3152 + dev->mode_config.max_width = 4096; 3153 + dev->mode_config.max_height = 4096; 3407 3154 } else { 3408 3155 dev->mode_config.max_width = 2048; 3409 3156 dev->mode_config.max_height = 2048;
+189 -27
drivers/gpu/drm/i915/intel_dp.c
··· 40 40 41 41 #define DP_LINK_CONFIGURATION_SIZE 9 42 42 43 + #define IS_eDP(i) ((i)->type == INTEL_OUTPUT_EDP) 44 + 43 45 struct intel_dp_priv { 44 46 uint32_t output_reg; 45 47 uint32_t DP; ··· 64 62 65 63 static void 66 64 intel_dp_link_down(struct intel_output *intel_output, uint32_t DP); 65 + 66 + void 67 + intel_edp_link_config (struct intel_output *intel_output, 68 + int *lane_num, int *link_bw) 69 + { 70 + struct intel_dp_priv *dp_priv = intel_output->dev_priv; 71 + 72 + *lane_num = dp_priv->lane_count; 73 + if (dp_priv->link_bw == DP_LINK_BW_1_62) 74 + *link_bw = 162000; 75 + else if (dp_priv->link_bw == DP_LINK_BW_2_7) 76 + *link_bw = 270000; 77 + } 67 78 68 79 static int 69 80 intel_dp_max_lane_count(struct intel_output *intel_output) ··· 221 206 * and would like to run at 2MHz. So, take the 222 207 * hrawclk value and divide by 2 and use that 223 208 */ 224 - aux_clock_divider = intel_hrawclk(dev) / 2; 209 + if (IS_eDP(intel_output)) 210 + aux_clock_divider = 225; /* eDP input clock at 450Mhz */ 211 + else if (IS_IGDNG(dev)) 212 + aux_clock_divider = 62; /* IGDNG: input clock fixed at 125Mhz */ 213 + else 214 + aux_clock_divider = intel_hrawclk(dev) / 2; 215 + 225 216 /* Must try at least 3 times according to DP spec */ 226 217 for (try = 0; try < 5; try++) { 227 218 /* Load the send data into the aux channel data registers */ ··· 257 236 } 258 237 259 238 /* Clear done status and any errors */ 260 - I915_WRITE(ch_ctl, (ctl | 239 + I915_WRITE(ch_ctl, (status | 261 240 DP_AUX_CH_CTL_DONE | 262 241 DP_AUX_CH_CTL_TIME_OUT_ERROR | 263 242 DP_AUX_CH_CTL_RECEIVE_ERROR)); ··· 316 295 return -1; 317 296 msg[0] = AUX_NATIVE_WRITE << 4; 318 297 msg[1] = address >> 8; 319 - msg[2] = address; 298 + msg[2] = address & 0xff; 320 299 msg[3] = send_bytes - 1; 321 300 memcpy(&msg[4], send, send_bytes); 322 301 msg_bytes = send_bytes + 4; ··· 408 387 memset(&dp_priv->adapter, '\0', sizeof (dp_priv->adapter)); 409 388 dp_priv->adapter.owner = THIS_MODULE; 410 389 dp_priv->adapter.class = I2C_CLASS_DDC; 411 - strncpy (dp_priv->adapter.name, name, sizeof dp_priv->adapter.name - 1); 412 - dp_priv->adapter.name[sizeof dp_priv->adapter.name - 1] = '\0'; 390 + strncpy (dp_priv->adapter.name, name, sizeof(dp_priv->adapter.name) - 1); 391 + dp_priv->adapter.name[sizeof(dp_priv->adapter.name) - 1] = '\0'; 413 392 dp_priv->adapter.algo_data = &dp_priv->algo; 414 393 dp_priv->adapter.dev.parent = &intel_output->base.kdev; 415 394 ··· 514 493 intel_dp_compute_m_n(3, lane_count, 515 494 mode->clock, adjusted_mode->clock, &m_n); 516 495 517 - if (intel_crtc->pipe == 0) { 518 - I915_WRITE(PIPEA_GMCH_DATA_M, 519 - ((m_n.tu - 1) << PIPE_GMCH_DATA_M_TU_SIZE_SHIFT) | 520 - m_n.gmch_m); 521 - I915_WRITE(PIPEA_GMCH_DATA_N, 522 - m_n.gmch_n); 523 - I915_WRITE(PIPEA_DP_LINK_M, m_n.link_m); 524 - I915_WRITE(PIPEA_DP_LINK_N, m_n.link_n); 496 + if (IS_IGDNG(dev)) { 497 + if (intel_crtc->pipe == 0) { 498 + I915_WRITE(TRANSA_DATA_M1, 499 + ((m_n.tu - 1) << PIPE_GMCH_DATA_M_TU_SIZE_SHIFT) | 500 + m_n.gmch_m); 501 + I915_WRITE(TRANSA_DATA_N1, m_n.gmch_n); 502 + I915_WRITE(TRANSA_DP_LINK_M1, m_n.link_m); 503 + I915_WRITE(TRANSA_DP_LINK_N1, m_n.link_n); 504 + } else { 505 + I915_WRITE(TRANSB_DATA_M1, 506 + ((m_n.tu - 1) << PIPE_GMCH_DATA_M_TU_SIZE_SHIFT) | 507 + m_n.gmch_m); 508 + I915_WRITE(TRANSB_DATA_N1, m_n.gmch_n); 509 + I915_WRITE(TRANSB_DP_LINK_M1, m_n.link_m); 510 + I915_WRITE(TRANSB_DP_LINK_N1, m_n.link_n); 511 + } 525 512 } else { 526 - I915_WRITE(PIPEB_GMCH_DATA_M, 527 - ((m_n.tu - 1) << PIPE_GMCH_DATA_M_TU_SIZE_SHIFT) | 528 - m_n.gmch_m); 529 - I915_WRITE(PIPEB_GMCH_DATA_N, 530 - m_n.gmch_n); 531 - I915_WRITE(PIPEB_DP_LINK_M, m_n.link_m); 532 - I915_WRITE(PIPEB_DP_LINK_N, m_n.link_n); 513 + if (intel_crtc->pipe == 0) { 514 + I915_WRITE(PIPEA_GMCH_DATA_M, 515 + ((m_n.tu - 1) << PIPE_GMCH_DATA_M_TU_SIZE_SHIFT) | 516 + m_n.gmch_m); 517 + I915_WRITE(PIPEA_GMCH_DATA_N, 518 + m_n.gmch_n); 519 + I915_WRITE(PIPEA_DP_LINK_M, m_n.link_m); 520 + I915_WRITE(PIPEA_DP_LINK_N, m_n.link_n); 521 + } else { 522 + I915_WRITE(PIPEB_GMCH_DATA_M, 523 + ((m_n.tu - 1) << PIPE_GMCH_DATA_M_TU_SIZE_SHIFT) | 524 + m_n.gmch_m); 525 + I915_WRITE(PIPEB_GMCH_DATA_N, 526 + m_n.gmch_n); 527 + I915_WRITE(PIPEB_DP_LINK_M, m_n.link_m); 528 + I915_WRITE(PIPEB_DP_LINK_N, m_n.link_n); 529 + } 533 530 } 534 531 } 535 532 ··· 595 556 596 557 if (intel_crtc->pipe == 1) 597 558 dp_priv->DP |= DP_PIPEB_SELECT; 559 + 560 + if (IS_eDP(intel_output)) { 561 + /* don't miss out required setting for eDP */ 562 + dp_priv->DP |= DP_PLL_ENABLE; 563 + if (adjusted_mode->clock < 200000) 564 + dp_priv->DP |= DP_PLL_FREQ_160MHZ; 565 + else 566 + dp_priv->DP |= DP_PLL_FREQ_270MHZ; 567 + } 598 568 } 599 569 570 + static void igdng_edp_backlight_on (struct drm_device *dev) 571 + { 572 + struct drm_i915_private *dev_priv = dev->dev_private; 573 + u32 pp; 574 + 575 + DRM_DEBUG("\n"); 576 + pp = I915_READ(PCH_PP_CONTROL); 577 + pp |= EDP_BLC_ENABLE; 578 + I915_WRITE(PCH_PP_CONTROL, pp); 579 + } 580 + 581 + static void igdng_edp_backlight_off (struct drm_device *dev) 582 + { 583 + struct drm_i915_private *dev_priv = dev->dev_private; 584 + u32 pp; 585 + 586 + DRM_DEBUG("\n"); 587 + pp = I915_READ(PCH_PP_CONTROL); 588 + pp &= ~EDP_BLC_ENABLE; 589 + I915_WRITE(PCH_PP_CONTROL, pp); 590 + } 600 591 601 592 static void 602 593 intel_dp_dpms(struct drm_encoder *encoder, int mode) ··· 638 569 uint32_t dp_reg = I915_READ(dp_priv->output_reg); 639 570 640 571 if (mode != DRM_MODE_DPMS_ON) { 641 - if (dp_reg & DP_PORT_EN) 572 + if (dp_reg & DP_PORT_EN) { 642 573 intel_dp_link_down(intel_output, dp_priv->DP); 574 + if (IS_eDP(intel_output)) 575 + igdng_edp_backlight_off(dev); 576 + } 643 577 } else { 644 - if (!(dp_reg & DP_PORT_EN)) 578 + if (!(dp_reg & DP_PORT_EN)) { 645 579 intel_dp_link_train(intel_output, dp_priv->DP, dp_priv->link_configuration); 580 + if (IS_eDP(intel_output)) 581 + igdng_edp_backlight_on(dev); 582 + } 646 583 } 647 584 dp_priv->dpms_mode = mode; 648 585 } ··· 1010 935 struct drm_i915_private *dev_priv = dev->dev_private; 1011 936 struct intel_dp_priv *dp_priv = intel_output->dev_priv; 1012 937 938 + DRM_DEBUG("\n"); 939 + 940 + if (IS_eDP(intel_output)) { 941 + DP &= ~DP_PLL_ENABLE; 942 + I915_WRITE(dp_priv->output_reg, DP); 943 + POSTING_READ(dp_priv->output_reg); 944 + udelay(100); 945 + } 946 + 947 + DP &= ~DP_LINK_TRAIN_MASK; 948 + I915_WRITE(dp_priv->output_reg, DP | DP_LINK_TRAIN_PAT_IDLE); 949 + POSTING_READ(dp_priv->output_reg); 950 + 951 + udelay(17000); 952 + 953 + if (IS_eDP(intel_output)) 954 + DP |= DP_LINK_TRAIN_OFF; 1013 955 I915_WRITE(dp_priv->output_reg, DP & ~DP_PORT_EN); 1014 956 POSTING_READ(dp_priv->output_reg); 1015 957 } ··· 1070 978 intel_dp_link_train(intel_output, dp_priv->DP, dp_priv->link_configuration); 1071 979 } 1072 980 981 + static enum drm_connector_status 982 + igdng_dp_detect(struct drm_connector *connector) 983 + { 984 + struct intel_output *intel_output = to_intel_output(connector); 985 + struct intel_dp_priv *dp_priv = intel_output->dev_priv; 986 + enum drm_connector_status status; 987 + 988 + status = connector_status_disconnected; 989 + if (intel_dp_aux_native_read(intel_output, 990 + 0x000, dp_priv->dpcd, 991 + sizeof (dp_priv->dpcd)) == sizeof (dp_priv->dpcd)) 992 + { 993 + if (dp_priv->dpcd[0] != 0) 994 + status = connector_status_connected; 995 + } 996 + return status; 997 + } 998 + 1073 999 /** 1074 1000 * Uses CRT_HOTPLUG_EN and CRT_HOTPLUG_STAT to detect DP connection. 1075 1001 * ··· 1105 995 enum drm_connector_status status; 1106 996 1107 997 dp_priv->has_audio = false; 998 + 999 + if (IS_IGDNG(dev)) 1000 + return igdng_dp_detect(connector); 1108 1001 1109 1002 temp = I915_READ(PORT_HOTPLUG_EN); 1110 1003 ··· 1152 1039 static int intel_dp_get_modes(struct drm_connector *connector) 1153 1040 { 1154 1041 struct intel_output *intel_output = to_intel_output(connector); 1042 + struct drm_device *dev = intel_output->base.dev; 1043 + struct drm_i915_private *dev_priv = dev->dev_private; 1044 + int ret; 1155 1045 1156 1046 /* We should parse the EDID data and find out if it has an audio sink 1157 1047 */ 1158 1048 1159 - return intel_ddc_get_modes(intel_output); 1049 + ret = intel_ddc_get_modes(intel_output); 1050 + if (ret) 1051 + return ret; 1052 + 1053 + /* if eDP has no EDID, try to use fixed panel mode from VBT */ 1054 + if (IS_eDP(intel_output)) { 1055 + if (dev_priv->panel_fixed_mode != NULL) { 1056 + struct drm_display_mode *mode; 1057 + mode = drm_mode_duplicate(dev, dev_priv->panel_fixed_mode); 1058 + drm_mode_probed_add(connector, mode); 1059 + return 1; 1060 + } 1061 + } 1062 + return 0; 1160 1063 } 1161 1064 1162 1065 static void ··· 1235 1106 struct drm_connector *connector; 1236 1107 struct intel_output *intel_output; 1237 1108 struct intel_dp_priv *dp_priv; 1109 + const char *name = NULL; 1238 1110 1239 1111 intel_output = kcalloc(sizeof(struct intel_output) + 1240 1112 sizeof(struct intel_dp_priv), 1, GFP_KERNEL); ··· 1249 1119 DRM_MODE_CONNECTOR_DisplayPort); 1250 1120 drm_connector_helper_add(connector, &intel_dp_connector_helper_funcs); 1251 1121 1252 - intel_output->type = INTEL_OUTPUT_DISPLAYPORT; 1122 + if (output_reg == DP_A) 1123 + intel_output->type = INTEL_OUTPUT_EDP; 1124 + else 1125 + intel_output->type = INTEL_OUTPUT_DISPLAYPORT; 1253 1126 1254 1127 connector->interlace_allowed = true; 1255 1128 connector->doublescan_allowed = 0; ··· 1272 1139 drm_sysfs_connector_add(connector); 1273 1140 1274 1141 /* Set up the DDC bus. */ 1275 - intel_dp_i2c_init(intel_output, 1276 - (output_reg == DP_B) ? "DPDDC-B" : 1277 - (output_reg == DP_C) ? "DPDDC-C" : "DPDDC-D"); 1142 + switch (output_reg) { 1143 + case DP_A: 1144 + name = "DPDDC-A"; 1145 + break; 1146 + case DP_B: 1147 + case PCH_DP_B: 1148 + name = "DPDDC-B"; 1149 + break; 1150 + case DP_C: 1151 + case PCH_DP_C: 1152 + name = "DPDDC-C"; 1153 + break; 1154 + case DP_D: 1155 + case PCH_DP_D: 1156 + name = "DPDDC-D"; 1157 + break; 1158 + } 1159 + 1160 + intel_dp_i2c_init(intel_output, name); 1161 + 1278 1162 intel_output->ddc_bus = &dp_priv->adapter; 1279 1163 intel_output->hot_plug = intel_dp_hot_plug; 1164 + 1165 + if (output_reg == DP_A) { 1166 + /* initialize panel mode from VBT if available for eDP */ 1167 + if (dev_priv->lfp_lvds_vbt_mode) { 1168 + dev_priv->panel_fixed_mode = 1169 + drm_mode_duplicate(dev, dev_priv->lfp_lvds_vbt_mode); 1170 + if (dev_priv->panel_fixed_mode) { 1171 + dev_priv->panel_fixed_mode->type |= 1172 + DRM_MODE_TYPE_PREFERRED; 1173 + } 1174 + } 1175 + } 1280 1176 1281 1177 /* For G4X desktop chip, PEG_BAND_GAP_DATA 3:0 must first be written 1282 1178 * 0xd. Failure to do so will result in spurious interrupts being
+3
drivers/gpu/drm/i915/intel_drv.h
··· 55 55 #define INTEL_OUTPUT_TVOUT 5 56 56 #define INTEL_OUTPUT_HDMI 6 57 57 #define INTEL_OUTPUT_DISPLAYPORT 7 58 + #define INTEL_OUTPUT_EDP 8 58 59 59 60 #define INTEL_DVO_CHIP_NONE 0 60 61 #define INTEL_DVO_CHIP_LVDS 1 ··· 122 121 void 123 122 intel_dp_set_m_n(struct drm_crtc *crtc, struct drm_display_mode *mode, 124 123 struct drm_display_mode *adjusted_mode); 124 + extern void intel_edp_link_config (struct intel_output *, int *, int *); 125 + 125 126 126 127 extern void intel_crtc_load_lut(struct drm_crtc *crtc); 127 128 extern void intel_encoder_prepare (struct drm_encoder *encoder);
+4 -60
drivers/gpu/drm/i915/intel_hdmi.c
··· 130 130 } 131 131 132 132 static enum drm_connector_status 133 - intel_hdmi_edid_detect(struct drm_connector *connector) 133 + intel_hdmi_detect(struct drm_connector *connector) 134 134 { 135 135 struct intel_output *intel_output = to_intel_output(connector); 136 136 struct intel_hdmi_priv *hdmi_priv = intel_output->dev_priv; 137 137 struct edid *edid = NULL; 138 138 enum drm_connector_status status = connector_status_disconnected; 139 139 140 + hdmi_priv->has_hdmi_sink = false; 140 141 edid = drm_get_edid(&intel_output->base, 141 142 intel_output->ddc_bus); 142 - hdmi_priv->has_hdmi_sink = false; 143 + 143 144 if (edid) { 144 145 if (edid->input & DRM_EDID_INPUT_DIGITAL) { 145 146 status = connector_status_connected; ··· 149 148 intel_output->base.display_info.raw_edid = NULL; 150 149 kfree(edid); 151 150 } 151 + 152 152 return status; 153 - } 154 - 155 - static enum drm_connector_status 156 - igdng_hdmi_detect(struct drm_connector *connector) 157 - { 158 - struct intel_output *intel_output = to_intel_output(connector); 159 - struct intel_hdmi_priv *hdmi_priv = intel_output->dev_priv; 160 - 161 - /* FIXME hotplug detect */ 162 - 163 - hdmi_priv->has_hdmi_sink = false; 164 - return intel_hdmi_edid_detect(connector); 165 - } 166 - 167 - static enum drm_connector_status 168 - intel_hdmi_detect(struct drm_connector *connector) 169 - { 170 - struct drm_device *dev = connector->dev; 171 - struct drm_i915_private *dev_priv = dev->dev_private; 172 - struct intel_output *intel_output = to_intel_output(connector); 173 - struct intel_hdmi_priv *hdmi_priv = intel_output->dev_priv; 174 - u32 temp, bit; 175 - 176 - if (IS_IGDNG(dev)) 177 - return igdng_hdmi_detect(connector); 178 - 179 - temp = I915_READ(PORT_HOTPLUG_EN); 180 - 181 - switch (hdmi_priv->sdvox_reg) { 182 - case SDVOB: 183 - temp |= HDMIB_HOTPLUG_INT_EN; 184 - break; 185 - case SDVOC: 186 - temp |= HDMIC_HOTPLUG_INT_EN; 187 - break; 188 - default: 189 - return connector_status_unknown; 190 - } 191 - 192 - I915_WRITE(PORT_HOTPLUG_EN, temp); 193 - 194 - POSTING_READ(PORT_HOTPLUG_EN); 195 - 196 - switch (hdmi_priv->sdvox_reg) { 197 - case SDVOB: 198 - bit = HDMIB_HOTPLUG_INT_STATUS; 199 - break; 200 - case SDVOC: 201 - bit = HDMIC_HOTPLUG_INT_STATUS; 202 - break; 203 - default: 204 - return connector_status_unknown; 205 - } 206 - 207 - if ((I915_READ(PORT_HOTPLUG_STAT) & bit) != 0) 208 - return intel_hdmi_edid_detect(connector); 209 - else 210 - return connector_status_disconnected; 211 153 } 212 154 213 155 static int intel_hdmi_get_modes(struct drm_connector *connector)
+12
drivers/gpu/drm/i915/intel_lvds.c
··· 780 780 }, 781 781 { 782 782 .callback = intel_no_lvds_dmi_callback, 783 + .ident = "AOpen Mini PC MP915", 784 + .matches = { 785 + DMI_MATCH(DMI_BOARD_VENDOR, "AOpen"), 786 + DMI_MATCH(DMI_BOARD_NAME, "i915GMx-F"), 787 + }, 788 + }, 789 + { 790 + .callback = intel_no_lvds_dmi_callback, 783 791 .ident = "Aopen i945GTt-VFA", 784 792 .matches = { 785 793 DMI_MATCH(DMI_PRODUCT_VERSION, "AO00001JW"), ··· 892 884 if (IS_IGDNG(dev)) { 893 885 if ((I915_READ(PCH_LVDS) & LVDS_DETECTED) == 0) 894 886 return; 887 + if (dev_priv->edp_support) { 888 + DRM_DEBUG("disable LVDS for eDP support\n"); 889 + return; 890 + } 895 891 gpio = PCH_GPIOC; 896 892 } 897 893
+172 -82
drivers/gpu/drm/i915/intel_sdvo.c
··· 31 31 #include "drm.h" 32 32 #include "drm_crtc.h" 33 33 #include "intel_drv.h" 34 + #include "drm_edid.h" 34 35 #include "i915_drm.h" 35 36 #include "i915_drv.h" 36 37 #include "intel_sdvo_regs.h" ··· 55 54 56 55 /* Pixel clock limitations reported by the SDVO device, in kHz */ 57 56 int pixel_clock_min, pixel_clock_max; 57 + 58 + /* 59 + * For multiple function SDVO device, 60 + * this is for current attached outputs. 61 + */ 62 + uint16_t attached_output; 58 63 59 64 /** 60 65 * This is set if we're going to treat the device as TV-out. ··· 120 113 struct intel_sdvo_dtd save_output_dtd[16]; 121 114 u32 save_SDVOX; 122 115 }; 116 + 117 + static bool 118 + intel_sdvo_output_setup(struct intel_output *intel_output, uint16_t flags); 123 119 124 120 /** 125 121 * Writes the SDVOB or SDVOC with the given value, but always writes both ··· 1445 1435 intel_sdvo_read_response(intel_output, &response, 2); 1446 1436 } 1447 1437 1448 - static void 1449 - intel_sdvo_hdmi_sink_detect(struct drm_connector *connector) 1438 + static bool 1439 + intel_sdvo_multifunc_encoder(struct intel_output *intel_output) 1440 + { 1441 + struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv; 1442 + int caps = 0; 1443 + 1444 + if (sdvo_priv->caps.output_flags & 1445 + (SDVO_OUTPUT_TMDS0 | SDVO_OUTPUT_TMDS1)) 1446 + caps++; 1447 + if (sdvo_priv->caps.output_flags & 1448 + (SDVO_OUTPUT_RGB0 | SDVO_OUTPUT_RGB1)) 1449 + caps++; 1450 + if (sdvo_priv->caps.output_flags & 1451 + (SDVO_OUTPUT_SVID0 | SDVO_OUTPUT_SVID0)) 1452 + caps++; 1453 + if (sdvo_priv->caps.output_flags & 1454 + (SDVO_OUTPUT_CVBS0 | SDVO_OUTPUT_CVBS1)) 1455 + caps++; 1456 + if (sdvo_priv->caps.output_flags & 1457 + (SDVO_OUTPUT_YPRPB0 | SDVO_OUTPUT_YPRPB1)) 1458 + caps++; 1459 + 1460 + if (sdvo_priv->caps.output_flags & 1461 + (SDVO_OUTPUT_SCART0 | SDVO_OUTPUT_SCART1)) 1462 + caps++; 1463 + 1464 + if (sdvo_priv->caps.output_flags & 1465 + (SDVO_OUTPUT_LVDS0 | SDVO_OUTPUT_LVDS1)) 1466 + caps++; 1467 + 1468 + return (caps > 1); 1469 + } 1470 + 1471 + enum drm_connector_status 1472 + intel_sdvo_hdmi_sink_detect(struct drm_connector *connector, u16 response) 1450 1473 { 1451 1474 struct intel_output *intel_output = to_intel_output(connector); 1452 1475 struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv; 1476 + enum drm_connector_status status = connector_status_connected; 1453 1477 struct edid *edid = NULL; 1454 1478 1455 1479 edid = drm_get_edid(&intel_output->base, 1456 1480 intel_output->ddc_bus); 1457 1481 if (edid != NULL) { 1458 - sdvo_priv->is_hdmi = drm_detect_hdmi_monitor(edid); 1482 + /* Don't report the output as connected if it's a DVI-I 1483 + * connector with a non-digital EDID coming out. 1484 + */ 1485 + if (response & (SDVO_OUTPUT_TMDS0 | SDVO_OUTPUT_TMDS1)) { 1486 + if (edid->input & DRM_EDID_INPUT_DIGITAL) 1487 + sdvo_priv->is_hdmi = 1488 + drm_detect_hdmi_monitor(edid); 1489 + else 1490 + status = connector_status_disconnected; 1491 + } 1492 + 1459 1493 kfree(edid); 1460 1494 intel_output->base.display_info.raw_edid = NULL; 1461 - } 1495 + 1496 + } else if (response & (SDVO_OUTPUT_TMDS0 | SDVO_OUTPUT_TMDS1)) 1497 + status = connector_status_disconnected; 1498 + 1499 + return status; 1462 1500 } 1463 1501 1464 1502 static enum drm_connector_status intel_sdvo_detect(struct drm_connector *connector) 1465 1503 { 1466 - u8 response[2]; 1504 + uint16_t response; 1467 1505 u8 status; 1468 1506 struct intel_output *intel_output = to_intel_output(connector); 1507 + struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv; 1469 1508 1470 1509 intel_sdvo_write_cmd(intel_output, SDVO_CMD_GET_ATTACHED_DISPLAYS, NULL, 0); 1471 1510 status = intel_sdvo_read_response(intel_output, &response, 2); 1472 1511 1473 - DRM_DEBUG("SDVO response %d %d\n", response[0], response[1]); 1512 + DRM_DEBUG("SDVO response %d %d\n", response & 0xff, response >> 8); 1474 1513 1475 1514 if (status != SDVO_CMD_STATUS_SUCCESS) 1476 1515 return connector_status_unknown; 1477 1516 1478 - if ((response[0] != 0) || (response[1] != 0)) { 1479 - intel_sdvo_hdmi_sink_detect(connector); 1480 - return connector_status_connected; 1481 - } else 1517 + if (response == 0) 1482 1518 return connector_status_disconnected; 1519 + 1520 + if (intel_sdvo_multifunc_encoder(intel_output) && 1521 + sdvo_priv->attached_output != response) { 1522 + if (sdvo_priv->controlled_output != response && 1523 + intel_sdvo_output_setup(intel_output, response) != true) 1524 + return connector_status_unknown; 1525 + sdvo_priv->attached_output = response; 1526 + } 1527 + return intel_sdvo_hdmi_sink_detect(connector, response); 1483 1528 } 1484 1529 1485 1530 static void intel_sdvo_get_ddc_modes(struct drm_connector *connector) ··· 1931 1866 return 0x72; 1932 1867 } 1933 1868 1869 + static bool 1870 + intel_sdvo_output_setup(struct intel_output *intel_output, uint16_t flags) 1871 + { 1872 + struct drm_connector *connector = &intel_output->base; 1873 + struct drm_encoder *encoder = &intel_output->enc; 1874 + struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv; 1875 + bool ret = true, registered = false; 1876 + 1877 + sdvo_priv->is_tv = false; 1878 + intel_output->needs_tv_clock = false; 1879 + sdvo_priv->is_lvds = false; 1880 + 1881 + if (device_is_registered(&connector->kdev)) { 1882 + drm_sysfs_connector_remove(connector); 1883 + registered = true; 1884 + } 1885 + 1886 + if (flags & 1887 + (SDVO_OUTPUT_TMDS0 | SDVO_OUTPUT_TMDS1)) { 1888 + if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_TMDS0) 1889 + sdvo_priv->controlled_output = SDVO_OUTPUT_TMDS0; 1890 + else 1891 + sdvo_priv->controlled_output = SDVO_OUTPUT_TMDS1; 1892 + 1893 + encoder->encoder_type = DRM_MODE_ENCODER_TMDS; 1894 + connector->connector_type = DRM_MODE_CONNECTOR_DVID; 1895 + 1896 + if (intel_sdvo_get_supp_encode(intel_output, 1897 + &sdvo_priv->encode) && 1898 + intel_sdvo_get_digital_encoding_mode(intel_output) && 1899 + sdvo_priv->is_hdmi) { 1900 + /* enable hdmi encoding mode if supported */ 1901 + intel_sdvo_set_encode(intel_output, SDVO_ENCODE_HDMI); 1902 + intel_sdvo_set_colorimetry(intel_output, 1903 + SDVO_COLORIMETRY_RGB256); 1904 + connector->connector_type = DRM_MODE_CONNECTOR_HDMIA; 1905 + } 1906 + } else if (flags & SDVO_OUTPUT_SVID0) { 1907 + 1908 + sdvo_priv->controlled_output = SDVO_OUTPUT_SVID0; 1909 + encoder->encoder_type = DRM_MODE_ENCODER_TVDAC; 1910 + connector->connector_type = DRM_MODE_CONNECTOR_SVIDEO; 1911 + sdvo_priv->is_tv = true; 1912 + intel_output->needs_tv_clock = true; 1913 + } else if (flags & SDVO_OUTPUT_RGB0) { 1914 + 1915 + sdvo_priv->controlled_output = SDVO_OUTPUT_RGB0; 1916 + encoder->encoder_type = DRM_MODE_ENCODER_DAC; 1917 + connector->connector_type = DRM_MODE_CONNECTOR_VGA; 1918 + } else if (flags & SDVO_OUTPUT_RGB1) { 1919 + 1920 + sdvo_priv->controlled_output = SDVO_OUTPUT_RGB1; 1921 + encoder->encoder_type = DRM_MODE_ENCODER_DAC; 1922 + connector->connector_type = DRM_MODE_CONNECTOR_VGA; 1923 + } else if (flags & SDVO_OUTPUT_LVDS0) { 1924 + 1925 + sdvo_priv->controlled_output = SDVO_OUTPUT_LVDS0; 1926 + encoder->encoder_type = DRM_MODE_ENCODER_LVDS; 1927 + connector->connector_type = DRM_MODE_CONNECTOR_LVDS; 1928 + sdvo_priv->is_lvds = true; 1929 + } else if (flags & SDVO_OUTPUT_LVDS1) { 1930 + 1931 + sdvo_priv->controlled_output = SDVO_OUTPUT_LVDS1; 1932 + encoder->encoder_type = DRM_MODE_ENCODER_LVDS; 1933 + connector->connector_type = DRM_MODE_CONNECTOR_LVDS; 1934 + sdvo_priv->is_lvds = true; 1935 + } else { 1936 + 1937 + unsigned char bytes[2]; 1938 + 1939 + sdvo_priv->controlled_output = 0; 1940 + memcpy(bytes, &sdvo_priv->caps.output_flags, 2); 1941 + DRM_DEBUG_KMS(I915_SDVO, 1942 + "%s: Unknown SDVO output type (0x%02x%02x)\n", 1943 + SDVO_NAME(sdvo_priv), 1944 + bytes[0], bytes[1]); 1945 + ret = false; 1946 + } 1947 + 1948 + if (ret && registered) 1949 + ret = drm_sysfs_connector_add(connector) == 0 ? true : false; 1950 + 1951 + 1952 + return ret; 1953 + 1954 + } 1955 + 1934 1956 bool intel_sdvo_init(struct drm_device *dev, int output_device) 1935 1957 { 1936 1958 struct drm_connector *connector; 1937 1959 struct intel_output *intel_output; 1938 1960 struct intel_sdvo_priv *sdvo_priv; 1939 1961 1940 - int connector_type; 1941 1962 u8 ch[0x40]; 1942 1963 int i; 1943 - int encoder_type; 1944 1964 1945 1965 intel_output = kcalloc(sizeof(struct intel_output)+sizeof(struct intel_sdvo_priv), 1, GFP_KERNEL); 1946 1966 if (!intel_output) { ··· 2075 1925 intel_output->ddc_bus->algo = &intel_sdvo_i2c_bit_algo; 2076 1926 2077 1927 /* In defaut case sdvo lvds is false */ 2078 - sdvo_priv->is_lvds = false; 2079 1928 intel_sdvo_get_capabilities(intel_output, &sdvo_priv->caps); 2080 1929 2081 - if (sdvo_priv->caps.output_flags & 2082 - (SDVO_OUTPUT_TMDS0 | SDVO_OUTPUT_TMDS1)) { 2083 - if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_TMDS0) 2084 - sdvo_priv->controlled_output = SDVO_OUTPUT_TMDS0; 2085 - else 2086 - sdvo_priv->controlled_output = SDVO_OUTPUT_TMDS1; 2087 - 2088 - encoder_type = DRM_MODE_ENCODER_TMDS; 2089 - connector_type = DRM_MODE_CONNECTOR_DVID; 2090 - 2091 - if (intel_sdvo_get_supp_encode(intel_output, 2092 - &sdvo_priv->encode) && 2093 - intel_sdvo_get_digital_encoding_mode(intel_output) && 2094 - sdvo_priv->is_hdmi) { 2095 - /* enable hdmi encoding mode if supported */ 2096 - intel_sdvo_set_encode(intel_output, SDVO_ENCODE_HDMI); 2097 - intel_sdvo_set_colorimetry(intel_output, 2098 - SDVO_COLORIMETRY_RGB256); 2099 - connector_type = DRM_MODE_CONNECTOR_HDMIA; 2100 - } 2101 - } 2102 - else if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_SVID0) 2103 - { 2104 - sdvo_priv->controlled_output = SDVO_OUTPUT_SVID0; 2105 - encoder_type = DRM_MODE_ENCODER_TVDAC; 2106 - connector_type = DRM_MODE_CONNECTOR_SVIDEO; 2107 - sdvo_priv->is_tv = true; 2108 - intel_output->needs_tv_clock = true; 2109 - } 2110 - else if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_RGB0) 2111 - { 2112 - sdvo_priv->controlled_output = SDVO_OUTPUT_RGB0; 2113 - encoder_type = DRM_MODE_ENCODER_DAC; 2114 - connector_type = DRM_MODE_CONNECTOR_VGA; 2115 - } 2116 - else if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_RGB1) 2117 - { 2118 - sdvo_priv->controlled_output = SDVO_OUTPUT_RGB1; 2119 - encoder_type = DRM_MODE_ENCODER_DAC; 2120 - connector_type = DRM_MODE_CONNECTOR_VGA; 2121 - } 2122 - else if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_LVDS0) 2123 - { 2124 - sdvo_priv->controlled_output = SDVO_OUTPUT_LVDS0; 2125 - encoder_type = DRM_MODE_ENCODER_LVDS; 2126 - connector_type = DRM_MODE_CONNECTOR_LVDS; 2127 - sdvo_priv->is_lvds = true; 2128 - } 2129 - else if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_LVDS1) 2130 - { 2131 - sdvo_priv->controlled_output = SDVO_OUTPUT_LVDS1; 2132 - encoder_type = DRM_MODE_ENCODER_LVDS; 2133 - connector_type = DRM_MODE_CONNECTOR_LVDS; 2134 - sdvo_priv->is_lvds = true; 2135 - } 2136 - else 2137 - { 2138 - unsigned char bytes[2]; 2139 - 2140 - sdvo_priv->controlled_output = 0; 2141 - memcpy (bytes, &sdvo_priv->caps.output_flags, 2); 2142 - DRM_DEBUG_KMS(I915_SDVO, 2143 - "%s: Unknown SDVO output type (0x%02x%02x)\n", 2144 - SDVO_NAME(sdvo_priv), 2145 - bytes[0], bytes[1]); 2146 - encoder_type = DRM_MODE_ENCODER_NONE; 2147 - connector_type = DRM_MODE_CONNECTOR_Unknown; 1930 + if (intel_sdvo_output_setup(intel_output, 1931 + sdvo_priv->caps.output_flags) != true) { 1932 + DRM_DEBUG("SDVO output failed to setup on SDVO%c\n", 1933 + output_device == SDVOB ? 'B' : 'C'); 2148 1934 goto err_i2c; 2149 1935 } 2150 1936 1937 + 2151 1938 connector = &intel_output->base; 2152 1939 drm_connector_init(dev, connector, &intel_sdvo_connector_funcs, 2153 - connector_type); 1940 + connector->connector_type); 1941 + 2154 1942 drm_connector_helper_add(connector, &intel_sdvo_connector_helper_funcs); 2155 1943 connector->interlace_allowed = 0; 2156 1944 connector->doublescan_allowed = 0; 2157 1945 connector->display_info.subpixel_order = SubPixelHorizontalRGB; 2158 1946 2159 - drm_encoder_init(dev, &intel_output->enc, &intel_sdvo_enc_funcs, encoder_type); 1947 + drm_encoder_init(dev, &intel_output->enc, 1948 + &intel_sdvo_enc_funcs, intel_output->enc.encoder_type); 1949 + 2160 1950 drm_encoder_helper_add(&intel_output->enc, &intel_sdvo_helper_funcs); 2161 1951 2162 1952 drm_mode_connector_attach_encoder(&intel_output->base, &intel_output->enc);
+22
drivers/gpu/drm/i915/intel_tv.c
··· 1490 1490 {"1920x1080", 1920, 1080}, 1491 1491 }; 1492 1492 1493 + /* 1494 + * Chose preferred mode according to line number of TV format 1495 + */ 1496 + static void 1497 + intel_tv_chose_preferred_modes(struct drm_connector *connector, 1498 + struct drm_display_mode *mode_ptr) 1499 + { 1500 + struct intel_output *intel_output = to_intel_output(connector); 1501 + const struct tv_mode *tv_mode = intel_tv_mode_find(intel_output); 1502 + 1503 + if (tv_mode->nbr_end < 480 && mode_ptr->vdisplay == 480) 1504 + mode_ptr->type |= DRM_MODE_TYPE_PREFERRED; 1505 + else if (tv_mode->nbr_end > 480) { 1506 + if (tv_mode->progressive == true && tv_mode->nbr_end < 720) { 1507 + if (mode_ptr->vdisplay == 720) 1508 + mode_ptr->type |= DRM_MODE_TYPE_PREFERRED; 1509 + } else if (mode_ptr->vdisplay == 1080) 1510 + mode_ptr->type |= DRM_MODE_TYPE_PREFERRED; 1511 + } 1512 + } 1513 + 1493 1514 /** 1494 1515 * Stub get_modes function. 1495 1516 * ··· 1565 1544 mode_ptr->clock = (int) tmp; 1566 1545 1567 1546 mode_ptr->type = DRM_MODE_TYPE_DRIVER; 1547 + intel_tv_chose_preferred_modes(connector, mode_ptr); 1568 1548 drm_mode_probed_add(connector, mode_ptr); 1569 1549 count++; 1570 1550 }