Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'drm-intel-next-2014-10-03-no-ppgtt' of git://anongit.freedesktop.org/drm-intel into drm-next

Ok, new attempt, this time around with full ppgtt disabled again.

drm-intel-next-2014-10-03:
- first batch of skl stage 1 enabling
- fixes from Rodrigo to the PSR, fbc and sink crc code
- kerneldoc for the frontbuffer tracking code, runtime pm code and the basic
interrupt enable/disable functions
- smaller stuff all over
drm-intel-next-2014-09-19:
- bunch more i830M fixes from Ville
- full ppgtt now again enabled by default
- more ppgtt fixes from Michel Thierry and Chris Wilson
- plane config work from Gustavo Padovan
- spinlock clarifications
- piles of smaller improvements all over, as usual

* tag 'drm-intel-next-2014-10-03-no-ppgtt' of git://anongit.freedesktop.org/drm-intel: (114 commits)
Revert "drm/i915: Enable full PPGTT on gen7"
drm/i915: Update DRIVER_DATE to 20141003
drm/i915: Remove the duplicated logic between the two shrink phases
drm/i915: kerneldoc for interrupt enable/disable functions
drm/i915: Use dev_priv instead of dev in irq setup functions
drm/i915: s/pm._irqs_disabled/pm.irqs_enabled/
drm/i915: Clear TX FIFO reset master override bits on chv
drm/i915: Make sure hardware uses the correct swing margin/deemph bits on chv
drm/i915: make sink_crc return -EIO on aux read/write failure
drm/i915: Constify send buffer for intel_dp_aux_ch
drm/i915: De-magic the PSR AUX message
drm/i915: Reinstate error level message for non-simulated gpu hangs
drm/i915: Kerneldoc for intel_runtime_pm.c
drm/i915: Call runtime_pm_disable directly
drm/i915: Move intel_display_set_init_power to intel_runtime_pm.c
drm/i915: Bikeshed rpm functions name a bit.
drm/i915: Extract intel_runtime_pm.c
drm/i915: Remove intel_modeset_suspend_hw
drm/i915: spelling fixes for frontbuffer tracking kerneldoc
drm/i915: Tighting frontbuffer tracking around flips
...

+3404 -2182
+28
Documentation/DocBook/drm.tmpl
··· 3788 3788 those have basic support through the gma500 drm driver. 3789 3789 </para> 3790 3790 <sect1> 3791 + <title>Core Driver Infrastructure</title> 3792 + <para> 3793 + This section covers core driver infrastructure used by both the display 3794 + and the GEM parts of the driver. 3795 + </para> 3796 + <sect2> 3797 + <title>Runtime Power Management</title> 3798 + !Pdrivers/gpu/drm/i915/intel_runtime_pm.c runtime pm 3799 + !Idrivers/gpu/drm/i915/intel_runtime_pm.c 3800 + </sect2> 3801 + <sect2> 3802 + <title>Interrupt Handling</title> 3803 + !Pdrivers/gpu/drm/i915/i915_irq.c interrupt handling 3804 + !Fdrivers/gpu/drm/i915/i915_irq.c intel_irq_init intel_irq_init_hw intel_hpd_init 3805 + !Fdrivers/gpu/drm/i915/i915_irq.c intel_irq_fini 3806 + !Fdrivers/gpu/drm/i915/i915_irq.c intel_runtime_pm_disable_interrupts 3807 + !Fdrivers/gpu/drm/i915/i915_irq.c intel_runtime_pm_enable_interrupts 3808 + </sect2> 3809 + </sect1> 3810 + <sect1> 3791 3811 <title>Display Hardware Handling</title> 3792 3812 <para> 3793 3813 This section covers everything related to the display hardware including ··· 3822 3802 has its own tailor-made infrastructure for executing a display 3823 3803 configuration change. 3824 3804 </para> 3805 + </sect2> 3806 + <sect2> 3807 + <title>Frontbuffer Tracking</title> 3808 + !Pdrivers/gpu/drm/i915/intel_frontbuffer.c frontbuffer tracking 3809 + !Idrivers/gpu/drm/i915/intel_frontbuffer.c 3810 + !Fdrivers/gpu/drm/i915/intel_drv.h intel_frontbuffer_flip 3811 + !Fdrivers/gpu/drm/i915/i915_gem.c i915_gem_track_fb 3825 3812 </sect2> 3826 3813 <sect2> 3827 3814 <title>Plane Configuration</title> ··· 3959 3932 </sect2> 3960 3933 </sect1> 3961 3934 </chapter> 3935 + !Cdrivers/gpu/drm/i915/i915_irq.c 3962 3936 </part> 3963 3937 </book>
+23
arch/x86/kernel/early-quirks.c
··· 455 455 u32 (*base)(int num, int slot, int func, size_t size); 456 456 }; 457 457 458 + static size_t __init gen9_stolen_size(int num, int slot, int func) 459 + { 460 + u16 gmch_ctrl; 461 + 462 + gmch_ctrl = read_pci_config_16(num, slot, func, SNB_GMCH_CTRL); 463 + gmch_ctrl >>= BDW_GMCH_GMS_SHIFT; 464 + gmch_ctrl &= BDW_GMCH_GMS_MASK; 465 + 466 + if (gmch_ctrl < 0xf0) 467 + return gmch_ctrl << 25; /* 32 MB units */ 468 + else 469 + /* 4MB increments starting at 0xf0 for 4MB */ 470 + return (gmch_ctrl - 0xf0 + 1) << 22; 471 + } 472 + 473 + typedef size_t (*stolen_size_fn)(int num, int slot, int func); 474 + 458 475 static const struct intel_stolen_funcs i830_stolen_funcs __initconst = { 459 476 .base = i830_stolen_base, 460 477 .size = i830_stolen_size, ··· 507 490 .size = gen8_stolen_size, 508 491 }; 509 492 493 + static const struct intel_stolen_funcs gen9_stolen_funcs __initconst = { 494 + .base = intel_stolen_base, 495 + .size = gen9_stolen_size, 496 + }; 497 + 510 498 static const struct intel_stolen_funcs chv_stolen_funcs __initconst = { 511 499 .base = intel_stolen_base, 512 500 .size = chv_stolen_size, ··· 545 523 INTEL_BDW_M_IDS(&gen8_stolen_funcs), 546 524 INTEL_BDW_D_IDS(&gen8_stolen_funcs), 547 525 INTEL_CHV_IDS(&chv_stolen_funcs), 526 + INTEL_SKL_IDS(&gen9_stolen_funcs), 548 527 }; 549 528 550 529 static void __init intel_graphics_stolen(int num, int slot, int func)
-4
drivers/char/agp/intel-gtt.c
··· 153 153 __free_pages(page, 2); 154 154 return NULL; 155 155 } 156 - get_page(page); 157 156 atomic_inc(&agp_bridge->current_memory_agp); 158 157 return page; 159 158 } ··· 163 164 return; 164 165 165 166 set_pages_wb(page, 4); 166 - put_page(page); 167 167 __free_pages(page, 2); 168 168 atomic_dec(&agp_bridge->current_memory_agp); 169 169 } ··· 298 300 page = alloc_page(GFP_KERNEL | GFP_DMA32 | __GFP_ZERO); 299 301 if (page == NULL) 300 302 return -ENOMEM; 301 - get_page(page); 302 303 set_pages_uc(page, 1); 303 304 304 305 if (intel_private.needs_dmar) { ··· 557 560 set_pages_wb(intel_private.scratch_page, 1); 558 561 pci_unmap_page(intel_private.pcidev, intel_private.scratch_page_dma, 559 562 PAGE_SIZE, PCI_DMA_BIDIRECTIONAL); 560 - put_page(intel_private.scratch_page); 561 563 __free_page(intel_private.scratch_page); 562 564 } 563 565
+4 -1
drivers/gpu/drm/i915/Makefile
··· 11 11 i915_params.o \ 12 12 i915_suspend.o \ 13 13 i915_sysfs.o \ 14 - intel_pm.o 14 + intel_pm.o \ 15 + intel_runtime_pm.o 16 + 15 17 i915-$(CONFIG_COMPAT) += i915_ioc32.o 16 18 i915-$(CONFIG_DEBUG_FS) += i915_debugfs.o 17 19 ··· 45 43 # modesetting core code 46 44 i915-y += intel_bios.o \ 47 45 intel_display.o \ 46 + intel_frontbuffer.o \ 48 47 intel_modes.o \ 49 48 intel_overlay.o \ 50 49 intel_sideband.o \
+4 -7
drivers/gpu/drm/i915/i915_cmd_parser.c
··· 847 847 if (!ring->needs_cmd_parser) 848 848 return false; 849 849 850 - /* 851 - * XXX: VLV is Gen7 and therefore has cmd_tables, but has PPGTT 852 - * disabled. That will cause all of the parser's PPGTT checks to 853 - * fail. For now, disable parsing when PPGTT is off. 854 - */ 855 - if (USES_PPGTT(ring->dev)) 850 + if (!USES_PPGTT(ring->dev)) 856 851 return false; 857 852 858 853 return (i915.enable_cmd_parser == 1); ··· 883 888 * OACONTROL writes to only MI_LOAD_REGISTER_IMM commands. 884 889 */ 885 890 if (reg_addr == OACONTROL) { 886 - if (desc->cmd.value == MI_LOAD_REGISTER_MEM) 891 + if (desc->cmd.value == MI_LOAD_REGISTER_MEM) { 892 + DRM_DEBUG_DRIVER("CMD: Rejected LRM to OACONTROL\n"); 887 893 return false; 894 + } 888 895 889 896 if (desc->cmd.value == MI_LOAD_REGISTER_IMM(1)) 890 897 *oacontrol_set = (cmd[2] != 0);
+4 -5
drivers/gpu/drm/i915/i915_debugfs.c
··· 516 516 struct drm_info_node *node = m->private; 517 517 struct drm_device *dev = node->minor->dev; 518 518 struct drm_i915_private *dev_priv = dev->dev_private; 519 - unsigned long flags; 520 519 struct intel_crtc *crtc; 521 520 int ret; 522 521 ··· 528 529 const char plane = plane_name(crtc->plane); 529 530 struct intel_unpin_work *work; 530 531 531 - spin_lock_irqsave(&dev->event_lock, flags); 532 + spin_lock_irq(&dev->event_lock); 532 533 work = crtc->unpin_work; 533 534 if (work == NULL) { 534 535 seq_printf(m, "No flip due on pipe %c (plane %c)\n", ··· 574 575 seq_printf(m, "MMIO update completed? %d\n", addr == work->gtt_offset); 575 576 } 576 577 } 577 - spin_unlock_irqrestore(&dev->event_lock, flags); 578 + spin_unlock_irq(&dev->event_lock); 578 579 } 579 580 580 581 mutex_unlock(&dev->struct_mutex); ··· 716 717 } 717 718 718 719 for_each_pipe(dev_priv, pipe) { 719 - if (!intel_display_power_enabled(dev_priv, 720 + if (!intel_display_power_is_enabled(dev_priv, 720 721 POWER_DOMAIN_PIPE(pipe))) { 721 722 seq_printf(m, "Pipe %c power disabled\n", 722 723 pipe_name(pipe)); ··· 1985 1986 I915_READ(MAD_DIMM_C2)); 1986 1987 seq_printf(m, "TILECTL = 0x%08x\n", 1987 1988 I915_READ(TILECTL)); 1988 - if (IS_GEN8(dev)) 1989 + if (INTEL_INFO(dev)->gen >= 8) 1989 1990 seq_printf(m, "GAMTARBMODE = 0x%08x\n", 1990 1991 I915_READ(GAMTARBMODE)); 1991 1992 else
+8 -21
drivers/gpu/drm/i915/i915_dma.c
··· 1338 1338 1339 1339 intel_power_domains_init_hw(dev_priv); 1340 1340 1341 - /* 1342 - * We enable some interrupt sources in our postinstall hooks, so mark 1343 - * interrupts as enabled _before_ actually enabling them to avoid 1344 - * special cases in our ordering checks. 1345 - */ 1346 - dev_priv->pm._irqs_disabled = false; 1347 - 1348 - ret = drm_irq_install(dev, dev->pdev->irq); 1341 + ret = intel_irq_install(dev_priv); 1349 1342 if (ret) 1350 1343 goto cleanup_gem_stolen; 1351 1344 ··· 1363 1370 goto cleanup_gem; 1364 1371 1365 1372 /* Only enable hotplug handling once the fbdev is fully set up. */ 1366 - intel_hpd_init(dev); 1373 + intel_hpd_init(dev_priv); 1367 1374 1368 1375 /* 1369 1376 * Some ports require correctly set-up hpd registers for detection to ··· 1527 1534 1528 1535 info = (struct intel_device_info *)&dev_priv->info; 1529 1536 1530 - if (IS_VALLEYVIEW(dev)) 1537 + if (IS_VALLEYVIEW(dev) || INTEL_INFO(dev)->gen == 9) 1531 1538 for_each_pipe(dev_priv, pipe) 1532 1539 info->num_sprites[pipe] = 2; 1533 1540 else ··· 1607 1614 1608 1615 spin_lock_init(&dev_priv->irq_lock); 1609 1616 spin_lock_init(&dev_priv->gpu_error.lock); 1610 - spin_lock_init(&dev_priv->backlight_lock); 1617 + mutex_init(&dev_priv->backlight_lock); 1611 1618 spin_lock_init(&dev_priv->uncore.lock); 1612 1619 spin_lock_init(&dev_priv->mm.object_stat_lock); 1613 1620 spin_lock_init(&dev_priv->mmio_flip_lock); ··· 1733 1740 goto out_freewq; 1734 1741 } 1735 1742 1736 - intel_irq_init(dev); 1743 + intel_irq_init(dev_priv); 1737 1744 intel_uncore_sanitize(dev); 1738 1745 1739 1746 /* Try to make sure MCHBAR is enabled before poking at it */ ··· 1791 1798 if (IS_GEN5(dev)) 1792 1799 intel_gpu_ips_init(dev_priv); 1793 1800 1794 - intel_init_runtime_pm(dev_priv); 1801 + intel_runtime_pm_enable(dev_priv); 1795 1802 1796 1803 return 0; 1797 1804 1798 1805 out_power_well: 1799 - intel_power_domains_remove(dev_priv); 1806 + intel_power_domains_fini(dev_priv); 1800 1807 drm_vblank_cleanup(dev); 1801 1808 out_gem_unload: 1802 1809 WARN_ON(unregister_oom_notifier(&dev_priv->mm.oom_notifier)); ··· 1839 1846 return ret; 1840 1847 } 1841 1848 1842 - intel_fini_runtime_pm(dev_priv); 1849 + intel_power_domains_fini(dev_priv); 1843 1850 1844 1851 intel_gpu_ips_teardown(); 1845 - 1846 - /* The i915.ko module is still not prepared to be loaded when 1847 - * the power well is not enabled, so just enable it in case 1848 - * we're going to unload/reload. */ 1849 - intel_display_set_init_power(dev_priv, true); 1850 - intel_power_domains_remove(dev_priv); 1851 1852 1852 1853 i915_teardown_sysfs(dev); 1853 1854
+38 -11
drivers/gpu/drm/i915/i915_drv.c
··· 356 356 CURSOR_OFFSETS, 357 357 }; 358 358 359 + static const struct intel_device_info intel_skylake_info = { 360 + .is_preliminary = 1, 361 + .is_skylake = 1, 362 + .gen = 9, .num_pipes = 3, 363 + .need_gfx_hws = 1, .has_hotplug = 1, 364 + .ring_mask = RENDER_RING | BSD_RING | BLT_RING | VEBOX_RING, 365 + .has_llc = 1, 366 + .has_ddi = 1, 367 + .has_fbc = 1, 368 + GEN_DEFAULT_PIPEOFFSETS, 369 + IVB_CURSOR_OFFSETS, 370 + }; 371 + 359 372 /* 360 373 * Make sure any device matches here are from most specific to most 361 374 * general. For example, since the Quanta match is based on the subsystem ··· 405 392 INTEL_BDW_GT12D_IDS(&intel_broadwell_d_info), \ 406 393 INTEL_BDW_GT3M_IDS(&intel_broadwell_gt3m_info), \ 407 394 INTEL_BDW_GT3D_IDS(&intel_broadwell_gt3d_info), \ 408 - INTEL_CHV_IDS(&intel_cherryview_info) 395 + INTEL_CHV_IDS(&intel_cherryview_info), \ 396 + INTEL_SKL_IDS(&intel_skylake_info) 409 397 410 398 static const struct pci_device_id pciidlist[] = { /* aka */ 411 399 INTEL_PCI_IDS, ··· 474 460 dev_priv->pch_type = PCH_LPT; 475 461 DRM_DEBUG_KMS("Found LynxPoint LP PCH\n"); 476 462 WARN_ON(!IS_HASWELL(dev)); 463 + WARN_ON(!IS_ULT(dev)); 464 + } else if (id == INTEL_PCH_SPT_DEVICE_ID_TYPE) { 465 + dev_priv->pch_type = PCH_SPT; 466 + DRM_DEBUG_KMS("Found SunrisePoint PCH\n"); 467 + WARN_ON(!IS_SKYLAKE(dev)); 468 + WARN_ON(IS_ULT(dev)); 469 + } else if (id == INTEL_PCH_SPT_LP_DEVICE_ID_TYPE) { 470 + dev_priv->pch_type = PCH_SPT; 471 + DRM_DEBUG_KMS("Found SunrisePoint LP PCH\n"); 472 + WARN_ON(!IS_SKYLAKE(dev)); 477 473 WARN_ON(!IS_ULT(dev)); 478 474 } else 479 475 continue; ··· 599 575 600 576 flush_delayed_work(&dev_priv->rps.delayed_resume_work); 601 577 602 - intel_runtime_pm_disable_interrupts(dev); 578 + intel_runtime_pm_disable_interrupts(dev_priv); 603 579 intel_hpd_cancel_work(dev_priv); 604 580 605 581 intel_suspend_encoders(dev_priv); 606 582 607 583 intel_suspend_gt_powersave(dev); 608 584 609 - intel_modeset_suspend_hw(dev); 585 + intel_suspend_hw(dev); 610 586 } 611 587 612 588 i915_gem_suspend_gtt_mappings(dev); ··· 704 680 } 705 681 mutex_unlock(&dev->struct_mutex); 706 682 707 - intel_runtime_pm_restore_interrupts(dev); 683 + /* We need working interrupts for modeset enabling ... */ 684 + intel_runtime_pm_enable_interrupts(dev_priv); 708 685 709 686 intel_modeset_init_hw(dev); 710 687 711 688 { 712 - unsigned long irqflags; 713 - spin_lock_irqsave(&dev_priv->irq_lock, irqflags); 689 + spin_lock_irq(&dev_priv->irq_lock); 714 690 if (dev_priv->display.hpd_irq_setup) 715 691 dev_priv->display.hpd_irq_setup(dev); 716 - spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); 692 + spin_unlock_irq(&dev_priv->irq_lock); 717 693 } 718 694 719 695 intel_dp_mst_resume(dev); ··· 727 703 * bother with the tiny race here where we might loose hotplug 728 704 * notifications. 729 705 * */ 730 - intel_hpd_init(dev); 706 + intel_hpd_init(dev_priv); 731 707 /* Config may have changed between suspend and resume */ 732 708 drm_helper_hpd_irq_event(dev); 733 709 } ··· 843 819 ret = 0; 844 820 } 845 821 } 822 + 823 + if (i915_stop_ring_allow_warn(dev_priv)) 824 + pr_notice("drm/i915: Resetting chip after gpu hang\n"); 846 825 847 826 if (ret) { 848 827 DRM_ERROR("Failed to reset chip: %i\n", ret); ··· 1473 1446 * intel_mark_idle(). 1474 1447 */ 1475 1448 cancel_work_sync(&dev_priv->rps.work); 1476 - intel_runtime_pm_disable_interrupts(dev); 1449 + intel_runtime_pm_disable_interrupts(dev_priv); 1477 1450 1478 1451 ret = intel_suspend_complete(dev_priv); 1479 1452 if (ret) { 1480 1453 DRM_ERROR("Runtime suspend failed, disabling it (%d)\n", ret); 1481 - intel_runtime_pm_restore_interrupts(dev); 1454 + intel_runtime_pm_enable_interrupts(dev_priv); 1482 1455 1483 1456 return ret; 1484 1457 } ··· 1538 1511 i915_gem_init_swizzling(dev); 1539 1512 gen6_update_ring_freq(dev); 1540 1513 1541 - intel_runtime_pm_restore_interrupts(dev); 1514 + intel_runtime_pm_enable_interrupts(dev_priv); 1542 1515 intel_reset_gt_powersave(dev); 1543 1516 1544 1517 if (ret)
+38 -10
drivers/gpu/drm/i915/i915_drv.h
··· 55 55 56 56 #define DRIVER_NAME "i915" 57 57 #define DRIVER_DESC "Intel Graphics" 58 - #define DRIVER_DATE "20140905" 58 + #define DRIVER_DATE "20141003" 59 59 60 60 enum pipe { 61 61 INVALID_PIPE = -1, ··· 75 75 I915_MAX_TRANSCODERS 76 76 }; 77 77 #define transcoder_name(t) ((t) + 'A') 78 + 79 + /* 80 + * This is the maximum (across all platforms) number of planes (primary + 81 + * sprites) that can be active at the same time on one pipe. 82 + * 83 + * This value doesn't count the cursor plane. 84 + */ 85 + #define I915_MAX_PLANES 3 78 86 79 87 enum plane { 80 88 PLANE_A = 0, ··· 559 551 func(is_ivybridge) sep \ 560 552 func(is_valleyview) sep \ 561 553 func(is_haswell) sep \ 554 + func(is_skylake) sep \ 562 555 func(is_preliminary) sep \ 563 556 func(has_fbc) sep \ 564 557 func(has_pipe_cxsr) sep \ ··· 672 663 673 664 bool false_color; 674 665 666 + /* Tracks whether the HW is actually enabled, not whether the feature is 667 + * possible. */ 668 + bool enabled; 669 + 670 + /* On gen8 some rings cannont perform fbc clean operation so for now 671 + * we are doing this on SW with mmio. 672 + * This variable works in the opposite information direction 673 + * of ring->fbc_dirty telling software on frontbuffer tracking 674 + * to perform the cache clean on sw side. 675 + */ 676 + bool need_sw_cache_clean; 677 + 675 678 struct intel_fbc_work { 676 679 struct delayed_work work; 677 680 struct drm_crtc *crtc; ··· 725 704 PCH_IBX, /* Ibexpeak PCH */ 726 705 PCH_CPT, /* Cougarpoint PCH */ 727 706 PCH_LPT, /* Lynxpoint PCH */ 707 + PCH_SPT, /* Sunrisepoint PCH */ 728 708 PCH_NOP, 729 709 }; 730 710 ··· 1391 1369 * 1392 1370 * Our driver uses the autosuspend delay feature, which means we'll only really 1393 1371 * suspend if we stay with zero refcount for a certain amount of time. The 1394 - * default value is currently very conservative (see intel_init_runtime_pm), but 1372 + * default value is currently very conservative (see intel_runtime_pm_enable), but 1395 1373 * it can be changed with the standard runtime PM files from sysfs. 1396 1374 * 1397 1375 * The irqs_disabled variable becomes true exactly after we disable the IRQs and ··· 1404 1382 */ 1405 1383 struct i915_runtime_pm { 1406 1384 bool suspended; 1407 - bool _irqs_disabled; 1385 + bool irqs_enabled; 1408 1386 }; 1409 1387 1410 1388 enum intel_pipe_crc_source { ··· 1531 1509 struct intel_overlay *overlay; 1532 1510 1533 1511 /* backlight registers and fields in struct intel_panel */ 1534 - spinlock_t backlight_lock; 1512 + struct mutex backlight_lock; 1535 1513 1536 1514 /* LVDS info */ 1537 1515 bool no_aux_handshake; ··· 2095 2073 #define IS_CHERRYVIEW(dev) (INTEL_INFO(dev)->is_valleyview && IS_GEN8(dev)) 2096 2074 #define IS_HASWELL(dev) (INTEL_INFO(dev)->is_haswell) 2097 2075 #define IS_BROADWELL(dev) (!INTEL_INFO(dev)->is_valleyview && IS_GEN8(dev)) 2076 + #define IS_SKYLAKE(dev) (INTEL_INFO(dev)->is_skylake) 2098 2077 #define IS_MOBILE(dev) (INTEL_INFO(dev)->is_mobile) 2099 2078 #define IS_HSW_EARLY_SDV(dev) (IS_HASWELL(dev) && \ 2100 2079 (INTEL_DEVID(dev) & 0xFF00) == 0x0C00) ··· 2103 2080 ((INTEL_DEVID(dev) & 0xf) == 0x2 || \ 2104 2081 (INTEL_DEVID(dev) & 0xf) == 0x6 || \ 2105 2082 (INTEL_DEVID(dev) & 0xf) == 0xe)) 2083 + #define IS_BDW_GT3(dev) (IS_BROADWELL(dev) && \ 2084 + (INTEL_DEVID(dev) & 0x00F0) == 0x0020) 2106 2085 #define IS_HSW_ULT(dev) (IS_HASWELL(dev) && \ 2107 2086 (INTEL_DEVID(dev) & 0xFF00) == 0x0A00) 2108 2087 #define IS_ULT(dev) (IS_HSW_ULT(dev) || IS_BDW_ULT(dev)) ··· 2128 2103 #define IS_GEN6(dev) (INTEL_INFO(dev)->gen == 6) 2129 2104 #define IS_GEN7(dev) (INTEL_INFO(dev)->gen == 7) 2130 2105 #define IS_GEN8(dev) (INTEL_INFO(dev)->gen == 8) 2106 + #define IS_GEN9(dev) (INTEL_INFO(dev)->gen == 9) 2131 2107 2132 2108 #define RENDER_RING (1<<RCS) 2133 2109 #define BSD_RING (1<<VCS) ··· 2146 2120 2147 2121 #define HAS_HW_CONTEXTS(dev) (INTEL_INFO(dev)->gen >= 6) 2148 2122 #define HAS_LOGICAL_RING_CONTEXTS(dev) (INTEL_INFO(dev)->gen >= 8) 2149 - #define HAS_ALIASING_PPGTT(dev) (INTEL_INFO(dev)->gen >= 6) 2150 - #define HAS_PPGTT(dev) (INTEL_INFO(dev)->gen >= 7 && !IS_GEN8(dev)) 2151 2123 #define USES_PPGTT(dev) (i915.enable_ppgtt) 2152 2124 #define USES_FULL_PPGTT(dev) (i915.enable_ppgtt == 2) 2153 2125 ··· 2192 2168 #define INTEL_PCH_PPT_DEVICE_ID_TYPE 0x1e00 2193 2169 #define INTEL_PCH_LPT_DEVICE_ID_TYPE 0x8c00 2194 2170 #define INTEL_PCH_LPT_LP_DEVICE_ID_TYPE 0x9c00 2171 + #define INTEL_PCH_SPT_DEVICE_ID_TYPE 0xA100 2172 + #define INTEL_PCH_SPT_LP_DEVICE_ID_TYPE 0x9D00 2195 2173 2196 2174 #define INTEL_PCH_TYPE(dev) (to_i915(dev)->pch_type) 2175 + #define HAS_PCH_SPT(dev) (INTEL_PCH_TYPE(dev) == PCH_SPT) 2197 2176 #define HAS_PCH_LPT(dev) (INTEL_PCH_TYPE(dev) == PCH_LPT) 2198 2177 #define HAS_PCH_CPT(dev) (INTEL_PCH_TYPE(dev) == PCH_CPT) 2199 2178 #define HAS_PCH_IBX(dev) (INTEL_PCH_TYPE(dev) == PCH_IBX) ··· 2289 2262 2290 2263 void gen6_set_pm_mask(struct drm_i915_private *dev_priv, u32 pm_iir, 2291 2264 int new_delay); 2292 - extern void intel_irq_init(struct drm_device *dev); 2293 - extern void intel_hpd_init(struct drm_device *dev); 2265 + extern void intel_irq_init(struct drm_i915_private *dev_priv); 2266 + extern void intel_hpd_init(struct drm_i915_private *dev_priv); 2267 + int intel_irq_install(struct drm_i915_private *dev_priv); 2268 + void intel_irq_uninstall(struct drm_i915_private *dev_priv); 2294 2269 2295 2270 extern void intel_uncore_sanitize(struct drm_device *dev); 2296 2271 extern void intel_uncore_early_sanitize(struct drm_device *dev, ··· 2822 2793 2823 2794 /* modesetting */ 2824 2795 extern void intel_modeset_init_hw(struct drm_device *dev); 2825 - extern void intel_modeset_suspend_hw(struct drm_device *dev); 2826 2796 extern void intel_modeset_init(struct drm_device *dev); 2827 2797 extern void intel_modeset_gem_init(struct drm_device *dev); 2828 2798 extern void intel_modeset_cleanup(struct drm_device *dev); ··· 2832 2804 extern void i915_redisable_vga(struct drm_device *dev); 2833 2805 extern void i915_redisable_vga_power_on(struct drm_device *dev); 2834 2806 extern bool intel_fbc_enabled(struct drm_device *dev); 2835 - extern void gen8_fbc_sw_flush(struct drm_device *dev, u32 value); 2807 + extern void bdw_fbc_sw_flush(struct drm_device *dev, u32 value); 2836 2808 extern void intel_disable_fbc(struct drm_device *dev); 2837 2809 extern bool ironlake_set_drps(struct drm_device *dev, u8 val); 2838 2810 extern void intel_init_pch_refclk(struct drm_device *dev);
+29 -72
drivers/gpu/drm/i915/i915_gem.c
··· 1945 1945 i915_gem_shrink(struct drm_i915_private *dev_priv, 1946 1946 long target, unsigned flags) 1947 1947 { 1948 - const bool purgeable_only = flags & I915_SHRINK_PURGEABLE; 1948 + const struct { 1949 + struct list_head *list; 1950 + unsigned int bit; 1951 + } phases[] = { 1952 + { &dev_priv->mm.unbound_list, I915_SHRINK_UNBOUND }, 1953 + { &dev_priv->mm.bound_list, I915_SHRINK_BOUND }, 1954 + { NULL, 0 }, 1955 + }, *phase; 1949 1956 unsigned long count = 0; 1950 1957 1951 1958 /* ··· 1974 1967 * dev->struct_mutex and so we won't ever be able to observe an 1975 1968 * object on the bound_list with a reference count equals 0. 1976 1969 */ 1977 - if (flags & I915_SHRINK_UNBOUND) { 1970 + for (phase = phases; phase->list; phase++) { 1978 1971 struct list_head still_in_list; 1979 1972 1980 - INIT_LIST_HEAD(&still_in_list); 1981 - while (count < target && !list_empty(&dev_priv->mm.unbound_list)) { 1982 - struct drm_i915_gem_object *obj; 1983 - 1984 - obj = list_first_entry(&dev_priv->mm.unbound_list, 1985 - typeof(*obj), global_list); 1986 - list_move_tail(&obj->global_list, &still_in_list); 1987 - 1988 - if (!i915_gem_object_is_purgeable(obj) && purgeable_only) 1989 - continue; 1990 - 1991 - drm_gem_object_reference(&obj->base); 1992 - 1993 - if (i915_gem_object_put_pages(obj) == 0) 1994 - count += obj->base.size >> PAGE_SHIFT; 1995 - 1996 - drm_gem_object_unreference(&obj->base); 1997 - } 1998 - list_splice(&still_in_list, &dev_priv->mm.unbound_list); 1999 - } 2000 - 2001 - if (flags & I915_SHRINK_BOUND) { 2002 - struct list_head still_in_list; 1973 + if ((flags & phase->bit) == 0) 1974 + continue; 2003 1975 2004 1976 INIT_LIST_HEAD(&still_in_list); 2005 - while (count < target && !list_empty(&dev_priv->mm.bound_list)) { 1977 + while (count < target && !list_empty(phase->list)) { 2006 1978 struct drm_i915_gem_object *obj; 2007 1979 struct i915_vma *vma, *v; 2008 1980 2009 - obj = list_first_entry(&dev_priv->mm.bound_list, 1981 + obj = list_first_entry(phase->list, 2010 1982 typeof(*obj), global_list); 2011 1983 list_move_tail(&obj->global_list, &still_in_list); 2012 1984 2013 - if (!i915_gem_object_is_purgeable(obj) && purgeable_only) 1985 + if (flags & I915_SHRINK_PURGEABLE && 1986 + !i915_gem_object_is_purgeable(obj)) 2014 1987 continue; 2015 1988 2016 1989 drm_gem_object_reference(&obj->base); 2017 1990 2018 - list_for_each_entry_safe(vma, v, &obj->vma_list, vma_link) 1991 + /* For the unbound phase, this should be a no-op! */ 1992 + list_for_each_entry_safe(vma, v, 1993 + &obj->vma_list, vma_link) 2019 1994 if (i915_vma_unbind(vma)) 2020 1995 break; 2021 1996 ··· 2006 2017 2007 2018 drm_gem_object_unreference(&obj->base); 2008 2019 } 2009 - list_splice(&still_in_list, &dev_priv->mm.bound_list); 2020 + list_splice(&still_in_list, phase->list); 2010 2021 } 2011 2022 2012 2023 return count; ··· 3155 3166 obj->stride, obj->tiling_mode); 3156 3167 3157 3168 switch (INTEL_INFO(dev)->gen) { 3169 + case 9: 3158 3170 case 8: 3159 3171 case 7: 3160 3172 case 6: ··· 3374 3384 return true; 3375 3385 } 3376 3386 3377 - static void i915_gem_verify_gtt(struct drm_device *dev) 3378 - { 3379 - #if WATCH_GTT 3380 - struct drm_i915_private *dev_priv = dev->dev_private; 3381 - struct drm_i915_gem_object *obj; 3382 - int err = 0; 3383 - 3384 - list_for_each_entry(obj, &dev_priv->mm.gtt_list, global_list) { 3385 - if (obj->gtt_space == NULL) { 3386 - printk(KERN_ERR "object found on GTT list with no space reserved\n"); 3387 - err++; 3388 - continue; 3389 - } 3390 - 3391 - if (obj->cache_level != obj->gtt_space->color) { 3392 - printk(KERN_ERR "object reserved space [%08lx, %08lx] with wrong color, cache_level=%x, color=%lx\n", 3393 - i915_gem_obj_ggtt_offset(obj), 3394 - i915_gem_obj_ggtt_offset(obj) + i915_gem_obj_ggtt_size(obj), 3395 - obj->cache_level, 3396 - obj->gtt_space->color); 3397 - err++; 3398 - continue; 3399 - } 3400 - 3401 - if (!i915_gem_valid_gtt_space(dev, 3402 - obj->gtt_space, 3403 - obj->cache_level)) { 3404 - printk(KERN_ERR "invalid GTT space found at [%08lx, %08lx] - color=%x\n", 3405 - i915_gem_obj_ggtt_offset(obj), 3406 - i915_gem_obj_ggtt_offset(obj) + i915_gem_obj_ggtt_size(obj), 3407 - obj->cache_level); 3408 - err++; 3409 - continue; 3410 - } 3411 - } 3412 - 3413 - WARN_ON(err); 3414 - #endif 3415 - } 3416 - 3417 3387 /** 3418 3388 * Finds free space in the GTT aperture and binds the object there. 3419 3389 */ ··· 3482 3532 vma->bind_vma(vma, obj->cache_level, 3483 3533 flags & (PIN_MAPPABLE | PIN_GLOBAL) ? GLOBAL_BIND : 0); 3484 3534 3485 - i915_gem_verify_gtt(dev); 3486 3535 return vma; 3487 3536 3488 3537 err_remove_node: ··· 3718 3769 old_write_domain); 3719 3770 } 3720 3771 3721 - i915_gem_verify_gtt(dev); 3722 3772 return 0; 3723 3773 } 3724 3774 ··· 5067 5119 return ret; 5068 5120 } 5069 5121 5122 + /** 5123 + * i915_gem_track_fb - update frontbuffer tracking 5124 + * old: current GEM buffer for the frontbuffer slots 5125 + * new: new GEM buffer for the frontbuffer slots 5126 + * frontbuffer_bits: bitmask of frontbuffer slots 5127 + * 5128 + * This updates the frontbuffer tracking bits @frontbuffer_bits by clearing them 5129 + * from @old and setting them in @new. Both @old and @new can be NULL. 5130 + */ 5070 5131 void i915_gem_track_fb(struct drm_i915_gem_object *old, 5071 5132 struct drm_i915_gem_object *new, 5072 5133 unsigned frontbuffer_bits)
+29 -7
drivers/gpu/drm/i915/i915_gem_gtt.c
··· 35 35 36 36 static int sanitize_enable_ppgtt(struct drm_device *dev, int enable_ppgtt) 37 37 { 38 - if (enable_ppgtt == 0 || !HAS_ALIASING_PPGTT(dev)) 38 + bool has_aliasing_ppgtt; 39 + bool has_full_ppgtt; 40 + 41 + has_aliasing_ppgtt = INTEL_INFO(dev)->gen >= 6; 42 + has_full_ppgtt = INTEL_INFO(dev)->gen >= 7; 43 + if (IS_GEN8(dev)) 44 + has_full_ppgtt = false; /* XXX why? */ 45 + 46 + if (enable_ppgtt == 0 || !has_aliasing_ppgtt) 39 47 return 0; 40 48 41 49 if (enable_ppgtt == 1) 42 50 return 1; 43 51 44 - if (enable_ppgtt == 2 && HAS_PPGTT(dev)) 52 + if (enable_ppgtt == 2 && has_full_ppgtt) 45 53 return 2; 46 54 47 55 #ifdef CONFIG_INTEL_IOMMU ··· 67 59 return 0; 68 60 } 69 61 70 - return HAS_ALIASING_PPGTT(dev) ? 1 : 0; 62 + return has_aliasing_ppgtt ? 1 : 0; 71 63 } 72 64 73 65 ··· 1100 1092 1101 1093 if (INTEL_INFO(dev)->gen < 8) 1102 1094 return gen6_ppgtt_init(ppgtt); 1103 - else if (IS_GEN8(dev)) 1095 + else if (IS_GEN8(dev) || IS_GEN9(dev)) 1104 1096 return gen8_ppgtt_init(ppgtt, dev_priv->gtt.base.total); 1105 1097 else 1106 1098 BUG(); ··· 1772 1764 page = alloc_page(GFP_KERNEL | GFP_DMA32 | __GFP_ZERO); 1773 1765 if (page == NULL) 1774 1766 return -ENOMEM; 1775 - get_page(page); 1776 1767 set_pages_uc(page, 1); 1777 1768 1778 1769 #ifdef CONFIG_INTEL_IOMMU ··· 1796 1789 set_pages_wb(page, 1); 1797 1790 pci_unmap_page(dev->pdev, dev_priv->gtt.base.scratch.addr, 1798 1791 PAGE_SIZE, PCI_DMA_BIDIRECTIONAL); 1799 - put_page(page); 1800 1792 __free_page(page); 1801 1793 } 1802 1794 ··· 1863 1857 return (gmch_ctrl - 0x11 + 2) << 22; 1864 1858 else 1865 1859 return (gmch_ctrl - 0x17 + 9) << 22; 1860 + } 1861 + 1862 + static size_t gen9_get_stolen_size(u16 gen9_gmch_ctl) 1863 + { 1864 + gen9_gmch_ctl >>= BDW_GMCH_GMS_SHIFT; 1865 + gen9_gmch_ctl &= BDW_GMCH_GMS_MASK; 1866 + 1867 + if (gen9_gmch_ctl < 0xf0) 1868 + return gen9_gmch_ctl << 25; /* 32 MB units */ 1869 + else 1870 + /* 4MB increments starting at 0xf0 for 4MB */ 1871 + return (gen9_gmch_ctl - 0xf0 + 1) << 22; 1866 1872 } 1867 1873 1868 1874 static int ggtt_probe_common(struct drm_device *dev, ··· 1973 1955 1974 1956 pci_read_config_word(dev->pdev, SNB_GMCH_CTRL, &snb_gmch_ctl); 1975 1957 1976 - if (IS_CHERRYVIEW(dev)) { 1958 + if (INTEL_INFO(dev)->gen >= 9) { 1959 + *stolen = gen9_get_stolen_size(snb_gmch_ctl); 1960 + gtt_size = gen8_get_total_gtt_size(snb_gmch_ctl); 1961 + } else if (IS_CHERRYVIEW(dev)) { 1977 1962 *stolen = chv_get_stolen_size(snb_gmch_ctl); 1978 1963 gtt_size = chv_get_total_gtt_size(snb_gmch_ctl); 1979 1964 } else { ··· 2148 2127 vma->obj = obj; 2149 2128 2150 2129 switch (INTEL_INFO(vm->dev)->gen) { 2130 + case 9: 2151 2131 case 8: 2152 2132 case 7: 2153 2133 case 6:
+7 -6
drivers/gpu/drm/i915/i915_gpu_error.c
··· 765 765 766 766 /* Fences */ 767 767 switch (INTEL_INFO(dev)->gen) { 768 + case 9: 768 769 case 8: 769 770 case 7: 770 771 case 6: ··· 924 923 ering->vm_info.gfx_mode = I915_READ(RING_MODE_GEN7(ring)); 925 924 926 925 switch (INTEL_INFO(dev)->gen) { 926 + case 9: 927 927 case 8: 928 928 for (i = 0; i < 4; i++) { 929 929 ering->vm_info.pdp[i] = ··· 1328 1326 struct i915_error_state_file_priv *error_priv) 1329 1327 { 1330 1328 struct drm_i915_private *dev_priv = dev->dev_private; 1331 - unsigned long flags; 1332 1329 1333 - spin_lock_irqsave(&dev_priv->gpu_error.lock, flags); 1330 + spin_lock_irq(&dev_priv->gpu_error.lock); 1334 1331 error_priv->error = dev_priv->gpu_error.first_error; 1335 1332 if (error_priv->error) 1336 1333 kref_get(&error_priv->error->ref); 1337 - spin_unlock_irqrestore(&dev_priv->gpu_error.lock, flags); 1334 + spin_unlock_irq(&dev_priv->gpu_error.lock); 1338 1335 1339 1336 } 1340 1337 ··· 1347 1346 { 1348 1347 struct drm_i915_private *dev_priv = dev->dev_private; 1349 1348 struct drm_i915_error_state *error; 1350 - unsigned long flags; 1351 1349 1352 - spin_lock_irqsave(&dev_priv->gpu_error.lock, flags); 1350 + spin_lock_irq(&dev_priv->gpu_error.lock); 1353 1351 error = dev_priv->gpu_error.first_error; 1354 1352 dev_priv->gpu_error.first_error = NULL; 1355 - spin_unlock_irqrestore(&dev_priv->gpu_error.lock, flags); 1353 + spin_unlock_irq(&dev_priv->gpu_error.lock); 1356 1354 1357 1355 if (error) 1358 1356 kref_put(&error->ref, i915_error_state_free); ··· 1389 1389 WARN_ONCE(1, "Unsupported platform\n"); 1390 1390 case 7: 1391 1391 case 8: 1392 + case 9: 1392 1393 instdone[0] = I915_READ(GEN7_INSTDONE_1); 1393 1394 instdone[1] = I915_READ(GEN7_SC_INSTDONE); 1394 1395 instdone[2] = I915_READ(GEN7_SAMPLER_INSTDONE);
+174 -100
drivers/gpu/drm/i915/i915_irq.c
··· 37 37 #include "i915_trace.h" 38 38 #include "intel_drv.h" 39 39 40 + /** 41 + * DOC: interrupt handling 42 + * 43 + * These functions provide the basic support for enabling and disabling the 44 + * interrupt handling support. There's a lot more functionality in i915_irq.c 45 + * and related files, but that will be described in separate chapters. 46 + */ 47 + 40 48 static const u32 hpd_ibx[] = { 41 49 [HPD_CRT] = SDE_CRT_HOTPLUG, 42 50 [HPD_SDVO_B] = SDE_SDVOB_HOTPLUG, ··· 318 310 { 319 311 struct drm_i915_private *dev_priv = dev->dev_private; 320 312 struct intel_crtc *crtc; 321 - unsigned long flags; 322 313 323 - spin_lock_irqsave(&dev_priv->irq_lock, flags); 314 + spin_lock_irq(&dev_priv->irq_lock); 324 315 325 316 for_each_intel_crtc(dev, crtc) { 326 317 u32 reg = PIPESTAT(crtc->pipe); ··· 338 331 DRM_ERROR("pipe %c underrun\n", pipe_name(crtc->pipe)); 339 332 } 340 333 341 - spin_unlock_irqrestore(&dev_priv->irq_lock, flags); 334 + spin_unlock_irq(&dev_priv->irq_lock); 342 335 } 343 336 344 337 static void i9xx_set_fifo_underrun_reporting(struct drm_device *dev, ··· 510 503 ironlake_set_fifo_underrun_reporting(dev, pipe, enable); 511 504 else if (IS_GEN7(dev)) 512 505 ivybridge_set_fifo_underrun_reporting(dev, pipe, enable, old); 513 - else if (IS_GEN8(dev)) 506 + else if (IS_GEN8(dev) || IS_GEN9(dev)) 514 507 broadwell_set_fifo_underrun_reporting(dev, pipe, enable); 515 508 516 509 return old; ··· 596 589 u32 pipestat = I915_READ(reg) & PIPESTAT_INT_ENABLE_MASK; 597 590 598 591 assert_spin_locked(&dev_priv->irq_lock); 592 + WARN_ON(!intel_irqs_enabled(dev_priv)); 599 593 600 594 if (WARN_ONCE(enable_mask & ~PIPESTAT_INT_ENABLE_MASK || 601 595 status_mask & ~PIPESTAT_INT_STATUS_MASK, ··· 623 615 u32 pipestat = I915_READ(reg) & PIPESTAT_INT_ENABLE_MASK; 624 616 625 617 assert_spin_locked(&dev_priv->irq_lock); 618 + WARN_ON(!intel_irqs_enabled(dev_priv)); 626 619 627 620 if (WARN_ONCE(enable_mask & ~PIPESTAT_INT_ENABLE_MASK || 628 621 status_mask & ~PIPESTAT_INT_STATUS_MASK, ··· 703 694 static void i915_enable_asle_pipestat(struct drm_device *dev) 704 695 { 705 696 struct drm_i915_private *dev_priv = dev->dev_private; 706 - unsigned long irqflags; 707 697 708 698 if (!dev_priv->opregion.asle || !IS_MOBILE(dev)) 709 699 return; 710 700 711 - spin_lock_irqsave(&dev_priv->irq_lock, irqflags); 701 + spin_lock_irq(&dev_priv->irq_lock); 712 702 713 703 i915_enable_pipestat(dev_priv, PIPE_B, PIPE_LEGACY_BLC_EVENT_STATUS); 714 704 if (INTEL_INFO(dev)->gen >= 4) 715 705 i915_enable_pipestat(dev_priv, PIPE_A, 716 706 PIPE_LEGACY_BLC_EVENT_STATUS); 717 707 718 - spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); 708 + spin_unlock_irq(&dev_priv->irq_lock); 719 709 } 720 710 721 711 /** ··· 1102 1094 { 1103 1095 struct drm_i915_private *dev_priv = 1104 1096 container_of(work, struct drm_i915_private, dig_port_work); 1105 - unsigned long irqflags; 1106 1097 u32 long_port_mask, short_port_mask; 1107 1098 struct intel_digital_port *intel_dig_port; 1108 1099 int i, ret; 1109 1100 u32 old_bits = 0; 1110 1101 1111 - spin_lock_irqsave(&dev_priv->irq_lock, irqflags); 1102 + spin_lock_irq(&dev_priv->irq_lock); 1112 1103 long_port_mask = dev_priv->long_hpd_port_mask; 1113 1104 dev_priv->long_hpd_port_mask = 0; 1114 1105 short_port_mask = dev_priv->short_hpd_port_mask; 1115 1106 dev_priv->short_hpd_port_mask = 0; 1116 - spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); 1107 + spin_unlock_irq(&dev_priv->irq_lock); 1117 1108 1118 1109 for (i = 0; i < I915_MAX_PORTS; i++) { 1119 1110 bool valid = false; ··· 1137 1130 } 1138 1131 1139 1132 if (old_bits) { 1140 - spin_lock_irqsave(&dev_priv->irq_lock, irqflags); 1133 + spin_lock_irq(&dev_priv->irq_lock); 1141 1134 dev_priv->hpd_event_bits |= old_bits; 1142 - spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); 1135 + spin_unlock_irq(&dev_priv->irq_lock); 1143 1136 schedule_work(&dev_priv->hotplug_work); 1144 1137 } 1145 1138 } ··· 1158 1151 struct intel_connector *intel_connector; 1159 1152 struct intel_encoder *intel_encoder; 1160 1153 struct drm_connector *connector; 1161 - unsigned long irqflags; 1162 1154 bool hpd_disabled = false; 1163 1155 bool changed = false; 1164 1156 u32 hpd_event_bits; ··· 1165 1159 mutex_lock(&mode_config->mutex); 1166 1160 DRM_DEBUG_KMS("running encoder hotplug functions\n"); 1167 1161 1168 - spin_lock_irqsave(&dev_priv->irq_lock, irqflags); 1162 + spin_lock_irq(&dev_priv->irq_lock); 1169 1163 1170 1164 hpd_event_bits = dev_priv->hpd_event_bits; 1171 1165 dev_priv->hpd_event_bits = 0; ··· 1199 1193 msecs_to_jiffies(I915_REENABLE_HOTPLUG_DELAY)); 1200 1194 } 1201 1195 1202 - spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); 1196 + spin_unlock_irq(&dev_priv->irq_lock); 1203 1197 1204 1198 list_for_each_entry(connector, &mode_config->connector_list, head) { 1205 1199 intel_connector = to_intel_connector(connector); ··· 1494 1488 u32 error_status, row, bank, subbank; 1495 1489 char *parity_event[6]; 1496 1490 uint32_t misccpctl; 1497 - unsigned long flags; 1498 1491 uint8_t slice = 0; 1499 1492 1500 1493 /* We must turn off DOP level clock gating to access the L3 registers. ··· 1552 1547 1553 1548 out: 1554 1549 WARN_ON(dev_priv->l3_parity.which_slice); 1555 - spin_lock_irqsave(&dev_priv->irq_lock, flags); 1550 + spin_lock_irq(&dev_priv->irq_lock); 1556 1551 gen5_enable_gt_irq(dev_priv, GT_PARITY_ERROR(dev_priv->dev)); 1557 - spin_unlock_irqrestore(&dev_priv->irq_lock, flags); 1552 + spin_unlock_irq(&dev_priv->irq_lock); 1558 1553 1559 1554 mutex_unlock(&dev_priv->dev->struct_mutex); 1560 1555 } ··· 2571 2566 } 2572 2567 2573 2568 for_each_pipe(dev_priv, pipe) { 2574 - uint32_t pipe_iir; 2569 + uint32_t pipe_iir, flip_done = 0, fault_errors = 0; 2575 2570 2576 2571 if (!(master_ctl & GEN8_DE_PIPE_IRQ(pipe))) 2577 2572 continue; ··· 2580 2575 if (pipe_iir) { 2581 2576 ret = IRQ_HANDLED; 2582 2577 I915_WRITE(GEN8_DE_PIPE_IIR(pipe), pipe_iir); 2578 + 2583 2579 if (pipe_iir & GEN8_PIPE_VBLANK && 2584 2580 intel_pipe_handle_vblank(dev, pipe)) 2585 2581 intel_check_page_flip(dev, pipe); 2586 2582 2587 - if (pipe_iir & GEN8_PIPE_PRIMARY_FLIP_DONE) { 2583 + if (IS_GEN9(dev)) 2584 + flip_done = pipe_iir & GEN9_PIPE_PLANE1_FLIP_DONE; 2585 + else 2586 + flip_done = pipe_iir & GEN8_PIPE_PRIMARY_FLIP_DONE; 2587 + 2588 + if (flip_done) { 2588 2589 intel_prepare_page_flip(dev, pipe); 2589 2590 intel_finish_page_flip_plane(dev, pipe); 2590 2591 } ··· 2605 2594 pipe_name(pipe)); 2606 2595 } 2607 2596 2608 - if (pipe_iir & GEN8_DE_PIPE_IRQ_FAULT_ERRORS) { 2597 + 2598 + if (IS_GEN9(dev)) 2599 + fault_errors = pipe_iir & GEN9_DE_PIPE_IRQ_FAULT_ERRORS; 2600 + else 2601 + fault_errors = pipe_iir & GEN8_DE_PIPE_IRQ_FAULT_ERRORS; 2602 + 2603 + if (fault_errors) 2609 2604 DRM_ERROR("Fault errors on pipe %c\n: 0x%08x", 2610 2605 pipe_name(pipe), 2611 2606 pipe_iir & GEN8_DE_PIPE_IRQ_FAULT_ERRORS); 2612 - } 2613 2607 } else 2614 2608 DRM_ERROR("The master control interrupt lied (DE PIPE)!\n"); 2615 2609 } ··· 3460 3444 gen8_gt_irq_reset(dev_priv); 3461 3445 3462 3446 for_each_pipe(dev_priv, pipe) 3463 - if (intel_display_power_enabled(dev_priv, 3464 - POWER_DOMAIN_PIPE(pipe))) 3447 + if (intel_display_power_is_enabled(dev_priv, 3448 + POWER_DOMAIN_PIPE(pipe))) 3465 3449 GEN8_IRQ_RESET_NDX(DE_PIPE, pipe); 3466 3450 3467 3451 GEN5_IRQ_RESET(GEN8_DE_PORT_); ··· 3473 3457 3474 3458 void gen8_irq_power_well_post_enable(struct drm_i915_private *dev_priv) 3475 3459 { 3476 - unsigned long irqflags; 3477 3460 uint32_t extra_ier = GEN8_PIPE_VBLANK | GEN8_PIPE_FIFO_UNDERRUN; 3478 3461 3479 - spin_lock_irqsave(&dev_priv->irq_lock, irqflags); 3462 + spin_lock_irq(&dev_priv->irq_lock); 3480 3463 GEN8_IRQ_INIT_NDX(DE_PIPE, PIPE_B, dev_priv->de_irq_mask[PIPE_B], 3481 3464 ~dev_priv->de_irq_mask[PIPE_B] | extra_ier); 3482 3465 GEN8_IRQ_INIT_NDX(DE_PIPE, PIPE_C, dev_priv->de_irq_mask[PIPE_C], 3483 3466 ~dev_priv->de_irq_mask[PIPE_C] | extra_ier); 3484 - spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); 3467 + spin_unlock_irq(&dev_priv->irq_lock); 3485 3468 } 3486 3469 3487 3470 static void cherryview_irq_preinstall(struct drm_device *dev) ··· 3599 3584 3600 3585 static int ironlake_irq_postinstall(struct drm_device *dev) 3601 3586 { 3602 - unsigned long irqflags; 3603 3587 struct drm_i915_private *dev_priv = dev->dev_private; 3604 3588 u32 display_mask, extra_mask; 3605 3589 ··· 3637 3623 * spinlocking not required here for correctness since interrupt 3638 3624 * setup is guaranteed to run in single-threaded context. But we 3639 3625 * need it to make the assert_spin_locked happy. */ 3640 - spin_lock_irqsave(&dev_priv->irq_lock, irqflags); 3626 + spin_lock_irq(&dev_priv->irq_lock); 3641 3627 ironlake_enable_display_irq(dev_priv, DE_PCU_EVENT); 3642 - spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); 3628 + spin_unlock_irq(&dev_priv->irq_lock); 3643 3629 } 3644 3630 3645 3631 return 0; ··· 3715 3701 3716 3702 dev_priv->display_irqs_enabled = true; 3717 3703 3718 - if (dev_priv->dev->irq_enabled) 3704 + if (intel_irqs_enabled(dev_priv)) 3719 3705 valleyview_display_irqs_install(dev_priv); 3720 3706 } 3721 3707 ··· 3728 3714 3729 3715 dev_priv->display_irqs_enabled = false; 3730 3716 3731 - if (dev_priv->dev->irq_enabled) 3717 + if (intel_irqs_enabled(dev_priv)) 3732 3718 valleyview_display_irqs_uninstall(dev_priv); 3733 3719 } 3734 3720 3735 3721 static int valleyview_irq_postinstall(struct drm_device *dev) 3736 3722 { 3737 3723 struct drm_i915_private *dev_priv = dev->dev_private; 3738 - unsigned long irqflags; 3739 3724 3740 3725 dev_priv->irq_mask = ~0; 3741 3726 ··· 3748 3735 3749 3736 /* Interrupt setup is already guaranteed to be single-threaded, this is 3750 3737 * just to make the assert_spin_locked check happy. */ 3751 - spin_lock_irqsave(&dev_priv->irq_lock, irqflags); 3738 + spin_lock_irq(&dev_priv->irq_lock); 3752 3739 if (dev_priv->display_irqs_enabled) 3753 3740 valleyview_display_irqs_install(dev_priv); 3754 - spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); 3741 + spin_unlock_irq(&dev_priv->irq_lock); 3755 3742 3756 3743 I915_WRITE(VLV_IIR, 0xffffffff); 3757 3744 I915_WRITE(VLV_IIR, 0xffffffff); ··· 3796 3783 3797 3784 static void gen8_de_irq_postinstall(struct drm_i915_private *dev_priv) 3798 3785 { 3799 - uint32_t de_pipe_masked = GEN8_PIPE_PRIMARY_FLIP_DONE | 3800 - GEN8_PIPE_CDCLK_CRC_DONE | 3801 - GEN8_DE_PIPE_IRQ_FAULT_ERRORS; 3802 - uint32_t de_pipe_enables = de_pipe_masked | GEN8_PIPE_VBLANK | 3803 - GEN8_PIPE_FIFO_UNDERRUN; 3786 + uint32_t de_pipe_masked = GEN8_PIPE_CDCLK_CRC_DONE; 3787 + uint32_t de_pipe_enables; 3804 3788 int pipe; 3789 + 3790 + if (IS_GEN9(dev_priv)) 3791 + de_pipe_masked |= GEN9_PIPE_PLANE1_FLIP_DONE | 3792 + GEN9_DE_PIPE_IRQ_FAULT_ERRORS; 3793 + else 3794 + de_pipe_masked |= GEN8_PIPE_PRIMARY_FLIP_DONE | 3795 + GEN8_DE_PIPE_IRQ_FAULT_ERRORS; 3796 + 3797 + de_pipe_enables = de_pipe_masked | GEN8_PIPE_VBLANK | 3798 + GEN8_PIPE_FIFO_UNDERRUN; 3799 + 3805 3800 dev_priv->de_irq_mask[PIPE_A] = ~de_pipe_masked; 3806 3801 dev_priv->de_irq_mask[PIPE_B] = ~de_pipe_masked; 3807 3802 dev_priv->de_irq_mask[PIPE_C] = ~de_pipe_masked; 3808 3803 3809 3804 for_each_pipe(dev_priv, pipe) 3810 - if (intel_display_power_enabled(dev_priv, 3805 + if (intel_display_power_is_enabled(dev_priv, 3811 3806 POWER_DOMAIN_PIPE(pipe))) 3812 3807 GEN8_IRQ_INIT_NDX(DE_PIPE, pipe, 3813 3808 dev_priv->de_irq_mask[pipe], ··· 3850 3829 I915_DISPLAY_PIPE_C_EVENT_INTERRUPT; 3851 3830 u32 pipestat_enable = PLANE_FLIP_DONE_INT_STATUS_VLV | 3852 3831 PIPE_CRC_DONE_INTERRUPT_STATUS; 3853 - unsigned long irqflags; 3854 3832 int pipe; 3855 3833 3856 3834 /* ··· 3861 3841 for_each_pipe(dev_priv, pipe) 3862 3842 I915_WRITE(PIPESTAT(pipe), 0xffff); 3863 3843 3864 - spin_lock_irqsave(&dev_priv->irq_lock, irqflags); 3844 + spin_lock_irq(&dev_priv->irq_lock); 3865 3845 i915_enable_pipestat(dev_priv, PIPE_A, PIPE_GMBUS_INTERRUPT_STATUS); 3866 3846 for_each_pipe(dev_priv, pipe) 3867 3847 i915_enable_pipestat(dev_priv, pipe, pipestat_enable); 3868 - spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); 3848 + spin_unlock_irq(&dev_priv->irq_lock); 3869 3849 3870 3850 I915_WRITE(VLV_IIR, 0xffffffff); 3871 3851 I915_WRITE(VLV_IMR, dev_priv->irq_mask); ··· 3892 3872 static void valleyview_irq_uninstall(struct drm_device *dev) 3893 3873 { 3894 3874 struct drm_i915_private *dev_priv = dev->dev_private; 3895 - unsigned long irqflags; 3896 3875 int pipe; 3897 3876 3898 3877 if (!dev_priv) ··· 3906 3887 I915_WRITE(PORT_HOTPLUG_EN, 0); 3907 3888 I915_WRITE(PORT_HOTPLUG_STAT, I915_READ(PORT_HOTPLUG_STAT)); 3908 3889 3909 - spin_lock_irqsave(&dev_priv->irq_lock, irqflags); 3890 + /* Interrupt setup is already guaranteed to be single-threaded, this is 3891 + * just to make the assert_spin_locked check happy. */ 3892 + spin_lock_irq(&dev_priv->irq_lock); 3910 3893 if (dev_priv->display_irqs_enabled) 3911 3894 valleyview_display_irqs_uninstall(dev_priv); 3912 - spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); 3895 + spin_unlock_irq(&dev_priv->irq_lock); 3913 3896 3914 3897 dev_priv->irq_mask = 0; 3915 3898 ··· 3997 3976 static int i8xx_irq_postinstall(struct drm_device *dev) 3998 3977 { 3999 3978 struct drm_i915_private *dev_priv = dev->dev_private; 4000 - unsigned long irqflags; 4001 3979 4002 3980 I915_WRITE16(EMR, 4003 3981 ~(I915_ERROR_PAGE_TABLE | I915_ERROR_MEMORY_REFRESH)); ··· 4019 3999 4020 4000 /* Interrupt setup is already guaranteed to be single-threaded, this is 4021 4001 * just to make the assert_spin_locked check happy. */ 4022 - spin_lock_irqsave(&dev_priv->irq_lock, irqflags); 4002 + spin_lock_irq(&dev_priv->irq_lock); 4023 4003 i915_enable_pipestat(dev_priv, PIPE_A, PIPE_CRC_DONE_INTERRUPT_STATUS); 4024 4004 i915_enable_pipestat(dev_priv, PIPE_B, PIPE_CRC_DONE_INTERRUPT_STATUS); 4025 - spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); 4005 + spin_unlock_irq(&dev_priv->irq_lock); 4026 4006 4027 4007 return 0; 4028 4008 } ··· 4067 4047 struct drm_i915_private *dev_priv = dev->dev_private; 4068 4048 u16 iir, new_iir; 4069 4049 u32 pipe_stats[2]; 4070 - unsigned long irqflags; 4071 4050 int pipe; 4072 4051 u16 flip_mask = 4073 4052 I915_DISPLAY_PLANE_A_FLIP_PENDING_INTERRUPT | ··· 4082 4063 * It doesn't set the bit in iir again, but it still produces 4083 4064 * interrupts (for non-MSI). 4084 4065 */ 4085 - spin_lock_irqsave(&dev_priv->irq_lock, irqflags); 4066 + spin_lock(&dev_priv->irq_lock); 4086 4067 if (iir & I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT) 4087 4068 i915_handle_error(dev, false, 4088 4069 "Command parser error, iir 0x%08x", ··· 4098 4079 if (pipe_stats[pipe] & 0x8000ffff) 4099 4080 I915_WRITE(reg, pipe_stats[pipe]); 4100 4081 } 4101 - spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); 4082 + spin_unlock(&dev_priv->irq_lock); 4102 4083 4103 4084 I915_WRITE16(IIR, iir & ~flip_mask); 4104 4085 new_iir = I915_READ16(IIR); /* Flush posted writes */ ··· 4168 4149 { 4169 4150 struct drm_i915_private *dev_priv = dev->dev_private; 4170 4151 u32 enable_mask; 4171 - unsigned long irqflags; 4172 4152 4173 4153 I915_WRITE(EMR, ~(I915_ERROR_PAGE_TABLE | I915_ERROR_MEMORY_REFRESH)); 4174 4154 ··· 4205 4187 4206 4188 /* Interrupt setup is already guaranteed to be single-threaded, this is 4207 4189 * just to make the assert_spin_locked check happy. */ 4208 - spin_lock_irqsave(&dev_priv->irq_lock, irqflags); 4190 + spin_lock_irq(&dev_priv->irq_lock); 4209 4191 i915_enable_pipestat(dev_priv, PIPE_A, PIPE_CRC_DONE_INTERRUPT_STATUS); 4210 4192 i915_enable_pipestat(dev_priv, PIPE_B, PIPE_CRC_DONE_INTERRUPT_STATUS); 4211 - spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); 4193 + spin_unlock_irq(&dev_priv->irq_lock); 4212 4194 4213 4195 return 0; 4214 4196 } ··· 4252 4234 struct drm_device *dev = arg; 4253 4235 struct drm_i915_private *dev_priv = dev->dev_private; 4254 4236 u32 iir, new_iir, pipe_stats[I915_MAX_PIPES]; 4255 - unsigned long irqflags; 4256 4237 u32 flip_mask = 4257 4238 I915_DISPLAY_PLANE_A_FLIP_PENDING_INTERRUPT | 4258 4239 I915_DISPLAY_PLANE_B_FLIP_PENDING_INTERRUPT; ··· 4267 4250 * It doesn't set the bit in iir again, but it still produces 4268 4251 * interrupts (for non-MSI). 4269 4252 */ 4270 - spin_lock_irqsave(&dev_priv->irq_lock, irqflags); 4253 + spin_lock(&dev_priv->irq_lock); 4271 4254 if (iir & I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT) 4272 4255 i915_handle_error(dev, false, 4273 4256 "Command parser error, iir 0x%08x", ··· 4283 4266 irq_received = true; 4284 4267 } 4285 4268 } 4286 - spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); 4269 + spin_unlock(&dev_priv->irq_lock); 4287 4270 4288 4271 if (!irq_received) 4289 4272 break; ··· 4389 4372 struct drm_i915_private *dev_priv = dev->dev_private; 4390 4373 u32 enable_mask; 4391 4374 u32 error_mask; 4392 - unsigned long irqflags; 4393 4375 4394 4376 /* Unmask the interrupts that we always want on. */ 4395 4377 dev_priv->irq_mask = ~(I915_ASLE_INTERRUPT | ··· 4409 4393 4410 4394 /* Interrupt setup is already guaranteed to be single-threaded, this is 4411 4395 * just to make the assert_spin_locked check happy. */ 4412 - spin_lock_irqsave(&dev_priv->irq_lock, irqflags); 4396 + spin_lock_irq(&dev_priv->irq_lock); 4413 4397 i915_enable_pipestat(dev_priv, PIPE_A, PIPE_GMBUS_INTERRUPT_STATUS); 4414 4398 i915_enable_pipestat(dev_priv, PIPE_A, PIPE_CRC_DONE_INTERRUPT_STATUS); 4415 4399 i915_enable_pipestat(dev_priv, PIPE_B, PIPE_CRC_DONE_INTERRUPT_STATUS); 4416 - spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); 4400 + spin_unlock_irq(&dev_priv->irq_lock); 4417 4401 4418 4402 /* 4419 4403 * Enable some error detection, note the instruction error mask ··· 4478 4462 struct drm_i915_private *dev_priv = dev->dev_private; 4479 4463 u32 iir, new_iir; 4480 4464 u32 pipe_stats[I915_MAX_PIPES]; 4481 - unsigned long irqflags; 4482 4465 int ret = IRQ_NONE, pipe; 4483 4466 u32 flip_mask = 4484 4467 I915_DISPLAY_PLANE_A_FLIP_PENDING_INTERRUPT | ··· 4494 4479 * It doesn't set the bit in iir again, but it still produces 4495 4480 * interrupts (for non-MSI). 4496 4481 */ 4497 - spin_lock_irqsave(&dev_priv->irq_lock, irqflags); 4482 + spin_lock(&dev_priv->irq_lock); 4498 4483 if (iir & I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT) 4499 4484 i915_handle_error(dev, false, 4500 4485 "Command parser error, iir 0x%08x", ··· 4512 4497 irq_received = true; 4513 4498 } 4514 4499 } 4515 - spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); 4500 + spin_unlock(&dev_priv->irq_lock); 4516 4501 4517 4502 if (!irq_received) 4518 4503 break; ··· 4599 4584 I915_WRITE(IIR, I915_READ(IIR)); 4600 4585 } 4601 4586 4602 - static void intel_hpd_irq_reenable(struct work_struct *work) 4587 + static void intel_hpd_irq_reenable_work(struct work_struct *work) 4603 4588 { 4604 4589 struct drm_i915_private *dev_priv = 4605 4590 container_of(work, typeof(*dev_priv), 4606 4591 hotplug_reenable_work.work); 4607 4592 struct drm_device *dev = dev_priv->dev; 4608 4593 struct drm_mode_config *mode_config = &dev->mode_config; 4609 - unsigned long irqflags; 4610 4594 int i; 4611 4595 4612 4596 intel_runtime_pm_get(dev_priv); 4613 4597 4614 - spin_lock_irqsave(&dev_priv->irq_lock, irqflags); 4598 + spin_lock_irq(&dev_priv->irq_lock); 4615 4599 for (i = (HPD_NONE + 1); i < HPD_NUM_PINS; i++) { 4616 4600 struct drm_connector *connector; 4617 4601 ··· 4634 4620 } 4635 4621 if (dev_priv->display.hpd_irq_setup) 4636 4622 dev_priv->display.hpd_irq_setup(dev); 4637 - spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); 4623 + spin_unlock_irq(&dev_priv->irq_lock); 4638 4624 4639 4625 intel_runtime_pm_put(dev_priv); 4640 4626 } 4641 4627 4642 - void intel_irq_init(struct drm_device *dev) 4628 + /** 4629 + * intel_irq_init - initializes irq support 4630 + * @dev_priv: i915 device instance 4631 + * 4632 + * This function initializes all the irq support including work items, timers 4633 + * and all the vtables. It does not setup the interrupt itself though. 4634 + */ 4635 + void intel_irq_init(struct drm_i915_private *dev_priv) 4643 4636 { 4644 - struct drm_i915_private *dev_priv = dev->dev_private; 4637 + struct drm_device *dev = dev_priv->dev; 4645 4638 4646 4639 INIT_WORK(&dev_priv->hotplug_work, i915_hotplug_work_func); 4647 4640 INIT_WORK(&dev_priv->dig_port_work, i915_digport_work_func); ··· 4657 4636 INIT_WORK(&dev_priv->l3_parity.error_work, ivybridge_parity_work); 4658 4637 4659 4638 /* Let's track the enabled rps events */ 4660 - if (IS_VALLEYVIEW(dev) && !IS_CHERRYVIEW(dev)) 4639 + if (IS_VALLEYVIEW(dev_priv) && !IS_CHERRYVIEW(dev_priv)) 4661 4640 /* WaGsvRC0ResidencyMethod:vlv */ 4662 4641 dev_priv->pm_rps_events = GEN6_PM_RP_UP_EI_EXPIRED; 4663 4642 else ··· 4667 4646 i915_hangcheck_elapsed, 4668 4647 (unsigned long) dev); 4669 4648 INIT_DELAYED_WORK(&dev_priv->hotplug_reenable_work, 4670 - intel_hpd_irq_reenable); 4649 + intel_hpd_irq_reenable_work); 4671 4650 4672 4651 pm_qos_add_request(&dev_priv->pm_qos, PM_QOS_CPU_DMA_LATENCY, PM_QOS_DEFAULT_VALUE); 4673 4652 4674 - /* Haven't installed the IRQ handler yet */ 4675 - dev_priv->pm._irqs_disabled = true; 4676 - 4677 - if (IS_GEN2(dev)) { 4653 + if (IS_GEN2(dev_priv)) { 4678 4654 dev->max_vblank_count = 0; 4679 4655 dev->driver->get_vblank_counter = i8xx_get_vblank_counter; 4680 - } else if (IS_G4X(dev) || INTEL_INFO(dev)->gen >= 5) { 4656 + } else if (IS_G4X(dev_priv) || INTEL_INFO(dev_priv)->gen >= 5) { 4681 4657 dev->max_vblank_count = 0xffffffff; /* full 32 bit counter */ 4682 4658 dev->driver->get_vblank_counter = gm45_get_vblank_counter; 4683 4659 } else { ··· 4687 4669 * Gen2 doesn't have a hardware frame counter and so depends on 4688 4670 * vblank interrupts to produce sane vblank seuquence numbers. 4689 4671 */ 4690 - if (!IS_GEN2(dev)) 4672 + if (!IS_GEN2(dev_priv)) 4691 4673 dev->vblank_disable_immediate = true; 4692 4674 4693 4675 if (drm_core_check_feature(dev, DRIVER_MODESET)) { ··· 4695 4677 dev->driver->get_scanout_position = i915_get_crtc_scanoutpos; 4696 4678 } 4697 4679 4698 - if (IS_CHERRYVIEW(dev)) { 4680 + if (IS_CHERRYVIEW(dev_priv)) { 4699 4681 dev->driver->irq_handler = cherryview_irq_handler; 4700 4682 dev->driver->irq_preinstall = cherryview_irq_preinstall; 4701 4683 dev->driver->irq_postinstall = cherryview_irq_postinstall; ··· 4703 4685 dev->driver->enable_vblank = valleyview_enable_vblank; 4704 4686 dev->driver->disable_vblank = valleyview_disable_vblank; 4705 4687 dev_priv->display.hpd_irq_setup = i915_hpd_irq_setup; 4706 - } else if (IS_VALLEYVIEW(dev)) { 4688 + } else if (IS_VALLEYVIEW(dev_priv)) { 4707 4689 dev->driver->irq_handler = valleyview_irq_handler; 4708 4690 dev->driver->irq_preinstall = valleyview_irq_preinstall; 4709 4691 dev->driver->irq_postinstall = valleyview_irq_postinstall; ··· 4711 4693 dev->driver->enable_vblank = valleyview_enable_vblank; 4712 4694 dev->driver->disable_vblank = valleyview_disable_vblank; 4713 4695 dev_priv->display.hpd_irq_setup = i915_hpd_irq_setup; 4714 - } else if (IS_GEN8(dev)) { 4696 + } else if (INTEL_INFO(dev_priv)->gen >= 8) { 4715 4697 dev->driver->irq_handler = gen8_irq_handler; 4716 4698 dev->driver->irq_preinstall = gen8_irq_reset; 4717 4699 dev->driver->irq_postinstall = gen8_irq_postinstall; ··· 4728 4710 dev->driver->disable_vblank = ironlake_disable_vblank; 4729 4711 dev_priv->display.hpd_irq_setup = ibx_hpd_irq_setup; 4730 4712 } else { 4731 - if (INTEL_INFO(dev)->gen == 2) { 4713 + if (INTEL_INFO(dev_priv)->gen == 2) { 4732 4714 dev->driver->irq_preinstall = i8xx_irq_preinstall; 4733 4715 dev->driver->irq_postinstall = i8xx_irq_postinstall; 4734 4716 dev->driver->irq_handler = i8xx_irq_handler; 4735 4717 dev->driver->irq_uninstall = i8xx_irq_uninstall; 4736 - } else if (INTEL_INFO(dev)->gen == 3) { 4718 + } else if (INTEL_INFO(dev_priv)->gen == 3) { 4737 4719 dev->driver->irq_preinstall = i915_irq_preinstall; 4738 4720 dev->driver->irq_postinstall = i915_irq_postinstall; 4739 4721 dev->driver->irq_uninstall = i915_irq_uninstall; ··· 4751 4733 } 4752 4734 } 4753 4735 4754 - void intel_hpd_init(struct drm_device *dev) 4736 + /** 4737 + * intel_hpd_init - initializes and enables hpd support 4738 + * @dev_priv: i915 device instance 4739 + * 4740 + * This function enables the hotplug support. It requires that interrupts have 4741 + * already been enabled with intel_irq_init_hw(). From this point on hotplug and 4742 + * poll request can run concurrently to other code, so locking rules must be 4743 + * obeyed. 4744 + * 4745 + * This is a separate step from interrupt enabling to simplify the locking rules 4746 + * in the driver load and resume code. 4747 + */ 4748 + void intel_hpd_init(struct drm_i915_private *dev_priv) 4755 4749 { 4756 - struct drm_i915_private *dev_priv = dev->dev_private; 4750 + struct drm_device *dev = dev_priv->dev; 4757 4751 struct drm_mode_config *mode_config = &dev->mode_config; 4758 4752 struct drm_connector *connector; 4759 - unsigned long irqflags; 4760 4753 int i; 4761 4754 4762 4755 for (i = 1; i < HPD_NUM_PINS; i++) { ··· 4785 4756 4786 4757 /* Interrupt setup is already guaranteed to be single-threaded, this is 4787 4758 * just to make the assert_spin_locked checks happy. */ 4788 - spin_lock_irqsave(&dev_priv->irq_lock, irqflags); 4759 + spin_lock_irq(&dev_priv->irq_lock); 4789 4760 if (dev_priv->display.hpd_irq_setup) 4790 4761 dev_priv->display.hpd_irq_setup(dev); 4791 - spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); 4762 + spin_unlock_irq(&dev_priv->irq_lock); 4792 4763 } 4793 4764 4794 - /* Disable interrupts so we can allow runtime PM. */ 4795 - void intel_runtime_pm_disable_interrupts(struct drm_device *dev) 4765 + /** 4766 + * intel_irq_install - enables the hardware interrupt 4767 + * @dev_priv: i915 device instance 4768 + * 4769 + * This function enables the hardware interrupt handling, but leaves the hotplug 4770 + * handling still disabled. It is called after intel_irq_init(). 4771 + * 4772 + * In the driver load and resume code we need working interrupts in a few places 4773 + * but don't want to deal with the hassle of concurrent probe and hotplug 4774 + * workers. Hence the split into this two-stage approach. 4775 + */ 4776 + int intel_irq_install(struct drm_i915_private *dev_priv) 4796 4777 { 4797 - struct drm_i915_private *dev_priv = dev->dev_private; 4778 + /* 4779 + * We enable some interrupt sources in our postinstall hooks, so mark 4780 + * interrupts as enabled _before_ actually enabling them to avoid 4781 + * special cases in our ordering checks. 4782 + */ 4783 + dev_priv->pm.irqs_enabled = true; 4798 4784 4799 - dev->driver->irq_uninstall(dev); 4800 - dev_priv->pm._irqs_disabled = true; 4785 + return drm_irq_install(dev_priv->dev, dev_priv->dev->pdev->irq); 4801 4786 } 4802 4787 4803 - /* Restore interrupts so we can recover from runtime PM. */ 4804 - void intel_runtime_pm_restore_interrupts(struct drm_device *dev) 4788 + /** 4789 + * intel_irq_uninstall - finilizes all irq handling 4790 + * @dev_priv: i915 device instance 4791 + * 4792 + * This stops interrupt and hotplug handling and unregisters and frees all 4793 + * resources acquired in the init functions. 4794 + */ 4795 + void intel_irq_uninstall(struct drm_i915_private *dev_priv) 4805 4796 { 4806 - struct drm_i915_private *dev_priv = dev->dev_private; 4797 + drm_irq_uninstall(dev_priv->dev); 4798 + intel_hpd_cancel_work(dev_priv); 4799 + dev_priv->pm.irqs_enabled = false; 4800 + } 4807 4801 4808 - dev_priv->pm._irqs_disabled = false; 4809 - dev->driver->irq_preinstall(dev); 4810 - dev->driver->irq_postinstall(dev); 4802 + /** 4803 + * intel_runtime_pm_disable_interrupts - runtime interrupt disabling 4804 + * @dev_priv: i915 device instance 4805 + * 4806 + * This function is used to disable interrupts at runtime, both in the runtime 4807 + * pm and the system suspend/resume code. 4808 + */ 4809 + void intel_runtime_pm_disable_interrupts(struct drm_i915_private *dev_priv) 4810 + { 4811 + dev_priv->dev->driver->irq_uninstall(dev_priv->dev); 4812 + dev_priv->pm.irqs_enabled = false; 4813 + } 4814 + 4815 + /** 4816 + * intel_runtime_pm_enable_interrupts - runtime interrupt enabling 4817 + * @dev_priv: i915 device instance 4818 + * 4819 + * This function is used to enable interrupts at runtime, both in the runtime 4820 + * pm and the system suspend/resume code. 4821 + */ 4822 + void intel_runtime_pm_enable_interrupts(struct drm_i915_private *dev_priv) 4823 + { 4824 + dev_priv->pm.irqs_enabled = true; 4825 + dev_priv->dev->driver->irq_preinstall(dev_priv->dev); 4826 + dev_priv->dev->driver->irq_postinstall(dev_priv->dev); 4811 4827 }
+187 -3
drivers/gpu/drm/i915/i915_reg.h
··· 26 26 #define _I915_REG_H_ 27 27 28 28 #define _PIPE(pipe, a, b) ((a) + (pipe)*((b)-(a))) 29 + #define _PLANE(plane, a, b) _PIPE(plane, a, b) 29 30 #define _TRANSCODER(tran, a, b) ((a) + (tran)*((b)-(a))) 30 - 31 31 #define _PORT(port, a, b) ((a) + (port)*((b)-(a))) 32 32 #define _PIPE3(pipe, a, b, c) ((pipe) == PIPE_A ? (a) : \ 33 33 (pipe) == PIPE_B ? (b) : (c)) ··· 796 796 #define _VLV_PCS_DW0_CH1 0x8400 797 797 #define DPIO_PCS_TX_LANE2_RESET (1<<16) 798 798 #define DPIO_PCS_TX_LANE1_RESET (1<<7) 799 + #define DPIO_LEFT_TXFIFO_RST_MASTER2 (1<<4) 800 + #define DPIO_RIGHT_TXFIFO_RST_MASTER2 (1<<3) 799 801 #define VLV_PCS_DW0(ch) _PORT(ch, _VLV_PCS_DW0_CH0, _VLV_PCS_DW0_CH1) 800 802 801 803 #define _VLV_PCS01_DW0_CH0 0x200 ··· 838 836 839 837 #define _VLV_PCS_DW9_CH0 0x8224 840 838 #define _VLV_PCS_DW9_CH1 0x8424 839 + #define DPIO_PCS_TX2MARGIN_MASK (0x7<<13) 840 + #define DPIO_PCS_TX2MARGIN_000 (0<<13) 841 + #define DPIO_PCS_TX2MARGIN_101 (1<<13) 842 + #define DPIO_PCS_TX1MARGIN_MASK (0x7<<10) 843 + #define DPIO_PCS_TX1MARGIN_000 (0<<10) 844 + #define DPIO_PCS_TX1MARGIN_101 (1<<10) 841 845 #define VLV_PCS_DW9(ch) _PORT(ch, _VLV_PCS_DW9_CH0, _VLV_PCS_DW9_CH1) 846 + 847 + #define _VLV_PCS01_DW9_CH0 0x224 848 + #define _VLV_PCS23_DW9_CH0 0x424 849 + #define _VLV_PCS01_DW9_CH1 0x2624 850 + #define _VLV_PCS23_DW9_CH1 0x2824 851 + #define VLV_PCS01_DW9(ch) _PORT(ch, _VLV_PCS01_DW9_CH0, _VLV_PCS01_DW9_CH1) 852 + #define VLV_PCS23_DW9(ch) _PORT(ch, _VLV_PCS23_DW9_CH0, _VLV_PCS23_DW9_CH1) 842 853 843 854 #define _CHV_PCS_DW10_CH0 0x8228 844 855 #define _CHV_PCS_DW10_CH1 0x8428 845 856 #define DPIO_PCS_SWING_CALC_TX0_TX2 (1<<30) 846 857 #define DPIO_PCS_SWING_CALC_TX1_TX3 (1<<31) 858 + #define DPIO_PCS_TX2DEEMP_MASK (0xf<<24) 859 + #define DPIO_PCS_TX2DEEMP_9P5 (0<<24) 860 + #define DPIO_PCS_TX2DEEMP_6P0 (2<<24) 861 + #define DPIO_PCS_TX1DEEMP_MASK (0xf<<16) 862 + #define DPIO_PCS_TX1DEEMP_9P5 (0<<16) 863 + #define DPIO_PCS_TX1DEEMP_6P0 (2<<16) 847 864 #define CHV_PCS_DW10(ch) _PORT(ch, _CHV_PCS_DW10_CH0, _CHV_PCS_DW10_CH1) 848 865 849 866 #define _VLV_PCS01_DW10_CH0 0x0228 ··· 874 853 875 854 #define _VLV_PCS_DW11_CH0 0x822c 876 855 #define _VLV_PCS_DW11_CH1 0x842c 856 + #define DPIO_LANEDESKEW_STRAP_OVRD (1<<3) 857 + #define DPIO_LEFT_TXFIFO_RST_MASTER (1<<1) 858 + #define DPIO_RIGHT_TXFIFO_RST_MASTER (1<<0) 877 859 #define VLV_PCS_DW11(ch) _PORT(ch, _VLV_PCS_DW11_CH0, _VLV_PCS_DW11_CH1) 860 + 861 + #define _VLV_PCS01_DW11_CH0 0x022c 862 + #define _VLV_PCS23_DW11_CH0 0x042c 863 + #define _VLV_PCS01_DW11_CH1 0x262c 864 + #define _VLV_PCS23_DW11_CH1 0x282c 865 + #define VLV_PCS01_DW11(ch) _PORT(ch, _VLV_PCS01_DW0_CH0, _VLV_PCS01_DW0_CH1) 866 + #define VLV_PCS23_DW11(ch) _PORT(ch, _VLV_PCS23_DW0_CH0, _VLV_PCS23_DW0_CH1) 878 867 879 868 #define _VLV_PCS_DW12_CH0 0x8230 880 869 #define _VLV_PCS_DW12_CH1 0x8430 ··· 2537 2506 2538 2507 #define EDP_PSR_AUX_CTL(dev) (EDP_PSR_BASE(dev) + 0x10) 2539 2508 #define EDP_PSR_AUX_DATA1(dev) (EDP_PSR_BASE(dev) + 0x14) 2540 - #define EDP_PSR_DPCD_COMMAND 0x80060000 2541 2509 #define EDP_PSR_AUX_DATA2(dev) (EDP_PSR_BASE(dev) + 0x18) 2542 - #define EDP_PSR_DPCD_NORMAL_OPERATION (1<<24) 2543 2510 #define EDP_PSR_AUX_DATA3(dev) (EDP_PSR_BASE(dev) + 0x1c) 2544 2511 #define EDP_PSR_AUX_DATA4(dev) (EDP_PSR_BASE(dev) + 0x20) 2545 2512 #define EDP_PSR_AUX_DATA5(dev) (EDP_PSR_BASE(dev) + 0x24) ··· 3674 3645 #define DP_AUX_CH_CTL_PRECHARGE_TEST (1 << 11) 3675 3646 #define DP_AUX_CH_CTL_BIT_CLOCK_2X_MASK (0x7ff) 3676 3647 #define DP_AUX_CH_CTL_BIT_CLOCK_2X_SHIFT 0 3648 + #define DP_AUX_CH_CTL_SYNC_PULSE_SKL(c) ((c) - 1) 3677 3649 3678 3650 /* 3679 3651 * Computing GMCH M and N values for the Display Port link ··· 4540 4510 #define SPCONSTALPHA(pipe, plane) _PIPE(pipe * 2 + plane, _SPACONSTALPHA, _SPBCONSTALPHA) 4541 4511 #define SPGAMC(pipe, plane) _PIPE(pipe * 2 + plane, _SPAGAMC, _SPBGAMC) 4542 4512 4513 + /* Skylake plane registers */ 4514 + 4515 + #define _PLANE_CTL_1_A 0x70180 4516 + #define _PLANE_CTL_2_A 0x70280 4517 + #define _PLANE_CTL_3_A 0x70380 4518 + #define PLANE_CTL_ENABLE (1 << 31) 4519 + #define PLANE_CTL_PIPE_GAMMA_ENABLE (1 << 30) 4520 + #define PLANE_CTL_FORMAT_MASK (0xf << 24) 4521 + #define PLANE_CTL_FORMAT_YUV422 ( 0 << 24) 4522 + #define PLANE_CTL_FORMAT_NV12 ( 1 << 24) 4523 + #define PLANE_CTL_FORMAT_XRGB_2101010 ( 2 << 24) 4524 + #define PLANE_CTL_FORMAT_XRGB_8888 ( 4 << 24) 4525 + #define PLANE_CTL_FORMAT_XRGB_16161616F ( 6 << 24) 4526 + #define PLANE_CTL_FORMAT_AYUV ( 8 << 24) 4527 + #define PLANE_CTL_FORMAT_INDEXED ( 12 << 24) 4528 + #define PLANE_CTL_FORMAT_RGB_565 ( 14 << 24) 4529 + #define PLANE_CTL_PIPE_CSC_ENABLE (1 << 23) 4530 + #define PLANE_CTL_KEY_ENABLE_MASK (0x3 << 21) 4531 + #define PLANE_CTL_KEY_ENABLE_SOURCE ( 1 << 21) 4532 + #define PLANE_CTL_KEY_ENABLE_DESTINATION ( 2 << 21) 4533 + #define PLANE_CTL_ORDER_BGRX (0 << 20) 4534 + #define PLANE_CTL_ORDER_RGBX (1 << 20) 4535 + #define PLANE_CTL_YUV422_ORDER_MASK (0x3 << 16) 4536 + #define PLANE_CTL_YUV422_YUYV ( 0 << 16) 4537 + #define PLANE_CTL_YUV422_UYVY ( 1 << 16) 4538 + #define PLANE_CTL_YUV422_YVYU ( 2 << 16) 4539 + #define PLANE_CTL_YUV422_VYUY ( 3 << 16) 4540 + #define PLANE_CTL_DECOMPRESSION_ENABLE (1 << 15) 4541 + #define PLANE_CTL_TRICKLE_FEED_DISABLE (1 << 14) 4542 + #define PLANE_CTL_PLANE_GAMMA_DISABLE (1 << 13) 4543 + #define PLANE_CTL_TILED_MASK (0x7 << 10) 4544 + #define PLANE_CTL_TILED_LINEAR ( 0 << 10) 4545 + #define PLANE_CTL_TILED_X ( 1 << 10) 4546 + #define PLANE_CTL_TILED_Y ( 4 << 10) 4547 + #define PLANE_CTL_TILED_YF ( 5 << 10) 4548 + #define PLANE_CTL_ALPHA_MASK (0x3 << 4) 4549 + #define PLANE_CTL_ALPHA_DISABLE ( 0 << 4) 4550 + #define PLANE_CTL_ALPHA_SW_PREMULTIPLY ( 2 << 4) 4551 + #define PLANE_CTL_ALPHA_HW_PREMULTIPLY ( 3 << 4) 4552 + #define _PLANE_STRIDE_1_A 0x70188 4553 + #define _PLANE_STRIDE_2_A 0x70288 4554 + #define _PLANE_STRIDE_3_A 0x70388 4555 + #define _PLANE_POS_1_A 0x7018c 4556 + #define _PLANE_POS_2_A 0x7028c 4557 + #define _PLANE_POS_3_A 0x7038c 4558 + #define _PLANE_SIZE_1_A 0x70190 4559 + #define _PLANE_SIZE_2_A 0x70290 4560 + #define _PLANE_SIZE_3_A 0x70390 4561 + #define _PLANE_SURF_1_A 0x7019c 4562 + #define _PLANE_SURF_2_A 0x7029c 4563 + #define _PLANE_SURF_3_A 0x7039c 4564 + #define _PLANE_OFFSET_1_A 0x701a4 4565 + #define _PLANE_OFFSET_2_A 0x702a4 4566 + #define _PLANE_OFFSET_3_A 0x703a4 4567 + #define _PLANE_KEYVAL_1_A 0x70194 4568 + #define _PLANE_KEYVAL_2_A 0x70294 4569 + #define _PLANE_KEYMSK_1_A 0x70198 4570 + #define _PLANE_KEYMSK_2_A 0x70298 4571 + #define _PLANE_KEYMAX_1_A 0x701a0 4572 + #define _PLANE_KEYMAX_2_A 0x702a0 4573 + 4574 + #define _PLANE_CTL_1_B 0x71180 4575 + #define _PLANE_CTL_2_B 0x71280 4576 + #define _PLANE_CTL_3_B 0x71380 4577 + #define _PLANE_CTL_1(pipe) _PIPE(pipe, _PLANE_CTL_1_A, _PLANE_CTL_1_B) 4578 + #define _PLANE_CTL_2(pipe) _PIPE(pipe, _PLANE_CTL_2_A, _PLANE_CTL_2_B) 4579 + #define _PLANE_CTL_3(pipe) _PIPE(pipe, _PLANE_CTL_3_A, _PLANE_CTL_3_B) 4580 + #define PLANE_CTL(pipe, plane) \ 4581 + _PLANE(plane, _PLANE_CTL_1(pipe), _PLANE_CTL_2(pipe)) 4582 + 4583 + #define _PLANE_STRIDE_1_B 0x71188 4584 + #define _PLANE_STRIDE_2_B 0x71288 4585 + #define _PLANE_STRIDE_3_B 0x71388 4586 + #define _PLANE_STRIDE_1(pipe) \ 4587 + _PIPE(pipe, _PLANE_STRIDE_1_A, _PLANE_STRIDE_1_B) 4588 + #define _PLANE_STRIDE_2(pipe) \ 4589 + _PIPE(pipe, _PLANE_STRIDE_2_A, _PLANE_STRIDE_2_B) 4590 + #define _PLANE_STRIDE_3(pipe) \ 4591 + _PIPE(pipe, _PLANE_STRIDE_3_A, _PLANE_STRIDE_3_B) 4592 + #define PLANE_STRIDE(pipe, plane) \ 4593 + _PLANE(plane, _PLANE_STRIDE_1(pipe), _PLANE_STRIDE_2(pipe)) 4594 + 4595 + #define _PLANE_POS_1_B 0x7118c 4596 + #define _PLANE_POS_2_B 0x7128c 4597 + #define _PLANE_POS_3_B 0x7138c 4598 + #define _PLANE_POS_1(pipe) _PIPE(pipe, _PLANE_POS_1_A, _PLANE_POS_1_B) 4599 + #define _PLANE_POS_2(pipe) _PIPE(pipe, _PLANE_POS_2_A, _PLANE_POS_2_B) 4600 + #define _PLANE_POS_3(pipe) _PIPE(pipe, _PLANE_POS_3_A, _PLANE_POS_3_B) 4601 + #define PLANE_POS(pipe, plane) \ 4602 + _PLANE(plane, _PLANE_POS_1(pipe), _PLANE_POS_2(pipe)) 4603 + 4604 + #define _PLANE_SIZE_1_B 0x71190 4605 + #define _PLANE_SIZE_2_B 0x71290 4606 + #define _PLANE_SIZE_3_B 0x71390 4607 + #define _PLANE_SIZE_1(pipe) _PIPE(pipe, _PLANE_SIZE_1_A, _PLANE_SIZE_1_B) 4608 + #define _PLANE_SIZE_2(pipe) _PIPE(pipe, _PLANE_SIZE_2_A, _PLANE_SIZE_2_B) 4609 + #define _PLANE_SIZE_3(pipe) _PIPE(pipe, _PLANE_SIZE_3_A, _PLANE_SIZE_3_B) 4610 + #define PLANE_SIZE(pipe, plane) \ 4611 + _PLANE(plane, _PLANE_SIZE_1(pipe), _PLANE_SIZE_2(pipe)) 4612 + 4613 + #define _PLANE_SURF_1_B 0x7119c 4614 + #define _PLANE_SURF_2_B 0x7129c 4615 + #define _PLANE_SURF_3_B 0x7139c 4616 + #define _PLANE_SURF_1(pipe) _PIPE(pipe, _PLANE_SURF_1_A, _PLANE_SURF_1_B) 4617 + #define _PLANE_SURF_2(pipe) _PIPE(pipe, _PLANE_SURF_2_A, _PLANE_SURF_2_B) 4618 + #define _PLANE_SURF_3(pipe) _PIPE(pipe, _PLANE_SURF_3_A, _PLANE_SURF_3_B) 4619 + #define PLANE_SURF(pipe, plane) \ 4620 + _PLANE(plane, _PLANE_SURF_1(pipe), _PLANE_SURF_2(pipe)) 4621 + 4622 + #define _PLANE_OFFSET_1_B 0x711a4 4623 + #define _PLANE_OFFSET_2_B 0x712a4 4624 + #define _PLANE_OFFSET_1(pipe) _PIPE(pipe, _PLANE_OFFSET_1_A, _PLANE_OFFSET_1_B) 4625 + #define _PLANE_OFFSET_2(pipe) _PIPE(pipe, _PLANE_OFFSET_2_A, _PLANE_OFFSET_2_B) 4626 + #define PLANE_OFFSET(pipe, plane) \ 4627 + _PLANE(plane, _PLANE_OFFSET_1(pipe), _PLANE_OFFSET_2(pipe)) 4628 + 4629 + #define _PLANE_KEYVAL_1_B 0x71194 4630 + #define _PLANE_KEYVAL_2_B 0x71294 4631 + #define _PLANE_KEYVAL_1(pipe) _PIPE(pipe, _PLANE_KEYVAL_1_A, _PLANE_KEYVAL_1_B) 4632 + #define _PLANE_KEYVAL_2(pipe) _PIPE(pipe, _PLANE_KEYVAL_2_A, _PLANE_KEYVAL_2_B) 4633 + #define PLANE_KEYVAL(pipe, plane) \ 4634 + _PLANE(plane, _PLANE_KEYVAL_1(pipe), _PLANE_KEYVAL_2(pipe)) 4635 + 4636 + #define _PLANE_KEYMSK_1_B 0x71198 4637 + #define _PLANE_KEYMSK_2_B 0x71298 4638 + #define _PLANE_KEYMSK_1(pipe) _PIPE(pipe, _PLANE_KEYMSK_1_A, _PLANE_KEYMSK_1_B) 4639 + #define _PLANE_KEYMSK_2(pipe) _PIPE(pipe, _PLANE_KEYMSK_2_A, _PLANE_KEYMSK_2_B) 4640 + #define PLANE_KEYMSK(pipe, plane) \ 4641 + _PLANE(plane, _PLANE_KEYMSK_1(pipe), _PLANE_KEYMSK_2(pipe)) 4642 + 4643 + #define _PLANE_KEYMAX_1_B 0x711a0 4644 + #define _PLANE_KEYMAX_2_B 0x712a0 4645 + #define _PLANE_KEYMAX_1(pipe) _PIPE(pipe, _PLANE_KEYMAX_1_A, _PLANE_KEYMAX_1_B) 4646 + #define _PLANE_KEYMAX_2(pipe) _PIPE(pipe, _PLANE_KEYMAX_2_A, _PLANE_KEYMAX_2_B) 4647 + #define PLANE_KEYMAX(pipe, plane) \ 4648 + _PLANE(plane, _PLANE_KEYMAX_1(pipe), _PLANE_KEYMAX_2(pipe)) 4649 + 4543 4650 /* VBIOS regs */ 4544 4651 #define VGACNTRL 0x71400 4545 4652 # define VGA_DISP_DISABLE (1 << 31) ··· 4913 4746 #define GEN8_PIPE_SCAN_LINE_EVENT (1 << 2) 4914 4747 #define GEN8_PIPE_VSYNC (1 << 1) 4915 4748 #define GEN8_PIPE_VBLANK (1 << 0) 4749 + #define GEN9_PIPE_CURSOR_FAULT (1 << 11) 4750 + #define GEN9_PIPE_PLANE3_FAULT (1 << 9) 4751 + #define GEN9_PIPE_PLANE2_FAULT (1 << 8) 4752 + #define GEN9_PIPE_PLANE1_FAULT (1 << 7) 4753 + #define GEN9_PIPE_PLANE3_FLIP_DONE (1 << 5) 4754 + #define GEN9_PIPE_PLANE2_FLIP_DONE (1 << 4) 4755 + #define GEN9_PIPE_PLANE1_FLIP_DONE (1 << 3) 4756 + #define GEN9_PIPE_PLANE_FLIP_DONE(p) (1 << (3 + p)) 4916 4757 #define GEN8_DE_PIPE_IRQ_FAULT_ERRORS \ 4917 4758 (GEN8_PIPE_CURSOR_FAULT | \ 4918 4759 GEN8_PIPE_SPRITE_FAULT | \ 4919 4760 GEN8_PIPE_PRIMARY_FAULT) 4761 + #define GEN9_DE_PIPE_IRQ_FAULT_ERRORS \ 4762 + (GEN9_PIPE_CURSOR_FAULT | \ 4763 + GEN9_PIPE_PLANE3_FAULT | \ 4764 + GEN9_PIPE_PLANE2_FAULT | \ 4765 + GEN9_PIPE_PLANE1_FAULT) 4920 4766 4921 4767 #define GEN8_DE_PORT_ISR 0x44440 4922 4768 #define GEN8_DE_PORT_IMR 0x44444 ··· 5019 4839 /* GEN8 chicken */ 5020 4840 #define HDC_CHICKEN0 0x7300 5021 4841 #define HDC_FORCE_NON_COHERENT (1<<4) 4842 + #define HDC_FENCE_DEST_SLM_DISABLE (1<<14) 5022 4843 5023 4844 /* WaCatErrorRejectionIssue */ 5024 4845 #define GEN7_SQ_CHICKEN_MBCUNIT_CONFIG 0x9030 ··· 5931 5750 #define GEN7_MAX_PS_THREAD_DEP (8<<12) 5932 5751 #define GEN7_SINGLE_SUBSCAN_DISPATCH_ENABLE (1<<10) 5933 5752 #define GEN7_PSD_SINGLE_PORT_DISPATCH_ENABLE (1<<3) 5753 + 5754 + #define GEN9_HALF_SLICE_CHICKEN5 0xe188 5755 + #define GEN9_DG_MIRROR_FIX_ENABLE (1<<5) 5934 5756 5935 5757 #define GEN8_ROW_CHICKEN 0xe4f0 5936 5758 #define PARTIAL_INSTRUCTION_SHOOTDOWN_DISABLE (1<<8)
+5 -5
drivers/gpu/drm/i915/intel_bios.h
··· 46 46 u16 version; /**< decimal */ 47 47 u16 header_size; /**< in bytes */ 48 48 u16 bdb_size; /**< in bytes */ 49 - }; 49 + } __packed; 50 50 51 51 /* strictly speaking, this is a "skip" block, but it has interesting info */ 52 52 struct vbios_data { ··· 252 252 /* This one should also be safe to use anywhere, even without version 253 253 * checks. */ 254 254 struct common_child_dev_config common; 255 - }; 255 + } __packed; 256 256 257 257 struct bdb_general_definitions { 258 258 /* DDC GPIO */ ··· 888 888 u16 bl_disable_delay; 889 889 u16 panel_off_delay; 890 890 u16 panel_power_cycle_delay; 891 - }; 891 + } __packed; 892 892 893 893 struct bdb_mipi_config { 894 894 struct mipi_config config[MAX_MIPI_CONFIGURATIONS]; 895 895 struct mipi_pps_data pps[MAX_MIPI_CONFIGURATIONS]; 896 - }; 896 + } __packed; 897 897 898 898 /* Block 53 contains MIPI sequences as needed by the panel 899 899 * for enabling it. This block can be variable in size and ··· 902 902 struct bdb_mipi_sequence { 903 903 u8 version; 904 904 u8 data[0]; 905 - }; 905 + } __packed; 906 906 907 907 /* MIPI Sequnece Block definitions */ 908 908 enum mipi_seq {
+1 -1
drivers/gpu/drm/i915/intel_crt.c
··· 72 72 u32 tmp; 73 73 74 74 power_domain = intel_display_port_power_domain(encoder); 75 - if (!intel_display_power_enabled(dev_priv, power_domain)) 75 + if (!intel_display_power_is_enabled(dev_priv, power_domain)) 76 76 return false; 77 77 78 78 tmp = I915_READ(crt->adpa_reg);
+44 -8
drivers/gpu/drm/i915/intel_ddi.c
··· 95 95 { 0x00BEFFFF, 0x00140006 }, 96 96 { 0x80B2CFFF, 0x001B0002 }, 97 97 { 0x00FFFFFF, 0x000E000A }, 98 - { 0x00D75FFF, 0x00180004 }, 99 - { 0x80CB2FFF, 0x001B0002 }, 98 + { 0x00DB6FFF, 0x00160005 }, 99 + { 0x80C71FFF, 0x001A0002 }, 100 100 { 0x00F7DFFF, 0x00180004 }, 101 101 { 0x80D75FFF, 0x001B0002 }, 102 102 }; ··· 125 125 { 0x00FFFFFF, 0x00140006 }, /* 7: 800 800 0 */ 126 126 { 0x80E79FFF, 0x001B0002 }, /* 8: 800 1000 2 */ 127 127 { 0x80FFFFFF, 0x001B0002 }, /* 9: 1000 1000 0 */ 128 + }; 129 + 130 + static const struct ddi_buf_trans skl_ddi_translations_dp[] = { 131 + { 0x00000018, 0x000000a0 }, 132 + { 0x00004014, 0x00000098 }, 133 + { 0x00006012, 0x00000088 }, 134 + { 0x00008010, 0x00000080 }, 135 + { 0x00000018, 0x00000098 }, 136 + { 0x00004014, 0x00000088 }, 137 + { 0x00006012, 0x00000080 }, 138 + { 0x00000018, 0x00000088 }, 139 + { 0x00004014, 0x00000080 }, 140 + }; 141 + 142 + static const struct ddi_buf_trans skl_ddi_translations_hdmi[] = { 143 + /* Idx NT mV T mV db */ 144 + { 0x00000018, 0x000000a0 }, /* 0: 400 400 0 */ 145 + { 0x00004014, 0x00000098 }, /* 1: 400 600 3.5 */ 146 + { 0x00006012, 0x00000088 }, /* 2: 400 800 6 */ 147 + { 0x00000018, 0x0000003c }, /* 3: 450 450 0 */ 148 + { 0x00000018, 0x00000098 }, /* 4: 600 600 0 */ 149 + { 0x00003015, 0x00000088 }, /* 5: 600 800 2.5 */ 150 + { 0x00005013, 0x00000080 }, /* 6: 600 1000 4.5 */ 151 + { 0x00000018, 0x00000088 }, /* 7: 800 800 0 */ 152 + { 0x00000096, 0x00000080 }, /* 8: 800 1000 2 */ 153 + { 0x00000018, 0x00000080 }, /* 9: 1200 1200 0 */ 128 154 }; 129 155 130 156 enum port intel_ddi_get_encoder_port(struct intel_encoder *intel_encoder) ··· 195 169 const struct ddi_buf_trans *ddi_translations_hdmi; 196 170 const struct ddi_buf_trans *ddi_translations; 197 171 198 - if (IS_BROADWELL(dev)) { 172 + if (IS_SKYLAKE(dev)) { 173 + ddi_translations_fdi = NULL; 174 + ddi_translations_dp = skl_ddi_translations_dp; 175 + ddi_translations_edp = skl_ddi_translations_dp; 176 + ddi_translations_hdmi = skl_ddi_translations_hdmi; 177 + n_hdmi_entries = ARRAY_SIZE(skl_ddi_translations_hdmi); 178 + hdmi_800mV_0dB = 7; 179 + } else if (IS_BROADWELL(dev)) { 199 180 ddi_translations_fdi = bdw_ddi_translations_fdi; 200 181 ddi_translations_dp = bdw_ddi_translations_dp; 201 182 ddi_translations_edp = bdw_ddi_translations_edp; ··· 241 208 ddi_translations = ddi_translations_dp; 242 209 break; 243 210 case PORT_E: 244 - ddi_translations = ddi_translations_fdi; 211 + if (ddi_translations_fdi) 212 + ddi_translations = ddi_translations_fdi; 213 + else 214 + ddi_translations = ddi_translations_dp; 245 215 break; 246 216 default: 247 217 BUG(); ··· 998 962 uint32_t tmp; 999 963 1000 964 power_domain = intel_display_port_power_domain(intel_encoder); 1001 - if (!intel_display_power_enabled(dev_priv, power_domain)) 965 + if (!intel_display_power_is_enabled(dev_priv, power_domain)) 1002 966 return false; 1003 967 1004 968 if (!intel_encoder->get_hw_state(intel_encoder, &pipe)) ··· 1044 1008 int i; 1045 1009 1046 1010 power_domain = intel_display_port_power_domain(encoder); 1047 - if (!intel_display_power_enabled(dev_priv, power_domain)) 1011 + if (!intel_display_power_is_enabled(dev_priv, power_domain)) 1048 1012 return false; 1049 1013 1050 1014 tmp = I915_READ(DDI_BUF_CTL(port)); ··· 1332 1296 { 1333 1297 uint32_t val; 1334 1298 1335 - if (!intel_display_power_enabled(dev_priv, POWER_DOMAIN_PLLS)) 1299 + if (!intel_display_power_is_enabled(dev_priv, POWER_DOMAIN_PLLS)) 1336 1300 return false; 1337 1301 1338 1302 val = I915_READ(WRPLL_CTL(pll->id)); ··· 1522 1486 break; 1523 1487 } 1524 1488 1525 - if (intel_display_power_enabled(dev_priv, POWER_DOMAIN_AUDIO)) { 1489 + if (intel_display_power_is_enabled(dev_priv, POWER_DOMAIN_AUDIO)) { 1526 1490 temp = I915_READ(HSW_AUD_PIN_ELD_CP_VLD); 1527 1491 if (temp & (AUDIO_OUTPUT_ENABLE_A << (intel_crtc->pipe * 4))) 1528 1492 pipe_config->has_audio = true;
+384 -511
drivers/gpu/drm/i915/intel_display.c
··· 73 73 DRM_FORMAT_ARGB8888, 74 74 }; 75 75 76 - static void intel_increase_pllclock(struct drm_device *dev, 77 - enum pipe pipe); 78 76 static void intel_crtc_update_cursor(struct drm_crtc *crtc, bool on); 79 77 80 78 static void i9xx_crtc_clock_get(struct intel_crtc *crtc, ··· 887 889 return intel_crtc->config.cpu_transcoder; 888 890 } 889 891 890 - static void g4x_wait_for_vblank(struct drm_device *dev, int pipe) 891 - { 892 - struct drm_i915_private *dev_priv = dev->dev_private; 893 - u32 frame, frame_reg = PIPE_FRMCOUNT_GM45(pipe); 894 - 895 - frame = I915_READ(frame_reg); 896 - 897 - if (wait_for(I915_READ_NOTRACE(frame_reg) != frame, 50)) 898 - WARN(1, "vblank wait on pipe %c timed out\n", 899 - pipe_name(pipe)); 900 - } 901 - 902 - /** 903 - * intel_wait_for_vblank - wait for vblank on a given pipe 904 - * @dev: drm device 905 - * @pipe: pipe to wait for 906 - * 907 - * Wait for vblank to occur on a given pipe. Needed for various bits of 908 - * mode setting code. 909 - */ 910 - void intel_wait_for_vblank(struct drm_device *dev, int pipe) 911 - { 912 - struct drm_i915_private *dev_priv = dev->dev_private; 913 - int pipestat_reg = PIPESTAT(pipe); 914 - 915 - if (IS_G4X(dev) || INTEL_INFO(dev)->gen >= 5) { 916 - g4x_wait_for_vblank(dev, pipe); 917 - return; 918 - } 919 - 920 - /* Clear existing vblank status. Note this will clear any other 921 - * sticky status fields as well. 922 - * 923 - * This races with i915_driver_irq_handler() with the result 924 - * that either function could miss a vblank event. Here it is not 925 - * fatal, as we will either wait upon the next vblank interrupt or 926 - * timeout. Generally speaking intel_wait_for_vblank() is only 927 - * called during modeset at which time the GPU should be idle and 928 - * should *not* be performing page flips and thus not waiting on 929 - * vblanks... 930 - * Currently, the result of us stealing a vblank from the irq 931 - * handler is that a single frame will be skipped during swapbuffers. 932 - */ 933 - I915_WRITE(pipestat_reg, 934 - I915_READ(pipestat_reg) | PIPE_VBLANK_INTERRUPT_STATUS); 935 - 936 - /* Wait for vblank interrupt bit to set */ 937 - if (wait_for(I915_READ(pipestat_reg) & 938 - PIPE_VBLANK_INTERRUPT_STATUS, 939 - 50)) 940 - DRM_DEBUG_KMS("vblank wait on pipe %c timed out\n", 941 - pipe_name(pipe)); 942 - } 943 - 944 892 static bool pipe_dsl_stopped(struct drm_device *dev, enum pipe pipe) 945 893 { 946 894 struct drm_i915_private *dev_priv = dev->dev_private; ··· 1133 1189 state_string(state), state_string(cur_state)); 1134 1190 } 1135 1191 1136 - static void assert_panel_unlocked(struct drm_i915_private *dev_priv, 1137 - enum pipe pipe) 1192 + void assert_panel_unlocked(struct drm_i915_private *dev_priv, 1193 + enum pipe pipe) 1138 1194 { 1139 1195 struct drm_device *dev = dev_priv->dev; 1140 1196 int pp_reg; ··· 1207 1263 (pipe == PIPE_B && dev_priv->quirks & QUIRK_PIPEB_FORCE)) 1208 1264 state = true; 1209 1265 1210 - if (!intel_display_power_enabled(dev_priv, 1266 + if (!intel_display_power_is_enabled(dev_priv, 1211 1267 POWER_DOMAIN_TRANSCODER(cpu_transcoder))) { 1212 1268 cur_state = false; 1213 1269 } else { ··· 1276 1332 int reg, sprite; 1277 1333 u32 val; 1278 1334 1279 - if (IS_VALLEYVIEW(dev)) { 1335 + if (INTEL_INFO(dev)->gen >= 9) { 1336 + for_each_sprite(pipe, sprite) { 1337 + val = I915_READ(PLANE_CTL(pipe, sprite)); 1338 + WARN(val & PLANE_CTL_ENABLE, 1339 + "plane %d assertion failure, should be off on pipe %c but is still active\n", 1340 + sprite, pipe_name(pipe)); 1341 + } 1342 + } else if (IS_VALLEYVIEW(dev)) { 1280 1343 for_each_sprite(pipe, sprite) { 1281 1344 reg = SPCNTR(pipe, sprite); 1282 1345 val = I915_READ(reg); ··· 2184 2233 2185 2234 switch (obj->tiling_mode) { 2186 2235 case I915_TILING_NONE: 2187 - if (IS_BROADWATER(dev) || IS_CRESTLINE(dev)) 2236 + if (INTEL_INFO(dev)->gen >= 9) 2237 + alignment = 256 * 1024; 2238 + else if (IS_BROADWATER(dev) || IS_CRESTLINE(dev)) 2188 2239 alignment = 128 * 1024; 2189 2240 else if (INTEL_INFO(dev)->gen >= 4) 2190 2241 alignment = 4 * 1024; ··· 2194 2241 alignment = 64 * 1024; 2195 2242 break; 2196 2243 case I915_TILING_X: 2197 - /* pin() will align the object as required by fence */ 2198 - alignment = 0; 2244 + if (INTEL_INFO(dev)->gen >= 9) 2245 + alignment = 256 * 1024; 2246 + else { 2247 + /* pin() will align the object as required by fence */ 2248 + alignment = 0; 2249 + } 2199 2250 break; 2200 2251 case I915_TILING_Y: 2201 2252 WARN(1, "Y tiled bo slipped through, driver bug!\n"); ··· 2629 2672 POSTING_READ(reg); 2630 2673 } 2631 2674 2675 + static void skylake_update_primary_plane(struct drm_crtc *crtc, 2676 + struct drm_framebuffer *fb, 2677 + int x, int y) 2678 + { 2679 + struct drm_device *dev = crtc->dev; 2680 + struct drm_i915_private *dev_priv = dev->dev_private; 2681 + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 2682 + struct intel_framebuffer *intel_fb; 2683 + struct drm_i915_gem_object *obj; 2684 + int pipe = intel_crtc->pipe; 2685 + u32 plane_ctl, stride; 2686 + 2687 + if (!intel_crtc->primary_enabled) { 2688 + I915_WRITE(PLANE_CTL(pipe, 0), 0); 2689 + I915_WRITE(PLANE_SURF(pipe, 0), 0); 2690 + POSTING_READ(PLANE_CTL(pipe, 0)); 2691 + return; 2692 + } 2693 + 2694 + plane_ctl = PLANE_CTL_ENABLE | 2695 + PLANE_CTL_PIPE_GAMMA_ENABLE | 2696 + PLANE_CTL_PIPE_CSC_ENABLE; 2697 + 2698 + switch (fb->pixel_format) { 2699 + case DRM_FORMAT_RGB565: 2700 + plane_ctl |= PLANE_CTL_FORMAT_RGB_565; 2701 + break; 2702 + case DRM_FORMAT_XRGB8888: 2703 + plane_ctl |= PLANE_CTL_FORMAT_XRGB_8888; 2704 + break; 2705 + case DRM_FORMAT_XBGR8888: 2706 + plane_ctl |= PLANE_CTL_ORDER_RGBX; 2707 + plane_ctl |= PLANE_CTL_FORMAT_XRGB_8888; 2708 + break; 2709 + case DRM_FORMAT_XRGB2101010: 2710 + plane_ctl |= PLANE_CTL_FORMAT_XRGB_2101010; 2711 + break; 2712 + case DRM_FORMAT_XBGR2101010: 2713 + plane_ctl |= PLANE_CTL_ORDER_RGBX; 2714 + plane_ctl |= PLANE_CTL_FORMAT_XRGB_2101010; 2715 + break; 2716 + default: 2717 + BUG(); 2718 + } 2719 + 2720 + intel_fb = to_intel_framebuffer(fb); 2721 + obj = intel_fb->obj; 2722 + 2723 + /* 2724 + * The stride is either expressed as a multiple of 64 bytes chunks for 2725 + * linear buffers or in number of tiles for tiled buffers. 2726 + */ 2727 + switch (obj->tiling_mode) { 2728 + case I915_TILING_NONE: 2729 + stride = fb->pitches[0] >> 6; 2730 + break; 2731 + case I915_TILING_X: 2732 + plane_ctl |= PLANE_CTL_TILED_X; 2733 + stride = fb->pitches[0] >> 9; 2734 + break; 2735 + default: 2736 + BUG(); 2737 + } 2738 + 2739 + plane_ctl |= PLANE_CTL_PLANE_GAMMA_DISABLE; 2740 + 2741 + I915_WRITE(PLANE_CTL(pipe, 0), plane_ctl); 2742 + 2743 + DRM_DEBUG_KMS("Writing base %08lX %d,%d,%d,%d pitch=%d\n", 2744 + i915_gem_obj_ggtt_offset(obj), 2745 + x, y, fb->width, fb->height, 2746 + fb->pitches[0]); 2747 + 2748 + I915_WRITE(PLANE_POS(pipe, 0), 0); 2749 + I915_WRITE(PLANE_OFFSET(pipe, 0), (y << 16) | x); 2750 + I915_WRITE(PLANE_SIZE(pipe, 0), 2751 + (intel_crtc->config.pipe_src_h - 1) << 16 | 2752 + (intel_crtc->config.pipe_src_w - 1)); 2753 + I915_WRITE(PLANE_STRIDE(pipe, 0), stride); 2754 + I915_WRITE(PLANE_SURF(pipe, 0), i915_gem_obj_ggtt_offset(obj)); 2755 + 2756 + POSTING_READ(PLANE_SURF(pipe, 0)); 2757 + } 2758 + 2632 2759 /* Assume fb object is pinned & idle & fenced and just update base pointers */ 2633 2760 static int 2634 2761 intel_pipe_set_base_atomic(struct drm_crtc *crtc, struct drm_framebuffer *fb, ··· 2723 2682 2724 2683 if (dev_priv->display.disable_fbc) 2725 2684 dev_priv->display.disable_fbc(dev); 2726 - intel_increase_pllclock(dev, to_intel_crtc(crtc)->pipe); 2727 2685 2728 2686 dev_priv->display.update_primary_plane(crtc, fb, x, y); 2729 2687 ··· 2802 2762 struct drm_device *dev = crtc->dev; 2803 2763 struct drm_i915_private *dev_priv = dev->dev_private; 2804 2764 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 2805 - unsigned long flags; 2806 2765 bool pending; 2807 2766 2808 2767 if (i915_reset_in_progress(&dev_priv->gpu_error) || 2809 2768 intel_crtc->reset_counter != atomic_read(&dev_priv->gpu_error.reset_counter)) 2810 2769 return false; 2811 2770 2812 - spin_lock_irqsave(&dev->event_lock, flags); 2771 + spin_lock_irq(&dev->event_lock); 2813 2772 pending = to_intel_crtc(crtc)->unpin_work != NULL; 2814 - spin_unlock_irqrestore(&dev->event_lock, flags); 2773 + spin_unlock_irq(&dev->event_lock); 2815 2774 2816 2775 return pending; 2776 + } 2777 + 2778 + static void intel_update_pipe_size(struct intel_crtc *crtc) 2779 + { 2780 + struct drm_device *dev = crtc->base.dev; 2781 + struct drm_i915_private *dev_priv = dev->dev_private; 2782 + const struct drm_display_mode *adjusted_mode; 2783 + 2784 + if (!i915.fastboot) 2785 + return; 2786 + 2787 + /* 2788 + * Update pipe size and adjust fitter if needed: the reason for this is 2789 + * that in compute_mode_changes we check the native mode (not the pfit 2790 + * mode) to see if we can flip rather than do a full mode set. In the 2791 + * fastboot case, we'll flip, but if we don't update the pipesrc and 2792 + * pfit state, we'll end up with a big fb scanned out into the wrong 2793 + * sized surface. 2794 + * 2795 + * To fix this properly, we need to hoist the checks up into 2796 + * compute_mode_changes (or above), check the actual pfit state and 2797 + * whether the platform allows pfit disable with pipe active, and only 2798 + * then update the pipesrc and pfit state, even on the flip path. 2799 + */ 2800 + 2801 + adjusted_mode = &crtc->config.adjusted_mode; 2802 + 2803 + I915_WRITE(PIPESRC(crtc->pipe), 2804 + ((adjusted_mode->crtc_hdisplay - 1) << 16) | 2805 + (adjusted_mode->crtc_vdisplay - 1)); 2806 + if (!crtc->config.pch_pfit.enabled && 2807 + (intel_pipe_has_type(&crtc->base, INTEL_OUTPUT_LVDS) || 2808 + intel_pipe_has_type(&crtc->base, INTEL_OUTPUT_EDP))) { 2809 + I915_WRITE(PF_CTL(crtc->pipe), 0); 2810 + I915_WRITE(PF_WIN_POS(crtc->pipe), 0); 2811 + I915_WRITE(PF_WIN_SZ(crtc->pipe), 0); 2812 + } 2813 + crtc->config.pipe_src_w = adjusted_mode->crtc_hdisplay; 2814 + crtc->config.pipe_src_h = adjusted_mode->crtc_vdisplay; 2817 2815 } 2818 2816 2819 2817 static int ··· 2896 2818 return ret; 2897 2819 } 2898 2820 2899 - /* 2900 - * Update pipe size and adjust fitter if needed: the reason for this is 2901 - * that in compute_mode_changes we check the native mode (not the pfit 2902 - * mode) to see if we can flip rather than do a full mode set. In the 2903 - * fastboot case, we'll flip, but if we don't update the pipesrc and 2904 - * pfit state, we'll end up with a big fb scanned out into the wrong 2905 - * sized surface. 2906 - * 2907 - * To fix this properly, we need to hoist the checks up into 2908 - * compute_mode_changes (or above), check the actual pfit state and 2909 - * whether the platform allows pfit disable with pipe active, and only 2910 - * then update the pipesrc and pfit state, even on the flip path. 2911 - */ 2912 - if (i915.fastboot) { 2913 - const struct drm_display_mode *adjusted_mode = 2914 - &intel_crtc->config.adjusted_mode; 2915 - 2916 - I915_WRITE(PIPESRC(intel_crtc->pipe), 2917 - ((adjusted_mode->crtc_hdisplay - 1) << 16) | 2918 - (adjusted_mode->crtc_vdisplay - 1)); 2919 - if (!intel_crtc->config.pch_pfit.enabled && 2920 - (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS) || 2921 - intel_pipe_has_type(crtc, INTEL_OUTPUT_EDP))) { 2922 - I915_WRITE(PF_CTL(intel_crtc->pipe), 0); 2923 - I915_WRITE(PF_WIN_POS(intel_crtc->pipe), 0); 2924 - I915_WRITE(PF_WIN_SZ(intel_crtc->pipe), 0); 2925 - } 2926 - intel_crtc->config.pipe_src_w = adjusted_mode->crtc_hdisplay; 2927 - intel_crtc->config.pipe_src_h = adjusted_mode->crtc_vdisplay; 2928 - } 2821 + intel_update_pipe_size(intel_crtc); 2929 2822 2930 2823 dev_priv->display.update_primary_plane(crtc, fb, x, y); 2931 2824 ··· 3521 3472 !intel_crtc_has_pending_flip(crtc), 3522 3473 60*HZ) == 0)) { 3523 3474 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 3524 - unsigned long flags; 3525 3475 3526 - spin_lock_irqsave(&dev->event_lock, flags); 3476 + spin_lock_irq(&dev->event_lock); 3527 3477 if (intel_crtc->unpin_work) { 3528 3478 WARN_ONCE(1, "Removing stuck page flip\n"); 3529 3479 page_flip_completed(intel_crtc); 3530 3480 } 3531 - spin_unlock_irqrestore(&dev->event_lock, flags); 3481 + spin_unlock_irq(&dev->event_lock); 3532 3482 } 3533 3483 3534 3484 if (crtc->primary->fb) { ··· 4086 4038 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 4087 4039 int pipe = intel_crtc->pipe; 4088 4040 4089 - assert_vblank_disabled(crtc); 4090 - 4091 - drm_vblank_on(dev, pipe); 4092 - 4093 4041 intel_enable_primary_hw_plane(crtc->primary, crtc); 4094 4042 intel_enable_planes(crtc); 4095 4043 intel_crtc_update_cursor(crtc, true); ··· 4131 4087 * consider this a flip to a NULL plane. 4132 4088 */ 4133 4089 intel_frontbuffer_flip(dev, INTEL_FRONTBUFFER_ALL_MASK(pipe)); 4134 - 4135 - drm_vblank_off(dev, pipe); 4136 - 4137 - assert_vblank_disabled(crtc); 4138 4090 } 4139 4091 4140 4092 static void ironlake_crtc_enable(struct drm_crtc *crtc) ··· 4199 4159 4200 4160 if (HAS_PCH_CPT(dev)) 4201 4161 cpt_verify_modeset(dev, intel_crtc->pipe); 4162 + 4163 + assert_vblank_disabled(crtc); 4164 + drm_crtc_vblank_on(crtc); 4202 4165 4203 4166 intel_crtc_enable_planes(crtc); 4204 4167 } ··· 4315 4272 intel_opregion_notify_encoder(encoder, true); 4316 4273 } 4317 4274 4275 + assert_vblank_disabled(crtc); 4276 + drm_crtc_vblank_on(crtc); 4277 + 4318 4278 /* If we change the relative order between pipe/planes enabling, we need 4319 4279 * to change the workaround. */ 4320 4280 haswell_mode_set_planes_workaround(intel_crtc); ··· 4352 4306 return; 4353 4307 4354 4308 intel_crtc_disable_planes(crtc); 4309 + 4310 + drm_crtc_vblank_off(crtc); 4311 + assert_vblank_disabled(crtc); 4355 4312 4356 4313 for_each_encoder_on_crtc(dev, crtc, encoder) 4357 4314 encoder->disable(encoder); ··· 4417 4368 return; 4418 4369 4419 4370 intel_crtc_disable_planes(crtc); 4371 + 4372 + drm_crtc_vblank_off(crtc); 4373 + assert_vblank_disabled(crtc); 4420 4374 4421 4375 for_each_encoder_on_crtc(dev, crtc, encoder) { 4422 4376 intel_opregion_notify_encoder(encoder, false); ··· 4560 4508 mask |= BIT(intel_display_port_power_domain(intel_encoder)); 4561 4509 4562 4510 return mask; 4563 - } 4564 - 4565 - void intel_display_set_init_power(struct drm_i915_private *dev_priv, 4566 - bool enable) 4567 - { 4568 - if (dev_priv->power_domains.init_power_on == enable) 4569 - return; 4570 - 4571 - if (enable) 4572 - intel_display_power_get(dev_priv, POWER_DOMAIN_INIT); 4573 - else 4574 - intel_display_power_put(dev_priv, POWER_DOMAIN_INIT); 4575 - 4576 - dev_priv->power_domains.init_power_on = enable; 4577 4511 } 4578 4512 4579 4513 static void modeset_update_crtc_power_domains(struct drm_device *dev) ··· 4873 4835 for_each_encoder_on_crtc(dev, crtc, encoder) 4874 4836 encoder->enable(encoder); 4875 4837 4838 + assert_vblank_disabled(crtc); 4839 + drm_crtc_vblank_on(crtc); 4840 + 4876 4841 intel_crtc_enable_planes(crtc); 4877 4842 4878 4843 /* Underruns don't raise interrupts, so check manually. */ ··· 4932 4891 4933 4892 for_each_encoder_on_crtc(dev, crtc, encoder) 4934 4893 encoder->enable(encoder); 4894 + 4895 + assert_vblank_disabled(crtc); 4896 + drm_crtc_vblank_on(crtc); 4935 4897 4936 4898 intel_crtc_enable_planes(crtc); 4937 4899 ··· 4999 4955 intel_set_memory_cxsr(dev_priv, false); 5000 4956 intel_crtc_disable_planes(crtc); 5001 4957 5002 - for_each_encoder_on_crtc(dev, crtc, encoder) 5003 - encoder->disable(encoder); 5004 - 5005 4958 /* 5006 4959 * On gen2 planes are double buffered but the pipe isn't, so we must 5007 4960 * wait for planes to fully turn off before disabling the pipe. ··· 5006 4965 * self-refresh mode constraint explained above. 5007 4966 */ 5008 4967 intel_wait_for_vblank(dev, pipe); 4968 + 4969 + drm_crtc_vblank_off(crtc); 4970 + assert_vblank_disabled(crtc); 4971 + 4972 + for_each_encoder_on_crtc(dev, crtc, encoder) 4973 + encoder->disable(encoder); 5009 4974 5010 4975 intel_disable_pipe(intel_crtc); 5011 4976 ··· 6481 6434 struct drm_i915_private *dev_priv = dev->dev_private; 6482 6435 uint32_t tmp; 6483 6436 6484 - if (!intel_display_power_enabled(dev_priv, 6485 - POWER_DOMAIN_PIPE(crtc->pipe))) 6437 + if (!intel_display_power_is_enabled(dev_priv, 6438 + POWER_DOMAIN_PIPE(crtc->pipe))) 6486 6439 return false; 6487 6440 6488 6441 pipe_config->cpu_transcoder = (enum transcoder) crtc->pipe; ··· 7068 7021 I915_WRITE(GAMMA_MODE(intel_crtc->pipe), GAMMA_MODE_MODE_8BIT); 7069 7022 POSTING_READ(GAMMA_MODE(intel_crtc->pipe)); 7070 7023 7071 - if (IS_BROADWELL(dev)) { 7024 + if (IS_BROADWELL(dev) || INTEL_INFO(dev)->gen >= 9) { 7072 7025 val = 0; 7073 7026 7074 7027 switch (intel_crtc->config.pipe_bpp) { ··· 7491 7444 struct drm_i915_private *dev_priv = dev->dev_private; 7492 7445 uint32_t tmp; 7493 7446 7494 - if (!intel_display_power_enabled(dev_priv, 7495 - POWER_DOMAIN_PIPE(crtc->pipe))) 7447 + if (!intel_display_power_is_enabled(dev_priv, 7448 + POWER_DOMAIN_PIPE(crtc->pipe))) 7496 7449 return false; 7497 7450 7498 7451 pipe_config->cpu_transcoder = (enum transcoder) crtc->pipe; ··· 7685 7638 static void hsw_restore_lcpll(struct drm_i915_private *dev_priv) 7686 7639 { 7687 7640 uint32_t val; 7688 - unsigned long irqflags; 7689 7641 7690 7642 val = I915_READ(LCPLL_CTL); 7691 7643 ··· 7704 7658 * to call special forcewake code that doesn't touch runtime PM and 7705 7659 * doesn't enable the forcewake delayed work. 7706 7660 */ 7707 - spin_lock_irqsave(&dev_priv->uncore.lock, irqflags); 7661 + spin_lock_irq(&dev_priv->uncore.lock); 7708 7662 if (dev_priv->uncore.forcewake_count++ == 0) 7709 7663 dev_priv->uncore.funcs.force_wake_get(dev_priv, FORCEWAKE_ALL); 7710 - spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); 7664 + spin_unlock_irq(&dev_priv->uncore.lock); 7711 7665 7712 7666 if (val & LCPLL_POWER_DOWN_ALLOW) { 7713 7667 val &= ~LCPLL_POWER_DOWN_ALLOW; ··· 7738 7692 } 7739 7693 7740 7694 /* See the big comment above. */ 7741 - spin_lock_irqsave(&dev_priv->uncore.lock, irqflags); 7695 + spin_lock_irq(&dev_priv->uncore.lock); 7742 7696 if (--dev_priv->uncore.forcewake_count == 0) 7743 7697 dev_priv->uncore.funcs.force_wake_put(dev_priv, FORCEWAKE_ALL); 7744 - spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); 7698 + spin_unlock_irq(&dev_priv->uncore.lock); 7745 7699 } 7746 7700 7747 7701 /* ··· 7870 7824 * DDI E. So just check whether this pipe is wired to DDI E and whether 7871 7825 * the PCH transcoder is on. 7872 7826 */ 7873 - if ((port == PORT_E) && I915_READ(LPT_TRANSCONF) & TRANS_ENABLE) { 7827 + if (INTEL_INFO(dev)->gen < 9 && 7828 + (port == PORT_E) && I915_READ(LPT_TRANSCONF) & TRANS_ENABLE) { 7874 7829 pipe_config->has_pch_encoder = true; 7875 7830 7876 7831 tmp = I915_READ(FDI_RX_CTL(PIPE_A)); ··· 7890 7843 enum intel_display_power_domain pfit_domain; 7891 7844 uint32_t tmp; 7892 7845 7893 - if (!intel_display_power_enabled(dev_priv, 7846 + if (!intel_display_power_is_enabled(dev_priv, 7894 7847 POWER_DOMAIN_PIPE(crtc->pipe))) 7895 7848 return false; 7896 7849 ··· 7919 7872 pipe_config->cpu_transcoder = TRANSCODER_EDP; 7920 7873 } 7921 7874 7922 - if (!intel_display_power_enabled(dev_priv, 7875 + if (!intel_display_power_is_enabled(dev_priv, 7923 7876 POWER_DOMAIN_TRANSCODER(pipe_config->cpu_transcoder))) 7924 7877 return false; 7925 7878 ··· 7932 7885 intel_get_pipe_timings(crtc, pipe_config); 7933 7886 7934 7887 pfit_domain = POWER_DOMAIN_PIPE_PANEL_FITTER(crtc->pipe); 7935 - if (intel_display_power_enabled(dev_priv, pfit_domain)) 7888 + if (intel_display_power_is_enabled(dev_priv, pfit_domain)) 7936 7889 ironlake_get_pfit_config(crtc, pipe_config); 7937 7890 7938 7891 if (IS_HASWELL(dev)) ··· 8302 8255 intel_crtc->cursor_cntl = 0; 8303 8256 } 8304 8257 8305 - if (intel_crtc->cursor_base != base) 8258 + if (intel_crtc->cursor_base != base) { 8306 8259 I915_WRITE(_CURABASE, base); 8260 + intel_crtc->cursor_base = base; 8261 + } 8307 8262 8308 8263 if (intel_crtc->cursor_size != size) { 8309 8264 I915_WRITE(CURSIZE, size); ··· 8345 8296 return; 8346 8297 } 8347 8298 cntl |= pipe << 28; /* Connect to correct pipe */ 8299 + 8300 + if (IS_HASWELL(dev) || IS_BROADWELL(dev)) 8301 + cntl |= CURSOR_PIPE_CSC_ENABLE; 8348 8302 } 8349 - if (IS_HASWELL(dev) || IS_BROADWELL(dev)) 8350 - cntl |= CURSOR_PIPE_CSC_ENABLE; 8351 8303 8352 8304 if (intel_crtc->cursor_cntl != cntl) { 8353 8305 I915_WRITE(CURCNTR(pipe), cntl); ··· 8359 8309 /* and commit changes on next vblank */ 8360 8310 I915_WRITE(CURBASE(pipe), base); 8361 8311 POSTING_READ(CURBASE(pipe)); 8312 + 8313 + intel_crtc->cursor_base = base; 8362 8314 } 8363 8315 8364 8316 /* If no-part of the cursor is visible on the framebuffer, then the GPU may hang... */ ··· 8411 8359 i845_update_cursor(crtc, base); 8412 8360 else 8413 8361 i9xx_update_cursor(crtc, base); 8414 - intel_crtc->cursor_base = base; 8415 8362 } 8416 8363 8417 8364 static bool cursor_size_ok(struct drm_device *dev, ··· 9074 9023 return mode; 9075 9024 } 9076 9025 9077 - static void intel_increase_pllclock(struct drm_device *dev, 9078 - enum pipe pipe) 9079 - { 9080 - struct drm_i915_private *dev_priv = dev->dev_private; 9081 - int dpll_reg = DPLL(pipe); 9082 - int dpll; 9083 - 9084 - if (!HAS_GMCH_DISPLAY(dev)) 9085 - return; 9086 - 9087 - if (!dev_priv->lvds_downclock_avail) 9088 - return; 9089 - 9090 - dpll = I915_READ(dpll_reg); 9091 - if (!HAS_PIPE_CXSR(dev) && (dpll & DISPLAY_RATE_SELECT_FPA1)) { 9092 - DRM_DEBUG_DRIVER("upclocking LVDS\n"); 9093 - 9094 - assert_panel_unlocked(dev_priv, pipe); 9095 - 9096 - dpll &= ~DISPLAY_RATE_SELECT_FPA1; 9097 - I915_WRITE(dpll_reg, dpll); 9098 - intel_wait_for_vblank(dev, pipe); 9099 - 9100 - dpll = I915_READ(dpll_reg); 9101 - if (dpll & DISPLAY_RATE_SELECT_FPA1) 9102 - DRM_DEBUG_DRIVER("failed to upclock LVDS!\n"); 9103 - } 9104 - } 9105 - 9106 9026 static void intel_decrease_pllclock(struct drm_crtc *crtc) 9107 9027 { 9108 9028 struct drm_device *dev = crtc->dev; ··· 9149 9127 intel_runtime_pm_put(dev_priv); 9150 9128 } 9151 9129 9152 - 9153 - /** 9154 - * intel_mark_fb_busy - mark given planes as busy 9155 - * @dev: DRM device 9156 - * @frontbuffer_bits: bits for the affected planes 9157 - * @ring: optional ring for asynchronous commands 9158 - * 9159 - * This function gets called every time the screen contents change. It can be 9160 - * used to keep e.g. the update rate at the nominal refresh rate with DRRS. 9161 - */ 9162 - static void intel_mark_fb_busy(struct drm_device *dev, 9163 - unsigned frontbuffer_bits, 9164 - struct intel_engine_cs *ring) 9165 - { 9166 - struct drm_i915_private *dev_priv = dev->dev_private; 9167 - enum pipe pipe; 9168 - 9169 - if (!i915.powersave) 9170 - return; 9171 - 9172 - for_each_pipe(dev_priv, pipe) { 9173 - if (!(frontbuffer_bits & INTEL_FRONTBUFFER_ALL_MASK(pipe))) 9174 - continue; 9175 - 9176 - intel_increase_pllclock(dev, pipe); 9177 - if (ring && intel_fbc_enabled(dev)) 9178 - ring->fbc_dirty = true; 9179 - } 9180 - } 9181 - 9182 - /** 9183 - * intel_fb_obj_invalidate - invalidate frontbuffer object 9184 - * @obj: GEM object to invalidate 9185 - * @ring: set for asynchronous rendering 9186 - * 9187 - * This function gets called every time rendering on the given object starts and 9188 - * frontbuffer caching (fbc, low refresh rate for DRRS, panel self refresh) must 9189 - * be invalidated. If @ring is non-NULL any subsequent invalidation will be delayed 9190 - * until the rendering completes or a flip on this frontbuffer plane is 9191 - * scheduled. 9192 - */ 9193 - void intel_fb_obj_invalidate(struct drm_i915_gem_object *obj, 9194 - struct intel_engine_cs *ring) 9195 - { 9196 - struct drm_device *dev = obj->base.dev; 9197 - struct drm_i915_private *dev_priv = dev->dev_private; 9198 - 9199 - WARN_ON(!mutex_is_locked(&dev->struct_mutex)); 9200 - 9201 - if (!obj->frontbuffer_bits) 9202 - return; 9203 - 9204 - if (ring) { 9205 - mutex_lock(&dev_priv->fb_tracking.lock); 9206 - dev_priv->fb_tracking.busy_bits 9207 - |= obj->frontbuffer_bits; 9208 - dev_priv->fb_tracking.flip_bits 9209 - &= ~obj->frontbuffer_bits; 9210 - mutex_unlock(&dev_priv->fb_tracking.lock); 9211 - } 9212 - 9213 - intel_mark_fb_busy(dev, obj->frontbuffer_bits, ring); 9214 - 9215 - intel_edp_psr_invalidate(dev, obj->frontbuffer_bits); 9216 - } 9217 - 9218 - /** 9219 - * intel_frontbuffer_flush - flush frontbuffer 9220 - * @dev: DRM device 9221 - * @frontbuffer_bits: frontbuffer plane tracking bits 9222 - * 9223 - * This function gets called every time rendering on the given planes has 9224 - * completed and frontbuffer caching can be started again. Flushes will get 9225 - * delayed if they're blocked by some oustanding asynchronous rendering. 9226 - * 9227 - * Can be called without any locks held. 9228 - */ 9229 - void intel_frontbuffer_flush(struct drm_device *dev, 9230 - unsigned frontbuffer_bits) 9231 - { 9232 - struct drm_i915_private *dev_priv = dev->dev_private; 9233 - 9234 - /* Delay flushing when rings are still busy.*/ 9235 - mutex_lock(&dev_priv->fb_tracking.lock); 9236 - frontbuffer_bits &= ~dev_priv->fb_tracking.busy_bits; 9237 - mutex_unlock(&dev_priv->fb_tracking.lock); 9238 - 9239 - intel_mark_fb_busy(dev, frontbuffer_bits, NULL); 9240 - 9241 - intel_edp_psr_flush(dev, frontbuffer_bits); 9242 - 9243 - /* 9244 - * FIXME: Unconditional fbc flushing here is a rather gross hack and 9245 - * needs to be reworked into a proper frontbuffer tracking scheme like 9246 - * psr employs. 9247 - */ 9248 - if (IS_BROADWELL(dev)) 9249 - gen8_fbc_sw_flush(dev, FBC_REND_CACHE_CLEAN); 9250 - } 9251 - 9252 - /** 9253 - * intel_fb_obj_flush - flush frontbuffer object 9254 - * @obj: GEM object to flush 9255 - * @retire: set when retiring asynchronous rendering 9256 - * 9257 - * This function gets called every time rendering on the given object has 9258 - * completed and frontbuffer caching can be started again. If @retire is true 9259 - * then any delayed flushes will be unblocked. 9260 - */ 9261 - void intel_fb_obj_flush(struct drm_i915_gem_object *obj, 9262 - bool retire) 9263 - { 9264 - struct drm_device *dev = obj->base.dev; 9265 - struct drm_i915_private *dev_priv = dev->dev_private; 9266 - unsigned frontbuffer_bits; 9267 - 9268 - WARN_ON(!mutex_is_locked(&dev->struct_mutex)); 9269 - 9270 - if (!obj->frontbuffer_bits) 9271 - return; 9272 - 9273 - frontbuffer_bits = obj->frontbuffer_bits; 9274 - 9275 - if (retire) { 9276 - mutex_lock(&dev_priv->fb_tracking.lock); 9277 - /* Filter out new bits since rendering started. */ 9278 - frontbuffer_bits &= dev_priv->fb_tracking.busy_bits; 9279 - 9280 - dev_priv->fb_tracking.busy_bits &= ~frontbuffer_bits; 9281 - mutex_unlock(&dev_priv->fb_tracking.lock); 9282 - } 9283 - 9284 - intel_frontbuffer_flush(dev, frontbuffer_bits); 9285 - } 9286 - 9287 - /** 9288 - * intel_frontbuffer_flip_prepare - prepare asnychronous frontbuffer flip 9289 - * @dev: DRM device 9290 - * @frontbuffer_bits: frontbuffer plane tracking bits 9291 - * 9292 - * This function gets called after scheduling a flip on @obj. The actual 9293 - * frontbuffer flushing will be delayed until completion is signalled with 9294 - * intel_frontbuffer_flip_complete. If an invalidate happens in between this 9295 - * flush will be cancelled. 9296 - * 9297 - * Can be called without any locks held. 9298 - */ 9299 - void intel_frontbuffer_flip_prepare(struct drm_device *dev, 9300 - unsigned frontbuffer_bits) 9301 - { 9302 - struct drm_i915_private *dev_priv = dev->dev_private; 9303 - 9304 - mutex_lock(&dev_priv->fb_tracking.lock); 9305 - dev_priv->fb_tracking.flip_bits 9306 - |= frontbuffer_bits; 9307 - mutex_unlock(&dev_priv->fb_tracking.lock); 9308 - } 9309 - 9310 - /** 9311 - * intel_frontbuffer_flip_complete - complete asynchronous frontbuffer flush 9312 - * @dev: DRM device 9313 - * @frontbuffer_bits: frontbuffer plane tracking bits 9314 - * 9315 - * This function gets called after the flip has been latched and will complete 9316 - * on the next vblank. It will execute the fush if it hasn't been cancalled yet. 9317 - * 9318 - * Can be called without any locks held. 9319 - */ 9320 - void intel_frontbuffer_flip_complete(struct drm_device *dev, 9321 - unsigned frontbuffer_bits) 9322 - { 9323 - struct drm_i915_private *dev_priv = dev->dev_private; 9324 - 9325 - mutex_lock(&dev_priv->fb_tracking.lock); 9326 - /* Mask any cancelled flips. */ 9327 - frontbuffer_bits &= dev_priv->fb_tracking.flip_bits; 9328 - dev_priv->fb_tracking.flip_bits &= ~frontbuffer_bits; 9329 - mutex_unlock(&dev_priv->fb_tracking.lock); 9330 - 9331 - intel_frontbuffer_flush(dev, frontbuffer_bits); 9332 - } 9333 - 9334 9130 static void intel_crtc_destroy(struct drm_crtc *crtc) 9335 9131 { 9336 9132 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 9337 9133 struct drm_device *dev = crtc->dev; 9338 9134 struct intel_unpin_work *work; 9339 - unsigned long flags; 9340 9135 9341 - spin_lock_irqsave(&dev->event_lock, flags); 9136 + spin_lock_irq(&dev->event_lock); 9342 9137 work = intel_crtc->unpin_work; 9343 9138 intel_crtc->unpin_work = NULL; 9344 - spin_unlock_irqrestore(&dev->event_lock, flags); 9139 + spin_unlock_irq(&dev->event_lock); 9345 9140 9346 9141 if (work) { 9347 9142 cancel_work_sync(&work->work); ··· 9204 9365 if (intel_crtc == NULL) 9205 9366 return; 9206 9367 9368 + /* 9369 + * This is called both by irq handlers and the reset code (to complete 9370 + * lost pageflips) so needs the full irqsave spinlocks. 9371 + */ 9207 9372 spin_lock_irqsave(&dev->event_lock, flags); 9208 9373 work = intel_crtc->unpin_work; 9209 9374 ··· 9289 9446 to_intel_crtc(dev_priv->plane_to_crtc_mapping[plane]); 9290 9447 unsigned long flags; 9291 9448 9292 - /* NB: An MMIO update of the plane base pointer will also 9449 + 9450 + /* 9451 + * This is called both by irq handlers and the reset code (to complete 9452 + * lost pageflips) so needs the full irqsave spinlocks. 9453 + * 9454 + * NB: An MMIO update of the plane base pointer will also 9293 9455 * generate a page-flip completion irq, i.e. every modeset 9294 9456 * is also accompanied by a spurious intel_prepare_page_flip(). 9295 9457 */ ··· 9669 9821 { 9670 9822 struct drm_i915_private *dev_priv = dev->dev_private; 9671 9823 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 9672 - unsigned long irq_flags; 9673 9824 int ret; 9674 9825 9675 9826 if (WARN_ON(intel_crtc->mmio_flip.seqno)) ··· 9682 9835 return 0; 9683 9836 } 9684 9837 9685 - spin_lock_irqsave(&dev_priv->mmio_flip_lock, irq_flags); 9838 + spin_lock_irq(&dev_priv->mmio_flip_lock); 9686 9839 intel_crtc->mmio_flip.seqno = obj->last_write_seqno; 9687 9840 intel_crtc->mmio_flip.ring_id = obj->ring->id; 9688 - spin_unlock_irqrestore(&dev_priv->mmio_flip_lock, irq_flags); 9841 + spin_unlock_irq(&dev_priv->mmio_flip_lock); 9689 9842 9690 9843 /* 9691 9844 * Double check to catch cases where irq fired before ··· 9750 9903 struct drm_i915_private *dev_priv = dev->dev_private; 9751 9904 struct drm_crtc *crtc = dev_priv->pipe_to_crtc_mapping[pipe]; 9752 9905 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 9753 - unsigned long flags; 9906 + 9907 + WARN_ON(!in_irq()); 9754 9908 9755 9909 if (crtc == NULL) 9756 9910 return; 9757 9911 9758 - spin_lock_irqsave(&dev->event_lock, flags); 9912 + spin_lock(&dev->event_lock); 9759 9913 if (intel_crtc->unpin_work && __intel_pageflip_stall_check(dev, crtc)) { 9760 9914 WARN_ONCE(1, "Kicking stuck page flip: queued at %d, now %d\n", 9761 9915 intel_crtc->unpin_work->flip_queued_vblank, drm_vblank_count(dev, pipe)); 9762 9916 page_flip_completed(intel_crtc); 9763 9917 } 9764 - spin_unlock_irqrestore(&dev->event_lock, flags); 9918 + spin_unlock(&dev->event_lock); 9765 9919 } 9766 9920 9767 9921 static int intel_crtc_page_flip(struct drm_crtc *crtc, ··· 9778 9930 enum pipe pipe = intel_crtc->pipe; 9779 9931 struct intel_unpin_work *work; 9780 9932 struct intel_engine_cs *ring; 9781 - unsigned long flags; 9782 9933 int ret; 9783 9934 9784 9935 /* ··· 9818 9971 goto free_work; 9819 9972 9820 9973 /* We borrow the event spin lock for protecting unpin_work */ 9821 - spin_lock_irqsave(&dev->event_lock, flags); 9974 + spin_lock_irq(&dev->event_lock); 9822 9975 if (intel_crtc->unpin_work) { 9823 9976 /* Before declaring the flip queue wedged, check if 9824 9977 * the hardware completed the operation behind our backs. ··· 9828 9981 page_flip_completed(intel_crtc); 9829 9982 } else { 9830 9983 DRM_DEBUG_DRIVER("flip queue: crtc already busy\n"); 9831 - spin_unlock_irqrestore(&dev->event_lock, flags); 9984 + spin_unlock_irq(&dev->event_lock); 9832 9985 9833 9986 drm_crtc_vblank_put(crtc); 9834 9987 kfree(work); ··· 9836 9989 } 9837 9990 } 9838 9991 intel_crtc->unpin_work = work; 9839 - spin_unlock_irqrestore(&dev->event_lock, flags); 9992 + spin_unlock_irq(&dev->event_lock); 9840 9993 9841 9994 if (atomic_read(&intel_crtc->unpin_work_count) >= 2) 9842 9995 flush_workqueue(dev_priv->wq); ··· 9923 10076 mutex_unlock(&dev->struct_mutex); 9924 10077 9925 10078 cleanup: 9926 - spin_lock_irqsave(&dev->event_lock, flags); 10079 + spin_lock_irq(&dev->event_lock); 9927 10080 intel_crtc->unpin_work = NULL; 9928 - spin_unlock_irqrestore(&dev->event_lock, flags); 10081 + spin_unlock_irq(&dev->event_lock); 9929 10082 9930 10083 drm_crtc_vblank_put(crtc); 9931 10084 free_work: ··· 9936 10089 intel_crtc_wait_for_pending_flips(crtc); 9937 10090 ret = intel_pipe_set_base(crtc, crtc->x, crtc->y, fb); 9938 10091 if (ret == 0 && event) { 9939 - spin_lock_irqsave(&dev->event_lock, flags); 10092 + spin_lock_irq(&dev->event_lock); 9940 10093 drm_send_vblank_event(dev, pipe, event); 9941 - spin_unlock_irqrestore(&dev->event_lock, flags); 10094 + spin_unlock_irq(&dev->event_lock); 9942 10095 } 9943 10096 } 9944 10097 return ret; ··· 11524 11677 { 11525 11678 uint32_t val; 11526 11679 11527 - if (!intel_display_power_enabled(dev_priv, POWER_DOMAIN_PLLS)) 11680 + if (!intel_display_power_is_enabled(dev_priv, POWER_DOMAIN_PLLS)) 11528 11681 return false; 11529 11682 11530 11683 val = I915_READ(PCH_DPLL(pll->id)); ··· 11658 11811 } 11659 11812 11660 11813 static int 11661 - intel_primary_plane_setplane(struct drm_plane *plane, struct drm_crtc *crtc, 11662 - struct drm_framebuffer *fb, int crtc_x, int crtc_y, 11663 - unsigned int crtc_w, unsigned int crtc_h, 11664 - uint32_t src_x, uint32_t src_y, 11665 - uint32_t src_w, uint32_t src_h) 11814 + intel_check_primary_plane(struct drm_plane *plane, 11815 + struct intel_plane_state *state) 11666 11816 { 11817 + struct drm_crtc *crtc = state->crtc; 11818 + struct drm_framebuffer *fb = state->fb; 11819 + struct drm_rect *dest = &state->dst; 11820 + struct drm_rect *src = &state->src; 11821 + const struct drm_rect *clip = &state->clip; 11822 + 11823 + return drm_plane_helper_check_update(plane, crtc, fb, 11824 + src, dest, clip, 11825 + DRM_PLANE_HELPER_NO_SCALING, 11826 + DRM_PLANE_HELPER_NO_SCALING, 11827 + false, true, &state->visible); 11828 + } 11829 + 11830 + static int 11831 + intel_commit_primary_plane(struct drm_plane *plane, 11832 + struct intel_plane_state *state) 11833 + { 11834 + struct drm_crtc *crtc = state->crtc; 11835 + struct drm_framebuffer *fb = state->fb; 11667 11836 struct drm_device *dev = crtc->dev; 11668 11837 struct drm_i915_private *dev_priv = dev->dev_private; 11669 11838 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 11670 11839 struct drm_i915_gem_object *obj = intel_fb_obj(fb); 11671 11840 struct drm_i915_gem_object *old_obj = intel_fb_obj(plane->fb); 11672 - struct drm_rect dest = { 11673 - /* integer pixels */ 11674 - .x1 = crtc_x, 11675 - .y1 = crtc_y, 11676 - .x2 = crtc_x + crtc_w, 11677 - .y2 = crtc_y + crtc_h, 11678 - }; 11679 - struct drm_rect src = { 11680 - /* 16.16 fixed point */ 11681 - .x1 = src_x, 11682 - .y1 = src_y, 11683 - .x2 = src_x + src_w, 11684 - .y2 = src_y + src_h, 11685 - }; 11686 - const struct drm_rect clip = { 11687 - /* integer pixels */ 11688 - .x2 = intel_crtc->active ? intel_crtc->config.pipe_src_w : 0, 11689 - .y2 = intel_crtc->active ? intel_crtc->config.pipe_src_h : 0, 11690 - }; 11691 - const struct { 11692 - int crtc_x, crtc_y; 11693 - unsigned int crtc_w, crtc_h; 11694 - uint32_t src_x, src_y, src_w, src_h; 11695 - } orig = { 11696 - .crtc_x = crtc_x, 11697 - .crtc_y = crtc_y, 11698 - .crtc_w = crtc_w, 11699 - .crtc_h = crtc_h, 11700 - .src_x = src_x, 11701 - .src_y = src_y, 11702 - .src_w = src_w, 11703 - .src_h = src_h, 11704 - }; 11705 11841 struct intel_plane *intel_plane = to_intel_plane(plane); 11706 - bool visible; 11842 + struct drm_rect *src = &state->src; 11707 11843 int ret; 11708 - 11709 - ret = drm_plane_helper_check_update(plane, crtc, fb, 11710 - &src, &dest, &clip, 11711 - DRM_PLANE_HELPER_NO_SCALING, 11712 - DRM_PLANE_HELPER_NO_SCALING, 11713 - false, true, &visible); 11714 - 11715 - if (ret) 11716 - return ret; 11717 - 11718 - /* 11719 - * If the CRTC isn't enabled, we're just pinning the framebuffer, 11720 - * updating the fb pointer, and returning without touching the 11721 - * hardware. This allows us to later do a drmModeSetCrtc with fb=-1 to 11722 - * turn on the display with all planes setup as desired. 11723 - */ 11724 - if (!crtc->enabled) { 11725 - mutex_lock(&dev->struct_mutex); 11726 - 11727 - /* 11728 - * If we already called setplane while the crtc was disabled, 11729 - * we may have an fb pinned; unpin it. 11730 - */ 11731 - if (plane->fb) 11732 - intel_unpin_fb_obj(old_obj); 11733 - 11734 - i915_gem_track_fb(old_obj, obj, 11735 - INTEL_FRONTBUFFER_PRIMARY(intel_crtc->pipe)); 11736 - 11737 - /* Pin and return without programming hardware */ 11738 - ret = intel_pin_and_fence_fb_obj(dev, obj, NULL); 11739 - mutex_unlock(&dev->struct_mutex); 11740 - 11741 - return ret; 11742 - } 11743 11844 11744 11845 intel_crtc_wait_for_pending_flips(crtc); 11745 11846 ··· 11697 11902 * happens if userspace explicitly disables the plane by passing fb=0 11698 11903 * because plane->fb still gets set and pinned. 11699 11904 */ 11700 - if (!visible) { 11905 + if (!state->visible) { 11701 11906 mutex_lock(&dev->struct_mutex); 11702 11907 11703 11908 /* ··· 11744 11949 intel_disable_fbc(dev); 11745 11950 } 11746 11951 } 11747 - ret = intel_pipe_set_base(crtc, src.x1, src.y1, fb); 11952 + ret = intel_pipe_set_base(crtc, src->x1, src->y1, fb); 11748 11953 if (ret) 11749 11954 return ret; 11750 11955 ··· 11752 11957 intel_enable_primary_hw_plane(plane, crtc); 11753 11958 } 11754 11959 11755 - intel_plane->crtc_x = orig.crtc_x; 11756 - intel_plane->crtc_y = orig.crtc_y; 11757 - intel_plane->crtc_w = orig.crtc_w; 11758 - intel_plane->crtc_h = orig.crtc_h; 11759 - intel_plane->src_x = orig.src_x; 11760 - intel_plane->src_y = orig.src_y; 11761 - intel_plane->src_w = orig.src_w; 11762 - intel_plane->src_h = orig.src_h; 11960 + intel_plane->crtc_x = state->orig_dst.x1; 11961 + intel_plane->crtc_y = state->orig_dst.y1; 11962 + intel_plane->crtc_w = drm_rect_width(&state->orig_dst); 11963 + intel_plane->crtc_h = drm_rect_height(&state->orig_dst); 11964 + intel_plane->src_x = state->orig_src.x1; 11965 + intel_plane->src_y = state->orig_src.y1; 11966 + intel_plane->src_w = drm_rect_width(&state->orig_src); 11967 + intel_plane->src_h = drm_rect_height(&state->orig_src); 11763 11968 intel_plane->obj = obj; 11969 + 11970 + return 0; 11971 + } 11972 + 11973 + static int 11974 + intel_primary_plane_setplane(struct drm_plane *plane, struct drm_crtc *crtc, 11975 + struct drm_framebuffer *fb, int crtc_x, int crtc_y, 11976 + unsigned int crtc_w, unsigned int crtc_h, 11977 + uint32_t src_x, uint32_t src_y, 11978 + uint32_t src_w, uint32_t src_h) 11979 + { 11980 + struct intel_plane_state state; 11981 + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 11982 + int ret; 11983 + 11984 + state.crtc = crtc; 11985 + state.fb = fb; 11986 + 11987 + /* sample coordinates in 16.16 fixed point */ 11988 + state.src.x1 = src_x; 11989 + state.src.x2 = src_x + src_w; 11990 + state.src.y1 = src_y; 11991 + state.src.y2 = src_y + src_h; 11992 + 11993 + /* integer pixels */ 11994 + state.dst.x1 = crtc_x; 11995 + state.dst.x2 = crtc_x + crtc_w; 11996 + state.dst.y1 = crtc_y; 11997 + state.dst.y2 = crtc_y + crtc_h; 11998 + 11999 + state.clip.x1 = 0; 12000 + state.clip.y1 = 0; 12001 + state.clip.x2 = intel_crtc->active ? intel_crtc->config.pipe_src_w : 0; 12002 + state.clip.y2 = intel_crtc->active ? intel_crtc->config.pipe_src_h : 0; 12003 + 12004 + state.orig_src = state.src; 12005 + state.orig_dst = state.dst; 12006 + 12007 + ret = intel_check_primary_plane(plane, &state); 12008 + if (ret) 12009 + return ret; 12010 + 12011 + intel_commit_primary_plane(plane, &state); 11764 12012 11765 12013 return 0; 11766 12014 } ··· 11882 12044 } 11883 12045 11884 12046 static int 11885 - intel_cursor_plane_update(struct drm_plane *plane, struct drm_crtc *crtc, 11886 - struct drm_framebuffer *fb, int crtc_x, int crtc_y, 11887 - unsigned int crtc_w, unsigned int crtc_h, 11888 - uint32_t src_x, uint32_t src_y, 11889 - uint32_t src_w, uint32_t src_h) 12047 + intel_check_cursor_plane(struct drm_plane *plane, 12048 + struct intel_plane_state *state) 11890 12049 { 12050 + struct drm_crtc *crtc = state->crtc; 12051 + struct drm_framebuffer *fb = state->fb; 12052 + struct drm_rect *dest = &state->dst; 12053 + struct drm_rect *src = &state->src; 12054 + const struct drm_rect *clip = &state->clip; 12055 + 12056 + return drm_plane_helper_check_update(plane, crtc, fb, 12057 + src, dest, clip, 12058 + DRM_PLANE_HELPER_NO_SCALING, 12059 + DRM_PLANE_HELPER_NO_SCALING, 12060 + true, true, &state->visible); 12061 + } 12062 + 12063 + static int 12064 + intel_commit_cursor_plane(struct drm_plane *plane, 12065 + struct intel_plane_state *state) 12066 + { 12067 + struct drm_crtc *crtc = state->crtc; 12068 + struct drm_framebuffer *fb = state->fb; 11891 12069 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 11892 12070 struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb); 11893 12071 struct drm_i915_gem_object *obj = intel_fb->obj; 11894 - struct drm_rect dest = { 11895 - /* integer pixels */ 11896 - .x1 = crtc_x, 11897 - .y1 = crtc_y, 11898 - .x2 = crtc_x + crtc_w, 11899 - .y2 = crtc_y + crtc_h, 11900 - }; 11901 - struct drm_rect src = { 11902 - /* 16.16 fixed point */ 11903 - .x1 = src_x, 11904 - .y1 = src_y, 11905 - .x2 = src_x + src_w, 11906 - .y2 = src_y + src_h, 11907 - }; 11908 - const struct drm_rect clip = { 11909 - /* integer pixels */ 11910 - .x2 = intel_crtc->active ? intel_crtc->config.pipe_src_w : 0, 11911 - .y2 = intel_crtc->active ? intel_crtc->config.pipe_src_h : 0, 11912 - }; 11913 - bool visible; 11914 - int ret; 12072 + int crtc_w, crtc_h; 11915 12073 11916 - ret = drm_plane_helper_check_update(plane, crtc, fb, 11917 - &src, &dest, &clip, 11918 - DRM_PLANE_HELPER_NO_SCALING, 11919 - DRM_PLANE_HELPER_NO_SCALING, 11920 - true, true, &visible); 11921 - if (ret) 11922 - return ret; 11923 - 11924 - crtc->cursor_x = crtc_x; 11925 - crtc->cursor_y = crtc_y; 12074 + crtc->cursor_x = state->orig_dst.x1; 12075 + crtc->cursor_y = state->orig_dst.y1; 11926 12076 if (fb != crtc->cursor->fb) { 12077 + crtc_w = drm_rect_width(&state->orig_dst); 12078 + crtc_h = drm_rect_height(&state->orig_dst); 11927 12079 return intel_crtc_cursor_set_obj(crtc, obj, crtc_w, crtc_h); 11928 12080 } else { 11929 - intel_crtc_update_cursor(crtc, visible); 12081 + intel_crtc_update_cursor(crtc, state->visible); 11930 12082 11931 12083 intel_frontbuffer_flip(crtc->dev, 11932 12084 INTEL_FRONTBUFFER_CURSOR(intel_crtc->pipe)); ··· 11924 12096 return 0; 11925 12097 } 11926 12098 } 12099 + 12100 + static int 12101 + intel_cursor_plane_update(struct drm_plane *plane, struct drm_crtc *crtc, 12102 + struct drm_framebuffer *fb, int crtc_x, int crtc_y, 12103 + unsigned int crtc_w, unsigned int crtc_h, 12104 + uint32_t src_x, uint32_t src_y, 12105 + uint32_t src_w, uint32_t src_h) 12106 + { 12107 + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 12108 + struct intel_plane_state state; 12109 + int ret; 12110 + 12111 + state.crtc = crtc; 12112 + state.fb = fb; 12113 + 12114 + /* sample coordinates in 16.16 fixed point */ 12115 + state.src.x1 = src_x; 12116 + state.src.x2 = src_x + src_w; 12117 + state.src.y1 = src_y; 12118 + state.src.y2 = src_y + src_h; 12119 + 12120 + /* integer pixels */ 12121 + state.dst.x1 = crtc_x; 12122 + state.dst.x2 = crtc_x + crtc_w; 12123 + state.dst.y1 = crtc_y; 12124 + state.dst.y2 = crtc_y + crtc_h; 12125 + 12126 + state.clip.x1 = 0; 12127 + state.clip.y1 = 0; 12128 + state.clip.x2 = intel_crtc->active ? intel_crtc->config.pipe_src_w : 0; 12129 + state.clip.y2 = intel_crtc->active ? intel_crtc->config.pipe_src_h : 0; 12130 + 12131 + state.orig_src = state.src; 12132 + state.orig_dst = state.dst; 12133 + 12134 + ret = intel_check_cursor_plane(plane, &state); 12135 + if (ret) 12136 + return ret; 12137 + 12138 + return intel_commit_cursor_plane(plane, &state); 12139 + } 12140 + 11927 12141 static const struct drm_plane_funcs intel_cursor_plane_funcs = { 11928 12142 .update_plane = intel_cursor_plane_update, 11929 12143 .disable_plane = intel_cursor_plane_disable, ··· 12153 12283 static bool intel_crt_present(struct drm_device *dev) 12154 12284 { 12155 12285 struct drm_i915_private *dev_priv = dev->dev_private; 12286 + 12287 + if (INTEL_INFO(dev)->gen >= 9) 12288 + return false; 12156 12289 12157 12290 if (IS_ULT(dev)) 12158 12291 return false; ··· 12509 12636 dev_priv->display.crtc_enable = haswell_crtc_enable; 12510 12637 dev_priv->display.crtc_disable = haswell_crtc_disable; 12511 12638 dev_priv->display.off = ironlake_crtc_off; 12512 - dev_priv->display.update_primary_plane = 12513 - ironlake_update_primary_plane; 12639 + if (INTEL_INFO(dev)->gen >= 9) 12640 + dev_priv->display.update_primary_plane = 12641 + skylake_update_primary_plane; 12642 + else 12643 + dev_priv->display.update_primary_plane = 12644 + ironlake_update_primary_plane; 12514 12645 } else if (HAS_PCH_SPLIT(dev)) { 12515 12646 dev_priv->display.get_pipe_config = ironlake_get_pipe_config; 12516 12647 dev_priv->display.get_plane_config = ironlake_get_plane_config; ··· 12598 12721 dev_priv->display.modeset_global_resources = 12599 12722 valleyview_modeset_global_resources; 12600 12723 dev_priv->display.write_eld = ironlake_write_eld; 12724 + } else if (INTEL_INFO(dev)->gen >= 9) { 12725 + dev_priv->display.write_eld = haswell_write_eld; 12726 + dev_priv->display.modeset_global_resources = 12727 + haswell_modeset_global_resources; 12601 12728 } 12602 12729 12603 12730 /* Default just returns -ENODEV to indicate unsupported */ ··· 12827 12946 intel_init_clock_gating(dev); 12828 12947 12829 12948 intel_enable_gt_powersave(dev); 12830 - } 12831 - 12832 - void intel_modeset_suspend_hw(struct drm_device *dev) 12833 - { 12834 - intel_suspend_hw(dev); 12835 12949 } 12836 12950 12837 12951 void intel_modeset_init(struct drm_device *dev) ··· 13164 13288 * level, just check if the power well is enabled instead of trying to 13165 13289 * follow the "don't touch the power well if we don't need it" policy 13166 13290 * the rest of the driver uses. */ 13167 - if (!intel_display_power_enabled(dev_priv, POWER_DOMAIN_VGA)) 13291 + if (!intel_display_power_is_enabled(dev_priv, POWER_DOMAIN_VGA)) 13168 13292 return; 13169 13293 13170 13294 i915_redisable_vga_power_on(dev); ··· 13385 13509 * Too much stuff here (turning of rps, connectors, ...) would 13386 13510 * experience fancy races otherwise. 13387 13511 */ 13388 - drm_irq_uninstall(dev); 13389 - intel_hpd_cancel_work(dev_priv); 13390 - dev_priv->pm._irqs_disabled = true; 13512 + intel_irq_uninstall(dev_priv); 13391 13513 13392 13514 /* 13393 13515 * Due to the hpd irq storm handling the hotplug work can re-arm the ··· 13540 13666 13541 13667 for_each_pipe(dev_priv, i) { 13542 13668 error->pipe[i].power_domain_on = 13543 - intel_display_power_enabled_unlocked(dev_priv, 13544 - POWER_DOMAIN_PIPE(i)); 13669 + __intel_display_power_is_enabled(dev_priv, 13670 + POWER_DOMAIN_PIPE(i)); 13545 13671 if (!error->pipe[i].power_domain_on) 13546 13672 continue; 13547 13673 ··· 13576 13702 enum transcoder cpu_transcoder = transcoders[i]; 13577 13703 13578 13704 error->transcoder[i].power_domain_on = 13579 - intel_display_power_enabled_unlocked(dev_priv, 13705 + __intel_display_power_is_enabled(dev_priv, 13580 13706 POWER_DOMAIN_TRANSCODER(cpu_transcoder)); 13581 13707 if (!error->transcoder[i].power_domain_on) 13582 13708 continue; ··· 13660 13786 13661 13787 for_each_intel_crtc(dev, crtc) { 13662 13788 struct intel_unpin_work *work; 13663 - unsigned long irqflags; 13664 13789 13665 - spin_lock_irqsave(&dev->event_lock, irqflags); 13790 + spin_lock_irq(&dev->event_lock); 13666 13791 13667 13792 work = crtc->unpin_work; 13668 13793 ··· 13671 13798 work->event = NULL; 13672 13799 } 13673 13800 13674 - spin_unlock_irqrestore(&dev->event_lock, irqflags); 13801 + spin_unlock_irq(&dev->event_lock); 13675 13802 } 13676 13803 }
+157 -39
drivers/gpu/drm/i915/intel_dp.c
··· 225 225 } 226 226 227 227 static uint32_t 228 - pack_aux(uint8_t *src, int src_bytes) 228 + pack_aux(const uint8_t *src, int src_bytes) 229 229 { 230 230 int i; 231 231 uint32_t v = 0; ··· 661 661 return index ? 0 : 100; 662 662 } 663 663 664 + static uint32_t skl_get_aux_clock_divider(struct intel_dp *intel_dp, int index) 665 + { 666 + /* 667 + * SKL doesn't need us to program the AUX clock divider (Hardware will 668 + * derive the clock from CDCLK automatically). We still implement the 669 + * get_aux_clock_divider vfunc to plug-in into the existing code. 670 + */ 671 + return index ? 0 : 1; 672 + } 673 + 664 674 static uint32_t i9xx_get_aux_send_ctl(struct intel_dp *intel_dp, 665 675 bool has_aux_irq, 666 676 int send_bytes, ··· 701 691 (aux_clock_divider << DP_AUX_CH_CTL_BIT_CLOCK_2X_SHIFT); 702 692 } 703 693 694 + static uint32_t skl_get_aux_send_ctl(struct intel_dp *intel_dp, 695 + bool has_aux_irq, 696 + int send_bytes, 697 + uint32_t unused) 698 + { 699 + return DP_AUX_CH_CTL_SEND_BUSY | 700 + DP_AUX_CH_CTL_DONE | 701 + (has_aux_irq ? DP_AUX_CH_CTL_INTERRUPT : 0) | 702 + DP_AUX_CH_CTL_TIME_OUT_ERROR | 703 + DP_AUX_CH_CTL_TIME_OUT_1600us | 704 + DP_AUX_CH_CTL_RECEIVE_ERROR | 705 + (send_bytes << DP_AUX_CH_CTL_MESSAGE_SIZE_SHIFT) | 706 + DP_AUX_CH_CTL_SYNC_PULSE_SKL(32); 707 + } 708 + 704 709 static int 705 710 intel_dp_aux_ch(struct intel_dp *intel_dp, 706 - uint8_t *send, int send_bytes, 711 + const uint8_t *send, int send_bytes, 707 712 uint8_t *recv, int recv_size) 708 713 { 709 714 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); ··· 950 925 BUG(); 951 926 } 952 927 953 - if (!HAS_DDI(dev)) 928 + /* 929 + * The AUX_CTL register is usually DP_CTL + 0x10. 930 + * 931 + * On Haswell and Broadwell though: 932 + * - Both port A DDI_BUF_CTL and DDI_AUX_CTL are on the CPU 933 + * - Port B/C/D AUX channels are on the PCH, DDI_BUF_CTL on the CPU 934 + * 935 + * Skylake moves AUX_CTL back next to DDI_BUF_CTL, on the CPU. 936 + */ 937 + if (!IS_HASWELL(dev) && !IS_BROADWELL(dev)) 954 938 intel_dp->aux_ch_ctl_reg = intel_dp->output_reg + 0x10; 955 939 956 940 intel_dp->aux.name = name; ··· 1853 1819 u32 tmp; 1854 1820 1855 1821 power_domain = intel_display_port_power_domain(encoder); 1856 - if (!intel_display_power_enabled(dev_priv, power_domain)) 1822 + if (!intel_display_power_is_enabled(dev_priv, power_domain)) 1857 1823 return false; 1858 1824 1859 1825 tmp = I915_READ(intel_dp->output_reg); ··· 2029 1995 POSTING_READ(ctl_reg); 2030 1996 } 2031 1997 2032 - static void intel_edp_psr_setup(struct intel_dp *intel_dp) 1998 + static void intel_edp_psr_setup_vsc(struct intel_dp *intel_dp) 2033 1999 { 2034 - struct drm_device *dev = intel_dp_to_dev(intel_dp); 2035 - struct drm_i915_private *dev_priv = dev->dev_private; 2036 2000 struct edp_vsc_psr psr_vsc; 2037 2001 2038 2002 /* Prepare VSC packet as per EDP 1.3 spec, Table 3.10 */ ··· 2040 2008 psr_vsc.sdp_header.HB2 = 0x2; 2041 2009 psr_vsc.sdp_header.HB3 = 0x8; 2042 2010 intel_edp_psr_write_vsc(intel_dp, &psr_vsc); 2043 - 2044 - /* Avoid continuous PSR exit by masking memup and hpd */ 2045 - I915_WRITE(EDP_PSR_DEBUG_CTL(dev), EDP_PSR_DEBUG_MASK_MEMUP | 2046 - EDP_PSR_DEBUG_MASK_HPD | EDP_PSR_DEBUG_MASK_LPSP); 2047 2011 } 2048 2012 2049 2013 static void intel_edp_psr_enable_sink(struct intel_dp *intel_dp) ··· 2049 2021 struct drm_i915_private *dev_priv = dev->dev_private; 2050 2022 uint32_t aux_clock_divider; 2051 2023 int precharge = 0x3; 2052 - int msg_size = 5; /* Header(4) + Message(1) */ 2053 2024 bool only_standby = false; 2025 + static const uint8_t aux_msg[] = { 2026 + [0] = DP_AUX_NATIVE_WRITE << 4, 2027 + [1] = DP_SET_POWER >> 8, 2028 + [2] = DP_SET_POWER & 0xff, 2029 + [3] = 1 - 1, 2030 + [4] = DP_SET_POWER_D0, 2031 + }; 2032 + int i; 2033 + 2034 + BUILD_BUG_ON(sizeof(aux_msg) > 20); 2054 2035 2055 2036 aux_clock_divider = intel_dp->get_aux_clock_divider(intel_dp, 0); 2056 2037 ··· 2075 2038 DP_PSR_ENABLE | DP_PSR_MAIN_LINK_ACTIVE); 2076 2039 2077 2040 /* Setup AUX registers */ 2078 - I915_WRITE(EDP_PSR_AUX_DATA1(dev), EDP_PSR_DPCD_COMMAND); 2079 - I915_WRITE(EDP_PSR_AUX_DATA2(dev), EDP_PSR_DPCD_NORMAL_OPERATION); 2041 + for (i = 0; i < sizeof(aux_msg); i += 4) 2042 + I915_WRITE(EDP_PSR_AUX_DATA1(dev) + i, 2043 + pack_aux(&aux_msg[i], sizeof(aux_msg) - i)); 2044 + 2080 2045 I915_WRITE(EDP_PSR_AUX_CTL(dev), 2081 2046 DP_AUX_CH_CTL_TIME_OUT_400us | 2082 - (msg_size << DP_AUX_CH_CTL_MESSAGE_SIZE_SHIFT) | 2047 + (sizeof(aux_msg) << DP_AUX_CH_CTL_MESSAGE_SIZE_SHIFT) | 2083 2048 (precharge << DP_AUX_CH_CTL_PRECHARGE_2US_SHIFT) | 2084 2049 (aux_clock_divider << DP_AUX_CH_CTL_BIT_CLOCK_2X_SHIFT)); 2085 2050 } ··· 2170 2131 WARN_ON(dev_priv->psr.active); 2171 2132 lockdep_assert_held(&dev_priv->psr.lock); 2172 2133 2173 - /* Enable PSR on the panel */ 2174 - intel_edp_psr_enable_sink(intel_dp); 2175 - 2176 - /* Enable PSR on the host */ 2134 + /* Enable/Re-enable PSR on the host */ 2177 2135 intel_edp_psr_enable_source(intel_dp); 2178 2136 2179 2137 dev_priv->psr.active = true; ··· 2194 2158 mutex_lock(&dev_priv->psr.lock); 2195 2159 if (dev_priv->psr.enabled) { 2196 2160 DRM_DEBUG_KMS("PSR already in use\n"); 2197 - mutex_unlock(&dev_priv->psr.lock); 2198 - return; 2161 + goto unlock; 2199 2162 } 2163 + 2164 + if (!intel_edp_psr_match_conditions(intel_dp)) 2165 + goto unlock; 2200 2166 2201 2167 dev_priv->psr.busy_frontbuffer_bits = 0; 2202 2168 2203 - /* Setup PSR once */ 2204 - intel_edp_psr_setup(intel_dp); 2169 + intel_edp_psr_setup_vsc(intel_dp); 2205 2170 2206 - if (intel_edp_psr_match_conditions(intel_dp)) 2207 - dev_priv->psr.enabled = intel_dp; 2171 + /* Avoid continuous PSR exit by masking memup and hpd */ 2172 + I915_WRITE(EDP_PSR_DEBUG_CTL(dev), EDP_PSR_DEBUG_MASK_MEMUP | 2173 + EDP_PSR_DEBUG_MASK_HPD | EDP_PSR_DEBUG_MASK_LPSP); 2174 + 2175 + /* Enable PSR on the panel */ 2176 + intel_edp_psr_enable_sink(intel_dp); 2177 + 2178 + dev_priv->psr.enabled = intel_dp; 2179 + unlock: 2208 2180 mutex_unlock(&dev_priv->psr.lock); 2209 2181 } 2210 2182 ··· 2252 2208 struct drm_i915_private *dev_priv = 2253 2209 container_of(work, typeof(*dev_priv), psr.work.work); 2254 2210 struct intel_dp *intel_dp = dev_priv->psr.enabled; 2211 + 2212 + /* We have to make sure PSR is ready for re-enable 2213 + * otherwise it keeps disabled until next full enable/disable cycle. 2214 + * PSR might take some time to get fully disabled 2215 + * and be ready for re-enable. 2216 + */ 2217 + if (wait_for((I915_READ(EDP_PSR_STATUS_CTL(dev_priv->dev)) & 2218 + EDP_PSR_STATUS_STATE_MASK) == 0, 50)) { 2219 + DRM_ERROR("Timed out waiting for PSR Idle for re-enable\n"); 2220 + return; 2221 + } 2255 2222 2256 2223 mutex_lock(&dev_priv->psr.lock); 2257 2224 intel_dp = dev_priv->psr.enabled; ··· 2735 2680 2736 2681 mutex_lock(&dev_priv->dpio_lock); 2737 2682 2683 + /* allow hardware to manage TX FIFO reset source */ 2684 + val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW11(ch)); 2685 + val &= ~DPIO_LANEDESKEW_STRAP_OVRD; 2686 + vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW11(ch), val); 2687 + 2688 + val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW11(ch)); 2689 + val &= ~DPIO_LANEDESKEW_STRAP_OVRD; 2690 + vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW11(ch), val); 2691 + 2738 2692 /* Deassert soft data lane reset*/ 2739 2693 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW1(ch)); 2740 2694 val |= CHV_PCS_REQ_SOFTRESET_EN; ··· 2900 2836 struct drm_device *dev = intel_dp_to_dev(intel_dp); 2901 2837 enum port port = dp_to_dig_port(intel_dp)->port; 2902 2838 2903 - if (IS_VALLEYVIEW(dev)) 2839 + if (INTEL_INFO(dev)->gen >= 9) 2840 + return DP_TRAIN_VOLTAGE_SWING_LEVEL_2; 2841 + else if (IS_VALLEYVIEW(dev)) 2904 2842 return DP_TRAIN_VOLTAGE_SWING_LEVEL_3; 2905 2843 else if (IS_GEN7(dev) && port == PORT_A) 2906 2844 return DP_TRAIN_VOLTAGE_SWING_LEVEL_2; ··· 2918 2852 struct drm_device *dev = intel_dp_to_dev(intel_dp); 2919 2853 enum port port = dp_to_dig_port(intel_dp)->port; 2920 2854 2921 - if (IS_HASWELL(dev) || IS_BROADWELL(dev)) { 2855 + if (INTEL_INFO(dev)->gen >= 9) { 2856 + switch (voltage_swing & DP_TRAIN_VOLTAGE_SWING_MASK) { 2857 + case DP_TRAIN_VOLTAGE_SWING_LEVEL_0: 2858 + return DP_TRAIN_PRE_EMPH_LEVEL_3; 2859 + case DP_TRAIN_VOLTAGE_SWING_LEVEL_1: 2860 + return DP_TRAIN_PRE_EMPH_LEVEL_2; 2861 + case DP_TRAIN_VOLTAGE_SWING_LEVEL_2: 2862 + return DP_TRAIN_PRE_EMPH_LEVEL_1; 2863 + default: 2864 + return DP_TRAIN_PRE_EMPH_LEVEL_0; 2865 + } 2866 + } else if (IS_HASWELL(dev) || IS_BROADWELL(dev)) { 2922 2867 switch (voltage_swing & DP_TRAIN_VOLTAGE_SWING_MASK) { 2923 2868 case DP_TRAIN_VOLTAGE_SWING_LEVEL_0: 2924 2869 return DP_TRAIN_PRE_EMPH_LEVEL_3; ··· 3165 3088 /* Clear calc init */ 3166 3089 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW10(ch)); 3167 3090 val &= ~(DPIO_PCS_SWING_CALC_TX0_TX2 | DPIO_PCS_SWING_CALC_TX1_TX3); 3091 + val &= ~(DPIO_PCS_TX1DEEMP_MASK | DPIO_PCS_TX2DEEMP_MASK); 3092 + val |= DPIO_PCS_TX1DEEMP_9P5 | DPIO_PCS_TX2DEEMP_9P5; 3168 3093 vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW10(ch), val); 3169 3094 3170 3095 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW10(ch)); 3171 3096 val &= ~(DPIO_PCS_SWING_CALC_TX0_TX2 | DPIO_PCS_SWING_CALC_TX1_TX3); 3097 + val &= ~(DPIO_PCS_TX1DEEMP_MASK | DPIO_PCS_TX2DEEMP_MASK); 3098 + val |= DPIO_PCS_TX1DEEMP_9P5 | DPIO_PCS_TX2DEEMP_9P5; 3172 3099 vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW10(ch), val); 3100 + 3101 + val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW9(ch)); 3102 + val &= ~(DPIO_PCS_TX1MARGIN_MASK | DPIO_PCS_TX2MARGIN_MASK); 3103 + val |= DPIO_PCS_TX1MARGIN_000 | DPIO_PCS_TX2MARGIN_000; 3104 + vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW9(ch), val); 3105 + 3106 + val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW9(ch)); 3107 + val &= ~(DPIO_PCS_TX1MARGIN_MASK | DPIO_PCS_TX2MARGIN_MASK); 3108 + val |= DPIO_PCS_TX1MARGIN_000 | DPIO_PCS_TX2MARGIN_000; 3109 + vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW9(ch), val); 3173 3110 3174 3111 /* Program swing deemph */ 3175 3112 for (i = 0; i < 4; i++) { ··· 3425 3334 uint32_t signal_levels, mask; 3426 3335 uint8_t train_set = intel_dp->train_set[0]; 3427 3336 3428 - if (IS_HASWELL(dev) || IS_BROADWELL(dev)) { 3337 + if (IS_HASWELL(dev) || IS_BROADWELL(dev) || INTEL_INFO(dev)->gen >= 9) { 3429 3338 signal_levels = intel_hsw_signal_levels(train_set); 3430 3339 mask = DDI_BUF_EMP_MASK; 3431 3340 } else if (IS_CHERRYVIEW(dev)) { ··· 3892 3801 struct drm_device *dev = intel_dig_port->base.base.dev; 3893 3802 struct intel_crtc *intel_crtc = 3894 3803 to_intel_crtc(intel_dig_port->base.base.crtc); 3895 - u8 buf[1]; 3804 + u8 buf; 3805 + int test_crc_count; 3806 + int attempts = 6; 3896 3807 3897 - if (drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_SINK_MISC, buf) < 0) 3808 + if (drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_SINK_MISC, &buf) < 0) 3898 3809 return -EIO; 3899 3810 3900 - if (!(buf[0] & DP_TEST_CRC_SUPPORTED)) 3811 + if (!(buf & DP_TEST_CRC_SUPPORTED)) 3901 3812 return -ENOTTY; 3902 3813 3903 - if (drm_dp_dpcd_writeb(&intel_dp->aux, DP_TEST_SINK, 3904 - DP_TEST_SINK_START) < 0) 3814 + if (drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_SINK, &buf) < 0) 3905 3815 return -EIO; 3906 3816 3907 - /* Wait 2 vblanks to be sure we will have the correct CRC value */ 3908 - intel_wait_for_vblank(dev, intel_crtc->pipe); 3909 - intel_wait_for_vblank(dev, intel_crtc->pipe); 3817 + if (drm_dp_dpcd_writeb(&intel_dp->aux, DP_TEST_SINK, 3818 + buf | DP_TEST_SINK_START) < 0) 3819 + return -EIO; 3820 + 3821 + if (drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_SINK_MISC, &buf) < 0) 3822 + return -EIO; 3823 + test_crc_count = buf & DP_TEST_COUNT_MASK; 3824 + 3825 + do { 3826 + if (drm_dp_dpcd_readb(&intel_dp->aux, 3827 + DP_TEST_SINK_MISC, &buf) < 0) 3828 + return -EIO; 3829 + intel_wait_for_vblank(dev, intel_crtc->pipe); 3830 + } while (--attempts && (buf & DP_TEST_COUNT_MASK) == test_crc_count); 3831 + 3832 + if (attempts == 0) { 3833 + DRM_ERROR("Panel is unable to calculate CRC after 6 vblanks\n"); 3834 + return -EIO; 3835 + } 3910 3836 3911 3837 if (drm_dp_dpcd_read(&intel_dp->aux, DP_TEST_CRC_R_CR, crc, 6) < 0) 3912 3838 return -EIO; 3913 3839 3914 - drm_dp_dpcd_writeb(&intel_dp->aux, DP_TEST_SINK, 0); 3840 + if (drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_SINK, &buf) < 0) 3841 + return -EIO; 3842 + if (drm_dp_dpcd_writeb(&intel_dp->aux, DP_TEST_SINK, 3843 + buf & ~DP_TEST_SINK_START) < 0) 3844 + return -EIO; 3845 + 3915 3846 return 0; 3916 3847 } 3917 3848 ··· 5170 5057 intel_dp->pps_pipe = INVALID_PIPE; 5171 5058 5172 5059 /* intel_dp vfuncs */ 5173 - if (IS_VALLEYVIEW(dev)) 5060 + if (INTEL_INFO(dev)->gen >= 9) 5061 + intel_dp->get_aux_clock_divider = skl_get_aux_clock_divider; 5062 + else if (IS_VALLEYVIEW(dev)) 5174 5063 intel_dp->get_aux_clock_divider = vlv_get_aux_clock_divider; 5175 5064 else if (IS_HASWELL(dev) || IS_BROADWELL(dev)) 5176 5065 intel_dp->get_aux_clock_divider = hsw_get_aux_clock_divider; ··· 5181 5066 else 5182 5067 intel_dp->get_aux_clock_divider = i9xx_get_aux_clock_divider; 5183 5068 5184 - intel_dp->get_aux_send_ctl = i9xx_get_aux_send_ctl; 5069 + if (INTEL_INFO(dev)->gen >= 9) 5070 + intel_dp->get_aux_send_ctl = skl_get_aux_send_ctl; 5071 + else 5072 + intel_dp->get_aux_send_ctl = i9xx_get_aux_send_ctl; 5185 5073 5186 5074 /* Preserve the current hw state. */ 5187 5075 intel_dp->DP = I915_READ(intel_dp->output_reg);
+61 -29
drivers/gpu/drm/i915/intel_drv.h
··· 34 34 #include <drm/drm_crtc_helper.h> 35 35 #include <drm/drm_fb_helper.h> 36 36 #include <drm/drm_dp_mst_helper.h> 37 + #include <drm/drm_rect.h> 37 38 38 39 #define DIV_ROUND_CLOSEST_ULL(ll, d) \ 39 40 ({ unsigned long long _tmp = (ll)+(d)/2; do_div(_tmp, d); _tmp; }) ··· 240 239 int m; 241 240 int p; 242 241 } intel_clock_t; 242 + 243 + struct intel_plane_state { 244 + struct drm_crtc *crtc; 245 + struct drm_framebuffer *fb; 246 + struct drm_rect src; 247 + struct drm_rect dst; 248 + struct drm_rect clip; 249 + struct drm_rect orig_src; 250 + struct drm_rect orig_dst; 251 + bool visible; 252 + }; 243 253 244 254 struct intel_plane_config { 245 255 bool tiled; ··· 746 734 return container_of(intel_hdmi, struct intel_digital_port, hdmi); 747 735 } 748 736 737 + /* 738 + * Returns the number of planes for this pipe, ie the number of sprites + 1 739 + * (primary plane). This doesn't count the cursor plane then. 740 + */ 741 + static inline unsigned int intel_num_planes(struct intel_crtc *crtc) 742 + { 743 + return INTEL_INFO(crtc->base.dev)->num_sprites[crtc->pipe] + 1; 744 + } 749 745 750 746 /* i915_irq.c */ 751 747 bool intel_set_cpu_fifo_underrun_reporting(struct drm_device *dev, ··· 767 747 void gen6_disable_pm_irq(struct drm_i915_private *dev_priv, uint32_t mask); 768 748 void gen8_enable_pm_irq(struct drm_i915_private *dev_priv, uint32_t mask); 769 749 void gen8_disable_pm_irq(struct drm_i915_private *dev_priv, uint32_t mask); 770 - void intel_runtime_pm_disable_interrupts(struct drm_device *dev); 771 - void intel_runtime_pm_restore_interrupts(struct drm_device *dev); 750 + void intel_runtime_pm_disable_interrupts(struct drm_i915_private *dev_priv); 751 + void intel_runtime_pm_enable_interrupts(struct drm_i915_private *dev_priv); 772 752 static inline bool intel_irqs_enabled(struct drm_i915_private *dev_priv) 773 753 { 774 754 /* 775 755 * We only use drm_irq_uninstall() at unload and VT switch, so 776 756 * this is the only thing we need to check. 777 757 */ 778 - return !dev_priv->pm._irqs_disabled; 758 + return dev_priv->pm.irqs_enabled; 779 759 } 780 760 781 761 int intel_get_crtc_scanline(struct intel_crtc *crtc); ··· 812 792 struct intel_crtc_config *pipe_config); 813 793 void intel_ddi_set_vc_payload_alloc(struct drm_crtc *crtc, bool state); 814 794 815 - /* intel_display.c */ 816 - const char *intel_output_name(int output); 817 - bool intel_has_pending_fb_unpin(struct drm_device *dev); 818 - int intel_pch_rawclk(struct drm_device *dev); 819 - void intel_mark_busy(struct drm_device *dev); 795 + /* intel_frontbuffer.c */ 820 796 void intel_fb_obj_invalidate(struct drm_i915_gem_object *obj, 821 797 struct intel_engine_cs *ring); 822 798 void intel_frontbuffer_flip_prepare(struct drm_device *dev, ··· 822 806 void intel_frontbuffer_flush(struct drm_device *dev, 823 807 unsigned frontbuffer_bits); 824 808 /** 825 - * intel_frontbuffer_flip - prepare frontbuffer flip 809 + * intel_frontbuffer_flip - synchronous frontbuffer flip 826 810 * @dev: DRM device 827 811 * @frontbuffer_bits: frontbuffer plane tracking bits 828 812 * ··· 840 824 } 841 825 842 826 void intel_fb_obj_flush(struct drm_i915_gem_object *obj, bool retire); 827 + 828 + 829 + /* intel_display.c */ 830 + const char *intel_output_name(int output); 831 + bool intel_has_pending_fb_unpin(struct drm_device *dev); 832 + int intel_pch_rawclk(struct drm_device *dev); 833 + void intel_mark_busy(struct drm_device *dev); 843 834 void intel_mark_idle(struct drm_device *dev); 844 835 void intel_crtc_restore_mode(struct drm_crtc *crtc); 845 836 void intel_crtc_control(struct drm_crtc *crtc, bool enable); ··· 867 844 struct drm_file *file_priv); 868 845 enum transcoder intel_pipe_to_cpu_transcoder(struct drm_i915_private *dev_priv, 869 846 enum pipe pipe); 870 - void intel_wait_for_vblank(struct drm_device *dev, int pipe); 847 + static inline void 848 + intel_wait_for_vblank(struct drm_device *dev, int pipe) 849 + { 850 + drm_wait_one_vblank(dev, pipe); 851 + } 871 852 int ironlake_get_lanes_required(int target_clock, int link_bw, int bpp); 872 853 void vlv_wait_port_ready(struct drm_i915_private *dev_priv, 873 854 struct intel_digital_port *dport); ··· 905 878 void intel_put_shared_dpll(struct intel_crtc *crtc); 906 879 907 880 /* modesetting asserts */ 881 + void assert_panel_unlocked(struct drm_i915_private *dev_priv, 882 + enum pipe pipe); 908 883 void assert_pll(struct drm_i915_private *dev_priv, 909 884 enum pipe pipe, bool state); 910 885 #define assert_pll_enabled(d, p) assert_pll(d, p, true) ··· 937 908 bool intel_crtc_active(struct drm_crtc *crtc); 938 909 void hsw_enable_ips(struct intel_crtc *crtc); 939 910 void hsw_disable_ips(struct intel_crtc *crtc); 940 - void intel_display_set_init_power(struct drm_i915_private *dev, bool enable); 941 911 enum intel_display_power_domain 942 912 intel_display_port_power_domain(struct intel_encoder *intel_encoder); 943 913 void intel_mode_from_pipe_config(struct drm_display_mode *mode, ··· 1083 1055 struct drm_display_mode *fixed_mode, 1084 1056 struct drm_connector *connector); 1085 1057 1058 + /* intel_runtime_pm.c */ 1059 + int intel_power_domains_init(struct drm_i915_private *); 1060 + void intel_power_domains_fini(struct drm_i915_private *); 1061 + void intel_power_domains_init_hw(struct drm_i915_private *dev_priv); 1062 + void intel_runtime_pm_enable(struct drm_i915_private *dev_priv); 1063 + 1064 + bool intel_display_power_is_enabled(struct drm_i915_private *dev_priv, 1065 + enum intel_display_power_domain domain); 1066 + bool __intel_display_power_is_enabled(struct drm_i915_private *dev_priv, 1067 + enum intel_display_power_domain domain); 1068 + void intel_display_power_get(struct drm_i915_private *dev_priv, 1069 + enum intel_display_power_domain domain); 1070 + void intel_display_power_put(struct drm_i915_private *dev_priv, 1071 + enum intel_display_power_domain domain); 1072 + void intel_aux_display_runtime_get(struct drm_i915_private *dev_priv); 1073 + void intel_aux_display_runtime_put(struct drm_i915_private *dev_priv); 1074 + void intel_runtime_pm_get(struct drm_i915_private *dev_priv); 1075 + void intel_runtime_pm_get_noresume(struct drm_i915_private *dev_priv); 1076 + void intel_runtime_pm_put(struct drm_i915_private *dev_priv); 1077 + 1078 + void intel_display_set_init_power(struct drm_i915_private *dev, bool enable); 1079 + 1086 1080 /* intel_pm.c */ 1087 1081 void intel_init_clock_gating(struct drm_device *dev); 1088 1082 void intel_suspend_hw(struct drm_device *dev); ··· 1122 1072 void intel_update_fbc(struct drm_device *dev); 1123 1073 void intel_gpu_ips_init(struct drm_i915_private *dev_priv); 1124 1074 void intel_gpu_ips_teardown(void); 1125 - int intel_power_domains_init(struct drm_i915_private *); 1126 - void intel_power_domains_remove(struct drm_i915_private *); 1127 - bool intel_display_power_enabled(struct drm_i915_private *dev_priv, 1128 - enum intel_display_power_domain domain); 1129 - bool intel_display_power_enabled_unlocked(struct drm_i915_private *dev_priv, 1130 - enum intel_display_power_domain domain); 1131 - void intel_display_power_get(struct drm_i915_private *dev_priv, 1132 - enum intel_display_power_domain domain); 1133 - void intel_display_power_put(struct drm_i915_private *dev_priv, 1134 - enum intel_display_power_domain domain); 1135 - void intel_power_domains_init_hw(struct drm_i915_private *dev_priv); 1136 1075 void intel_init_gt_powersave(struct drm_device *dev); 1137 1076 void intel_cleanup_gt_powersave(struct drm_device *dev); 1138 1077 void intel_enable_gt_powersave(struct drm_device *dev); ··· 1132 1093 void gen6_update_ring_freq(struct drm_device *dev); 1133 1094 void gen6_rps_idle(struct drm_i915_private *dev_priv); 1134 1095 void gen6_rps_boost(struct drm_i915_private *dev_priv); 1135 - void intel_aux_display_runtime_get(struct drm_i915_private *dev_priv); 1136 - void intel_aux_display_runtime_put(struct drm_i915_private *dev_priv); 1137 - void intel_runtime_pm_get(struct drm_i915_private *dev_priv); 1138 - void intel_runtime_pm_get_noresume(struct drm_i915_private *dev_priv); 1139 - void intel_runtime_pm_put(struct drm_i915_private *dev_priv); 1140 - void intel_init_runtime_pm(struct drm_i915_private *dev_priv); 1141 - void intel_fini_runtime_pm(struct drm_i915_private *dev_priv); 1142 1096 void ilk_wm_get_hw_state(struct drm_device *dev); 1143 1097 1144 1098
+1 -1
drivers/gpu/drm/i915/intel_dsi.c
··· 344 344 DRM_DEBUG_KMS("\n"); 345 345 346 346 power_domain = intel_display_port_power_domain(encoder); 347 - if (!intel_display_power_enabled(dev_priv, power_domain)) 347 + if (!intel_display_power_is_enabled(dev_priv, power_domain)) 348 348 return false; 349 349 350 350 /* XXX: this only works for one DSI output */
+279
drivers/gpu/drm/i915/intel_frontbuffer.c
··· 1 + /* 2 + * Copyright © 2014 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 20 + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 21 + * DEALINGS IN THE SOFTWARE. 22 + * 23 + * Authors: 24 + * Daniel Vetter <daniel.vetter@ffwll.ch> 25 + */ 26 + 27 + /** 28 + * DOC: frontbuffer tracking 29 + * 30 + * Many features require us to track changes to the currently active 31 + * frontbuffer, especially rendering targeted at the frontbuffer. 32 + * 33 + * To be able to do so GEM tracks frontbuffers using a bitmask for all possible 34 + * frontbuffer slots through i915_gem_track_fb(). The function in this file are 35 + * then called when the contents of the frontbuffer are invalidated, when 36 + * frontbuffer rendering has stopped again to flush out all the changes and when 37 + * the frontbuffer is exchanged with a flip. Subsystems interested in 38 + * frontbuffer changes (e.g. PSR, FBC, DRRS) should directly put their callbacks 39 + * into the relevant places and filter for the frontbuffer slots that they are 40 + * interested int. 41 + * 42 + * On a high level there are two types of powersaving features. The first one 43 + * work like a special cache (FBC and PSR) and are interested when they should 44 + * stop caching and when to restart caching. This is done by placing callbacks 45 + * into the invalidate and the flush functions: At invalidate the caching must 46 + * be stopped and at flush time it can be restarted. And maybe they need to know 47 + * when the frontbuffer changes (e.g. when the hw doesn't initiate an invalidate 48 + * and flush on its own) which can be achieved with placing callbacks into the 49 + * flip functions. 50 + * 51 + * The other type of display power saving feature only cares about busyness 52 + * (e.g. DRRS). In that case all three (invalidate, flush and flip) indicate 53 + * busyness. There is no direct way to detect idleness. Instead an idle timer 54 + * work delayed work should be started from the flush and flip functions and 55 + * cancelled as soon as busyness is detected. 56 + * 57 + * Note that there's also an older frontbuffer activity tracking scheme which 58 + * just tracks general activity. This is done by the various mark_busy and 59 + * mark_idle functions. For display power management features using these 60 + * functions is deprecated and should be avoided. 61 + */ 62 + 63 + #include <drm/drmP.h> 64 + 65 + #include "intel_drv.h" 66 + #include "i915_drv.h" 67 + 68 + static void intel_increase_pllclock(struct drm_device *dev, 69 + enum pipe pipe) 70 + { 71 + struct drm_i915_private *dev_priv = dev->dev_private; 72 + int dpll_reg = DPLL(pipe); 73 + int dpll; 74 + 75 + if (!HAS_GMCH_DISPLAY(dev)) 76 + return; 77 + 78 + if (!dev_priv->lvds_downclock_avail) 79 + return; 80 + 81 + dpll = I915_READ(dpll_reg); 82 + if (!HAS_PIPE_CXSR(dev) && (dpll & DISPLAY_RATE_SELECT_FPA1)) { 83 + DRM_DEBUG_DRIVER("upclocking LVDS\n"); 84 + 85 + assert_panel_unlocked(dev_priv, pipe); 86 + 87 + dpll &= ~DISPLAY_RATE_SELECT_FPA1; 88 + I915_WRITE(dpll_reg, dpll); 89 + intel_wait_for_vblank(dev, pipe); 90 + 91 + dpll = I915_READ(dpll_reg); 92 + if (dpll & DISPLAY_RATE_SELECT_FPA1) 93 + DRM_DEBUG_DRIVER("failed to upclock LVDS!\n"); 94 + } 95 + } 96 + 97 + /** 98 + * intel_mark_fb_busy - mark given planes as busy 99 + * @dev: DRM device 100 + * @frontbuffer_bits: bits for the affected planes 101 + * @ring: optional ring for asynchronous commands 102 + * 103 + * This function gets called every time the screen contents change. It can be 104 + * used to keep e.g. the update rate at the nominal refresh rate with DRRS. 105 + */ 106 + static void intel_mark_fb_busy(struct drm_device *dev, 107 + unsigned frontbuffer_bits, 108 + struct intel_engine_cs *ring) 109 + { 110 + struct drm_i915_private *dev_priv = dev->dev_private; 111 + enum pipe pipe; 112 + 113 + if (!i915.powersave) 114 + return; 115 + 116 + for_each_pipe(dev_priv, pipe) { 117 + if (!(frontbuffer_bits & INTEL_FRONTBUFFER_ALL_MASK(pipe))) 118 + continue; 119 + 120 + intel_increase_pllclock(dev, pipe); 121 + if (ring && intel_fbc_enabled(dev)) 122 + ring->fbc_dirty = true; 123 + } 124 + } 125 + 126 + /** 127 + * intel_fb_obj_invalidate - invalidate frontbuffer object 128 + * @obj: GEM object to invalidate 129 + * @ring: set for asynchronous rendering 130 + * 131 + * This function gets called every time rendering on the given object starts and 132 + * frontbuffer caching (fbc, low refresh rate for DRRS, panel self refresh) must 133 + * be invalidated. If @ring is non-NULL any subsequent invalidation will be delayed 134 + * until the rendering completes or a flip on this frontbuffer plane is 135 + * scheduled. 136 + */ 137 + void intel_fb_obj_invalidate(struct drm_i915_gem_object *obj, 138 + struct intel_engine_cs *ring) 139 + { 140 + struct drm_device *dev = obj->base.dev; 141 + struct drm_i915_private *dev_priv = dev->dev_private; 142 + 143 + WARN_ON(!mutex_is_locked(&dev->struct_mutex)); 144 + 145 + if (!obj->frontbuffer_bits) 146 + return; 147 + 148 + if (ring) { 149 + mutex_lock(&dev_priv->fb_tracking.lock); 150 + dev_priv->fb_tracking.busy_bits 151 + |= obj->frontbuffer_bits; 152 + dev_priv->fb_tracking.flip_bits 153 + &= ~obj->frontbuffer_bits; 154 + mutex_unlock(&dev_priv->fb_tracking.lock); 155 + } 156 + 157 + intel_mark_fb_busy(dev, obj->frontbuffer_bits, ring); 158 + 159 + intel_edp_psr_invalidate(dev, obj->frontbuffer_bits); 160 + } 161 + 162 + /** 163 + * intel_frontbuffer_flush - flush frontbuffer 164 + * @dev: DRM device 165 + * @frontbuffer_bits: frontbuffer plane tracking bits 166 + * 167 + * This function gets called every time rendering on the given planes has 168 + * completed and frontbuffer caching can be started again. Flushes will get 169 + * delayed if they're blocked by some outstanding asynchronous rendering. 170 + * 171 + * Can be called without any locks held. 172 + */ 173 + void intel_frontbuffer_flush(struct drm_device *dev, 174 + unsigned frontbuffer_bits) 175 + { 176 + struct drm_i915_private *dev_priv = dev->dev_private; 177 + 178 + /* Delay flushing when rings are still busy.*/ 179 + mutex_lock(&dev_priv->fb_tracking.lock); 180 + frontbuffer_bits &= ~dev_priv->fb_tracking.busy_bits; 181 + mutex_unlock(&dev_priv->fb_tracking.lock); 182 + 183 + intel_mark_fb_busy(dev, frontbuffer_bits, NULL); 184 + 185 + intel_edp_psr_flush(dev, frontbuffer_bits); 186 + 187 + /* 188 + * FIXME: Unconditional fbc flushing here is a rather gross hack and 189 + * needs to be reworked into a proper frontbuffer tracking scheme like 190 + * psr employs. 191 + */ 192 + if (dev_priv->fbc.need_sw_cache_clean) { 193 + dev_priv->fbc.need_sw_cache_clean = false; 194 + bdw_fbc_sw_flush(dev, FBC_REND_CACHE_CLEAN); 195 + } 196 + } 197 + 198 + /** 199 + * intel_fb_obj_flush - flush frontbuffer object 200 + * @obj: GEM object to flush 201 + * @retire: set when retiring asynchronous rendering 202 + * 203 + * This function gets called every time rendering on the given object has 204 + * completed and frontbuffer caching can be started again. If @retire is true 205 + * then any delayed flushes will be unblocked. 206 + */ 207 + void intel_fb_obj_flush(struct drm_i915_gem_object *obj, 208 + bool retire) 209 + { 210 + struct drm_device *dev = obj->base.dev; 211 + struct drm_i915_private *dev_priv = dev->dev_private; 212 + unsigned frontbuffer_bits; 213 + 214 + WARN_ON(!mutex_is_locked(&dev->struct_mutex)); 215 + 216 + if (!obj->frontbuffer_bits) 217 + return; 218 + 219 + frontbuffer_bits = obj->frontbuffer_bits; 220 + 221 + if (retire) { 222 + mutex_lock(&dev_priv->fb_tracking.lock); 223 + /* Filter out new bits since rendering started. */ 224 + frontbuffer_bits &= dev_priv->fb_tracking.busy_bits; 225 + 226 + dev_priv->fb_tracking.busy_bits &= ~frontbuffer_bits; 227 + mutex_unlock(&dev_priv->fb_tracking.lock); 228 + } 229 + 230 + intel_frontbuffer_flush(dev, frontbuffer_bits); 231 + } 232 + 233 + /** 234 + * intel_frontbuffer_flip_prepare - prepare asynchronous frontbuffer flip 235 + * @dev: DRM device 236 + * @frontbuffer_bits: frontbuffer plane tracking bits 237 + * 238 + * This function gets called after scheduling a flip on @obj. The actual 239 + * frontbuffer flushing will be delayed until completion is signalled with 240 + * intel_frontbuffer_flip_complete. If an invalidate happens in between this 241 + * flush will be cancelled. 242 + * 243 + * Can be called without any locks held. 244 + */ 245 + void intel_frontbuffer_flip_prepare(struct drm_device *dev, 246 + unsigned frontbuffer_bits) 247 + { 248 + struct drm_i915_private *dev_priv = dev->dev_private; 249 + 250 + mutex_lock(&dev_priv->fb_tracking.lock); 251 + dev_priv->fb_tracking.flip_bits |= frontbuffer_bits; 252 + /* Remove stale busy bits due to the old buffer. */ 253 + dev_priv->fb_tracking.busy_bits &= ~frontbuffer_bits; 254 + mutex_unlock(&dev_priv->fb_tracking.lock); 255 + } 256 + 257 + /** 258 + * intel_frontbuffer_flip_complete - complete asynchronous frontbuffer flip 259 + * @dev: DRM device 260 + * @frontbuffer_bits: frontbuffer plane tracking bits 261 + * 262 + * This function gets called after the flip has been latched and will complete 263 + * on the next vblank. It will execute the flush if it hasn't been cancelled yet. 264 + * 265 + * Can be called without any locks held. 266 + */ 267 + void intel_frontbuffer_flip_complete(struct drm_device *dev, 268 + unsigned frontbuffer_bits) 269 + { 270 + struct drm_i915_private *dev_priv = dev->dev_private; 271 + 272 + mutex_lock(&dev_priv->fb_tracking.lock); 273 + /* Mask any cancelled flips. */ 274 + frontbuffer_bits &= dev_priv->fb_tracking.flip_bits; 275 + dev_priv->fb_tracking.flip_bits &= ~frontbuffer_bits; 276 + mutex_unlock(&dev_priv->fb_tracking.lock); 277 + 278 + intel_frontbuffer_flush(dev, frontbuffer_bits); 279 + }
+24 -1
drivers/gpu/drm/i915/intel_hdmi.c
··· 690 690 u32 tmp; 691 691 692 692 power_domain = intel_display_port_power_domain(encoder); 693 - if (!intel_display_power_enabled(dev_priv, power_domain)) 693 + if (!intel_display_power_is_enabled(dev_priv, power_domain)) 694 694 return false; 695 695 696 696 tmp = I915_READ(intel_hdmi->hdmi_reg); ··· 1405 1405 1406 1406 mutex_lock(&dev_priv->dpio_lock); 1407 1407 1408 + /* allow hardware to manage TX FIFO reset source */ 1409 + val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW11(ch)); 1410 + val &= ~DPIO_LANEDESKEW_STRAP_OVRD; 1411 + vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW11(ch), val); 1412 + 1413 + val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW11(ch)); 1414 + val &= ~DPIO_LANEDESKEW_STRAP_OVRD; 1415 + vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW11(ch), val); 1416 + 1408 1417 /* Deassert soft data lane reset*/ 1409 1418 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW1(ch)); 1410 1419 val |= CHV_PCS_REQ_SOFTRESET_EN; ··· 1450 1441 /* Clear calc init */ 1451 1442 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW10(ch)); 1452 1443 val &= ~(DPIO_PCS_SWING_CALC_TX0_TX2 | DPIO_PCS_SWING_CALC_TX1_TX3); 1444 + val &= ~(DPIO_PCS_TX1DEEMP_MASK | DPIO_PCS_TX2DEEMP_MASK); 1445 + val |= DPIO_PCS_TX1DEEMP_9P5 | DPIO_PCS_TX2DEEMP_9P5; 1453 1446 vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW10(ch), val); 1454 1447 1455 1448 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW10(ch)); 1456 1449 val &= ~(DPIO_PCS_SWING_CALC_TX0_TX2 | DPIO_PCS_SWING_CALC_TX1_TX3); 1450 + val &= ~(DPIO_PCS_TX1DEEMP_MASK | DPIO_PCS_TX2DEEMP_MASK); 1451 + val |= DPIO_PCS_TX1DEEMP_9P5 | DPIO_PCS_TX2DEEMP_9P5; 1457 1452 vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW10(ch), val); 1453 + 1454 + val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW9(ch)); 1455 + val &= ~(DPIO_PCS_TX1MARGIN_MASK | DPIO_PCS_TX2MARGIN_MASK); 1456 + val |= DPIO_PCS_TX1MARGIN_000 | DPIO_PCS_TX2MARGIN_000; 1457 + vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW9(ch), val); 1458 + 1459 + val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW9(ch)); 1460 + val &= ~(DPIO_PCS_TX1MARGIN_MASK | DPIO_PCS_TX2MARGIN_MASK); 1461 + val |= DPIO_PCS_TX1MARGIN_000 | DPIO_PCS_TX2MARGIN_000; 1462 + vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW9(ch), val); 1458 1463 1459 1464 /* FIXME: Program the support xxx V-dB */ 1460 1465 /* Use 800mV-0dB */
+1 -1
drivers/gpu/drm/i915/intel_lrc.c
··· 1063 1063 struct drm_i915_private *dev_priv = dev->dev_private; 1064 1064 unsigned long flags; 1065 1065 1066 - if (!dev->irq_enabled) 1066 + if (WARN_ON(!intel_irqs_enabled(dev_priv))) 1067 1067 return false; 1068 1068 1069 1069 spin_lock_irqsave(&dev_priv->irq_lock, flags);
+1 -1
drivers/gpu/drm/i915/intel_lvds.c
··· 76 76 u32 tmp; 77 77 78 78 power_domain = intel_display_port_power_domain(encoder); 79 - if (!intel_display_power_enabled(dev_priv, power_domain)) 79 + if (!intel_display_power_is_enabled(dev_priv, power_domain)) 80 80 return false; 81 81 82 82 tmp = I915_READ(lvds_encoder->reg);
+13 -19
drivers/gpu/drm/i915/intel_panel.c
··· 537 537 struct drm_device *dev = connector->base.dev; 538 538 struct drm_i915_private *dev_priv = dev->dev_private; 539 539 u32 val; 540 - unsigned long flags; 541 540 542 - spin_lock_irqsave(&dev_priv->backlight_lock, flags); 541 + mutex_lock(&dev_priv->backlight_lock); 543 542 544 543 val = dev_priv->display.get_backlight(connector); 545 544 val = intel_panel_compute_brightness(connector, val); 546 545 547 - spin_unlock_irqrestore(&dev_priv->backlight_lock, flags); 546 + mutex_unlock(&dev_priv->backlight_lock); 548 547 549 548 DRM_DEBUG_DRIVER("get backlight PWM = %d\n", val); 550 549 return val; ··· 627 628 struct intel_panel *panel = &connector->panel; 628 629 enum pipe pipe = intel_get_pipe_from_connector(connector); 629 630 u32 hw_level; 630 - unsigned long flags; 631 631 632 632 if (!panel->backlight.present || pipe == INVALID_PIPE) 633 633 return; 634 634 635 - spin_lock_irqsave(&dev_priv->backlight_lock, flags); 635 + mutex_lock(&dev_priv->backlight_lock); 636 636 637 637 WARN_ON(panel->backlight.max == 0); 638 638 ··· 641 643 if (panel->backlight.enabled) 642 644 intel_panel_actually_set_backlight(connector, hw_level); 643 645 644 - spin_unlock_irqrestore(&dev_priv->backlight_lock, flags); 646 + mutex_unlock(&dev_priv->backlight_lock); 645 647 } 646 648 647 649 /* set backlight brightness to level in range [0..max], assuming hw min is ··· 655 657 struct intel_panel *panel = &connector->panel; 656 658 enum pipe pipe = intel_get_pipe_from_connector(connector); 657 659 u32 hw_level; 658 - unsigned long flags; 659 660 660 661 if (!panel->backlight.present || pipe == INVALID_PIPE) 661 662 return; 662 663 663 - spin_lock_irqsave(&dev_priv->backlight_lock, flags); 664 + mutex_lock(&dev_priv->backlight_lock); 664 665 665 666 WARN_ON(panel->backlight.max == 0); 666 667 ··· 675 678 if (panel->backlight.enabled) 676 679 intel_panel_actually_set_backlight(connector, hw_level); 677 680 678 - spin_unlock_irqrestore(&dev_priv->backlight_lock, flags); 681 + mutex_unlock(&dev_priv->backlight_lock); 679 682 } 680 683 681 684 static void pch_disable_backlight(struct intel_connector *connector) ··· 729 732 struct drm_i915_private *dev_priv = dev->dev_private; 730 733 struct intel_panel *panel = &connector->panel; 731 734 enum pipe pipe = intel_get_pipe_from_connector(connector); 732 - unsigned long flags; 733 735 734 736 if (!panel->backlight.present || pipe == INVALID_PIPE) 735 737 return; ··· 744 748 return; 745 749 } 746 750 747 - spin_lock_irqsave(&dev_priv->backlight_lock, flags); 751 + mutex_lock(&dev_priv->backlight_lock); 748 752 749 753 if (panel->backlight.device) 750 754 panel->backlight.device->props.power = FB_BLANK_POWERDOWN; 751 755 panel->backlight.enabled = false; 752 756 dev_priv->display.disable_backlight(connector); 753 757 754 - spin_unlock_irqrestore(&dev_priv->backlight_lock, flags); 758 + mutex_unlock(&dev_priv->backlight_lock); 755 759 } 756 760 757 761 static void bdw_enable_backlight(struct intel_connector *connector) ··· 932 936 struct drm_i915_private *dev_priv = dev->dev_private; 933 937 struct intel_panel *panel = &connector->panel; 934 938 enum pipe pipe = intel_get_pipe_from_connector(connector); 935 - unsigned long flags; 936 939 937 940 if (!panel->backlight.present || pipe == INVALID_PIPE) 938 941 return; 939 942 940 943 DRM_DEBUG_KMS("pipe %c\n", pipe_name(pipe)); 941 944 942 - spin_lock_irqsave(&dev_priv->backlight_lock, flags); 945 + mutex_lock(&dev_priv->backlight_lock); 943 946 944 947 WARN_ON(panel->backlight.max == 0); 945 948 ··· 956 961 if (panel->backlight.device) 957 962 panel->backlight.device->props.power = FB_BLANK_UNBLANK; 958 963 959 - spin_unlock_irqrestore(&dev_priv->backlight_lock, flags); 964 + mutex_unlock(&dev_priv->backlight_lock); 960 965 } 961 966 962 967 #if IS_ENABLED(CONFIG_BACKLIGHT_CLASS_DEVICE) ··· 1261 1266 struct drm_i915_private *dev_priv = dev->dev_private; 1262 1267 struct intel_connector *intel_connector = to_intel_connector(connector); 1263 1268 struct intel_panel *panel = &intel_connector->panel; 1264 - unsigned long flags; 1265 1269 int ret; 1266 1270 1267 1271 if (!dev_priv->vbt.backlight.present) { ··· 1273 1279 } 1274 1280 1275 1281 /* set level and max in panel struct */ 1276 - spin_lock_irqsave(&dev_priv->backlight_lock, flags); 1282 + mutex_lock(&dev_priv->backlight_lock); 1277 1283 ret = dev_priv->display.setup_backlight(intel_connector); 1278 - spin_unlock_irqrestore(&dev_priv->backlight_lock, flags); 1284 + mutex_unlock(&dev_priv->backlight_lock); 1279 1285 1280 1286 if (ret) { 1281 1287 DRM_DEBUG_KMS("failed to setup backlight for connector %s\n", ··· 1310 1316 { 1311 1317 struct drm_i915_private *dev_priv = dev->dev_private; 1312 1318 1313 - if (IS_BROADWELL(dev)) { 1319 + if (IS_BROADWELL(dev) || (INTEL_INFO(dev)->gen >= 9)) { 1314 1320 dev_priv->display.setup_backlight = bdw_setup_backlight; 1315 1321 dev_priv->display.enable_backlight = bdw_enable_backlight; 1316 1322 dev_priv->display.disable_backlight = pch_disable_backlight;
+69 -1180
drivers/gpu/drm/i915/intel_pm.c
··· 30 30 #include "intel_drv.h" 31 31 #include "../../../platform/x86/intel_ips.h" 32 32 #include <linux/module.h> 33 - #include <linux/vgaarb.h> 34 - #include <drm/i915_powerwell.h> 35 - #include <linux/pm_runtime.h> 36 33 37 34 /** 38 35 * RC6 is a special power stage which allows the GPU to enter an very ··· 63 66 * i915.i915_enable_fbc parameter 64 67 */ 65 68 69 + static void gen9_init_clock_gating(struct drm_device *dev) 70 + { 71 + struct drm_i915_private *dev_priv = dev->dev_private; 72 + 73 + /* 74 + * WaDisableSDEUnitClockGating:skl 75 + * This seems to be a pre-production w/a. 76 + */ 77 + I915_WRITE(GEN8_UCGCTL6, I915_READ(GEN8_UCGCTL6) | 78 + GEN8_SDEUNIT_CLOCK_GATE_DISABLE); 79 + 80 + /* 81 + * WaDisableDgMirrorFixInHalfSliceChicken5:skl 82 + * This is a pre-production w/a. 83 + */ 84 + I915_WRITE(GEN9_HALF_SLICE_CHICKEN5, 85 + I915_READ(GEN9_HALF_SLICE_CHICKEN5) & 86 + ~GEN9_DG_MIRROR_FIX_ENABLE); 87 + 88 + /* Wa4x4STCOptimizationDisable:skl */ 89 + I915_WRITE(CACHE_MODE_1, 90 + _MASKED_BIT_ENABLE(GEN8_4x4_STC_OPTIMIZATION_DISABLE)); 91 + } 92 + 66 93 static void i8xx_disable_fbc(struct drm_device *dev) 67 94 { 68 95 struct drm_i915_private *dev_priv = dev->dev_private; 69 96 u32 fbc_ctl; 97 + 98 + dev_priv->fbc.enabled = false; 70 99 71 100 /* Disable compression */ 72 101 fbc_ctl = I915_READ(FBC_CONTROL); ··· 121 98 int cfb_pitch; 122 99 int i; 123 100 u32 fbc_ctl; 101 + 102 + dev_priv->fbc.enabled = true; 124 103 125 104 cfb_pitch = dev_priv->fbc.size / FBC_LL_SIZE; 126 105 if (fb->pitches[0] < cfb_pitch) ··· 178 153 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 179 154 u32 dpfc_ctl; 180 155 156 + dev_priv->fbc.enabled = true; 157 + 181 158 dpfc_ctl = DPFC_CTL_PLANE(intel_crtc->plane) | DPFC_SR_EN; 182 159 if (drm_format_plane_cpp(fb->pixel_format, 0) == 2) 183 160 dpfc_ctl |= DPFC_CTL_LIMIT_2X; ··· 199 172 { 200 173 struct drm_i915_private *dev_priv = dev->dev_private; 201 174 u32 dpfc_ctl; 175 + 176 + dev_priv->fbc.enabled = false; 202 177 203 178 /* Disable compression */ 204 179 dpfc_ctl = I915_READ(DPFC_CONTROL); ··· 253 224 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 254 225 u32 dpfc_ctl; 255 226 227 + dev_priv->fbc.enabled = true; 228 + 256 229 dpfc_ctl = DPFC_CTL_PLANE(intel_crtc->plane); 257 230 if (drm_format_plane_cpp(fb->pixel_format, 0) == 2) 258 231 dev_priv->fbc.threshold++; ··· 295 264 struct drm_i915_private *dev_priv = dev->dev_private; 296 265 u32 dpfc_ctl; 297 266 267 + dev_priv->fbc.enabled = false; 268 + 298 269 /* Disable compression */ 299 270 dpfc_ctl = I915_READ(ILK_DPFC_CONTROL); 300 271 if (dpfc_ctl & DPFC_CTL_EN) { ··· 322 289 struct drm_i915_gem_object *obj = intel_fb_obj(fb); 323 290 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 324 291 u32 dpfc_ctl; 292 + 293 + dev_priv->fbc.enabled = true; 325 294 326 295 dpfc_ctl = IVB_DPFC_CTL_PLANE(intel_crtc->plane); 327 296 if (drm_format_plane_cpp(fb->pixel_format, 0) == 2) ··· 374 339 { 375 340 struct drm_i915_private *dev_priv = dev->dev_private; 376 341 377 - if (!dev_priv->display.fbc_enabled) 378 - return false; 379 - 380 - return dev_priv->display.fbc_enabled(dev); 342 + return dev_priv->fbc.enabled; 381 343 } 382 344 383 - void gen8_fbc_sw_flush(struct drm_device *dev, u32 value) 345 + void bdw_fbc_sw_flush(struct drm_device *dev, u32 value) 384 346 { 385 347 struct drm_i915_private *dev_priv = dev->dev_private; 386 348 387 349 if (!IS_GEN8(dev)) 350 + return; 351 + 352 + if (!intel_fbc_enabled(dev)) 388 353 return; 389 354 390 355 I915_WRITE(MSG_FBC_REND_STATE, value); ··· 6076 6041 lpt_suspend_hw(dev); 6077 6042 } 6078 6043 6079 - #define for_each_power_well(i, power_well, domain_mask, power_domains) \ 6080 - for (i = 0; \ 6081 - i < (power_domains)->power_well_count && \ 6082 - ((power_well) = &(power_domains)->power_wells[i]); \ 6083 - i++) \ 6084 - if ((power_well)->domains & (domain_mask)) 6085 - 6086 - #define for_each_power_well_rev(i, power_well, domain_mask, power_domains) \ 6087 - for (i = (power_domains)->power_well_count - 1; \ 6088 - i >= 0 && ((power_well) = &(power_domains)->power_wells[i]);\ 6089 - i--) \ 6090 - if ((power_well)->domains & (domain_mask)) 6091 - 6092 - /** 6093 - * We should only use the power well if we explicitly asked the hardware to 6094 - * enable it, so check if it's enabled and also check if we've requested it to 6095 - * be enabled. 6096 - */ 6097 - static bool hsw_power_well_enabled(struct drm_i915_private *dev_priv, 6098 - struct i915_power_well *power_well) 6044 + static void intel_init_fbc(struct drm_i915_private *dev_priv) 6099 6045 { 6100 - return I915_READ(HSW_PWR_WELL_DRIVER) == 6101 - (HSW_PWR_WELL_ENABLE_REQUEST | HSW_PWR_WELL_STATE_ENABLED); 6102 - } 6103 - 6104 - bool intel_display_power_enabled_unlocked(struct drm_i915_private *dev_priv, 6105 - enum intel_display_power_domain domain) 6106 - { 6107 - struct i915_power_domains *power_domains; 6108 - struct i915_power_well *power_well; 6109 - bool is_enabled; 6110 - int i; 6111 - 6112 - if (dev_priv->pm.suspended) 6113 - return false; 6114 - 6115 - power_domains = &dev_priv->power_domains; 6116 - 6117 - is_enabled = true; 6118 - 6119 - for_each_power_well_rev(i, power_well, BIT(domain), power_domains) { 6120 - if (power_well->always_on) 6121 - continue; 6122 - 6123 - if (!power_well->hw_enabled) { 6124 - is_enabled = false; 6125 - break; 6126 - } 6046 + if (!HAS_FBC(dev_priv)) { 6047 + dev_priv->fbc.enabled = false; 6048 + return; 6127 6049 } 6128 6050 6129 - return is_enabled; 6130 - } 6131 - 6132 - bool intel_display_power_enabled(struct drm_i915_private *dev_priv, 6133 - enum intel_display_power_domain domain) 6134 - { 6135 - struct i915_power_domains *power_domains; 6136 - bool ret; 6137 - 6138 - power_domains = &dev_priv->power_domains; 6139 - 6140 - mutex_lock(&power_domains->lock); 6141 - ret = intel_display_power_enabled_unlocked(dev_priv, domain); 6142 - mutex_unlock(&power_domains->lock); 6143 - 6144 - return ret; 6145 - } 6146 - 6147 - /* 6148 - * Starting with Haswell, we have a "Power Down Well" that can be turned off 6149 - * when not needed anymore. We have 4 registers that can request the power well 6150 - * to be enabled, and it will only be disabled if none of the registers is 6151 - * requesting it to be enabled. 6152 - */ 6153 - static void hsw_power_well_post_enable(struct drm_i915_private *dev_priv) 6154 - { 6155 - struct drm_device *dev = dev_priv->dev; 6156 - 6157 - /* 6158 - * After we re-enable the power well, if we touch VGA register 0x3d5 6159 - * we'll get unclaimed register interrupts. This stops after we write 6160 - * anything to the VGA MSR register. The vgacon module uses this 6161 - * register all the time, so if we unbind our driver and, as a 6162 - * consequence, bind vgacon, we'll get stuck in an infinite loop at 6163 - * console_unlock(). So make here we touch the VGA MSR register, making 6164 - * sure vgacon can keep working normally without triggering interrupts 6165 - * and error messages. 6166 - */ 6167 - vga_get_uninterruptible(dev->pdev, VGA_RSRC_LEGACY_IO); 6168 - outb(inb(VGA_MSR_READ), VGA_MSR_WRITE); 6169 - vga_put(dev->pdev, VGA_RSRC_LEGACY_IO); 6170 - 6171 - if (IS_BROADWELL(dev)) 6172 - gen8_irq_power_well_post_enable(dev_priv); 6173 - } 6174 - 6175 - static void hsw_set_power_well(struct drm_i915_private *dev_priv, 6176 - struct i915_power_well *power_well, bool enable) 6177 - { 6178 - bool is_enabled, enable_requested; 6179 - uint32_t tmp; 6180 - 6181 - tmp = I915_READ(HSW_PWR_WELL_DRIVER); 6182 - is_enabled = tmp & HSW_PWR_WELL_STATE_ENABLED; 6183 - enable_requested = tmp & HSW_PWR_WELL_ENABLE_REQUEST; 6184 - 6185 - if (enable) { 6186 - if (!enable_requested) 6187 - I915_WRITE(HSW_PWR_WELL_DRIVER, 6188 - HSW_PWR_WELL_ENABLE_REQUEST); 6189 - 6190 - if (!is_enabled) { 6191 - DRM_DEBUG_KMS("Enabling power well\n"); 6192 - if (wait_for((I915_READ(HSW_PWR_WELL_DRIVER) & 6193 - HSW_PWR_WELL_STATE_ENABLED), 20)) 6194 - DRM_ERROR("Timeout enabling power well\n"); 6195 - } 6196 - 6197 - hsw_power_well_post_enable(dev_priv); 6051 + if (INTEL_INFO(dev_priv)->gen >= 7) { 6052 + dev_priv->display.fbc_enabled = ironlake_fbc_enabled; 6053 + dev_priv->display.enable_fbc = gen7_enable_fbc; 6054 + dev_priv->display.disable_fbc = ironlake_disable_fbc; 6055 + } else if (INTEL_INFO(dev_priv)->gen >= 5) { 6056 + dev_priv->display.fbc_enabled = ironlake_fbc_enabled; 6057 + dev_priv->display.enable_fbc = ironlake_enable_fbc; 6058 + dev_priv->display.disable_fbc = ironlake_disable_fbc; 6059 + } else if (IS_GM45(dev_priv)) { 6060 + dev_priv->display.fbc_enabled = g4x_fbc_enabled; 6061 + dev_priv->display.enable_fbc = g4x_enable_fbc; 6062 + dev_priv->display.disable_fbc = g4x_disable_fbc; 6198 6063 } else { 6199 - if (enable_requested) { 6200 - I915_WRITE(HSW_PWR_WELL_DRIVER, 0); 6201 - POSTING_READ(HSW_PWR_WELL_DRIVER); 6202 - DRM_DEBUG_KMS("Requesting to disable the power well\n"); 6203 - } 6204 - } 6205 - } 6064 + dev_priv->display.fbc_enabled = i8xx_fbc_enabled; 6065 + dev_priv->display.enable_fbc = i8xx_enable_fbc; 6066 + dev_priv->display.disable_fbc = i8xx_disable_fbc; 6206 6067 6207 - static void hsw_power_well_sync_hw(struct drm_i915_private *dev_priv, 6208 - struct i915_power_well *power_well) 6209 - { 6210 - hsw_set_power_well(dev_priv, power_well, power_well->count > 0); 6211 - 6212 - /* 6213 - * We're taking over the BIOS, so clear any requests made by it since 6214 - * the driver is in charge now. 6215 - */ 6216 - if (I915_READ(HSW_PWR_WELL_BIOS) & HSW_PWR_WELL_ENABLE_REQUEST) 6217 - I915_WRITE(HSW_PWR_WELL_BIOS, 0); 6218 - } 6219 - 6220 - static void hsw_power_well_enable(struct drm_i915_private *dev_priv, 6221 - struct i915_power_well *power_well) 6222 - { 6223 - hsw_set_power_well(dev_priv, power_well, true); 6224 - } 6225 - 6226 - static void hsw_power_well_disable(struct drm_i915_private *dev_priv, 6227 - struct i915_power_well *power_well) 6228 - { 6229 - hsw_set_power_well(dev_priv, power_well, false); 6230 - } 6231 - 6232 - static void i9xx_always_on_power_well_noop(struct drm_i915_private *dev_priv, 6233 - struct i915_power_well *power_well) 6234 - { 6235 - } 6236 - 6237 - static bool i9xx_always_on_power_well_enabled(struct drm_i915_private *dev_priv, 6238 - struct i915_power_well *power_well) 6239 - { 6240 - return true; 6241 - } 6242 - 6243 - static void vlv_set_power_well(struct drm_i915_private *dev_priv, 6244 - struct i915_power_well *power_well, bool enable) 6245 - { 6246 - enum punit_power_well power_well_id = power_well->data; 6247 - u32 mask; 6248 - u32 state; 6249 - u32 ctrl; 6250 - 6251 - mask = PUNIT_PWRGT_MASK(power_well_id); 6252 - state = enable ? PUNIT_PWRGT_PWR_ON(power_well_id) : 6253 - PUNIT_PWRGT_PWR_GATE(power_well_id); 6254 - 6255 - mutex_lock(&dev_priv->rps.hw_lock); 6256 - 6257 - #define COND \ 6258 - ((vlv_punit_read(dev_priv, PUNIT_REG_PWRGT_STATUS) & mask) == state) 6259 - 6260 - if (COND) 6261 - goto out; 6262 - 6263 - ctrl = vlv_punit_read(dev_priv, PUNIT_REG_PWRGT_CTRL); 6264 - ctrl &= ~mask; 6265 - ctrl |= state; 6266 - vlv_punit_write(dev_priv, PUNIT_REG_PWRGT_CTRL, ctrl); 6267 - 6268 - if (wait_for(COND, 100)) 6269 - DRM_ERROR("timout setting power well state %08x (%08x)\n", 6270 - state, 6271 - vlv_punit_read(dev_priv, PUNIT_REG_PWRGT_CTRL)); 6272 - 6273 - #undef COND 6274 - 6275 - out: 6276 - mutex_unlock(&dev_priv->rps.hw_lock); 6277 - } 6278 - 6279 - static void vlv_power_well_sync_hw(struct drm_i915_private *dev_priv, 6280 - struct i915_power_well *power_well) 6281 - { 6282 - vlv_set_power_well(dev_priv, power_well, power_well->count > 0); 6283 - } 6284 - 6285 - static void vlv_power_well_enable(struct drm_i915_private *dev_priv, 6286 - struct i915_power_well *power_well) 6287 - { 6288 - vlv_set_power_well(dev_priv, power_well, true); 6289 - } 6290 - 6291 - static void vlv_power_well_disable(struct drm_i915_private *dev_priv, 6292 - struct i915_power_well *power_well) 6293 - { 6294 - vlv_set_power_well(dev_priv, power_well, false); 6295 - } 6296 - 6297 - static bool vlv_power_well_enabled(struct drm_i915_private *dev_priv, 6298 - struct i915_power_well *power_well) 6299 - { 6300 - int power_well_id = power_well->data; 6301 - bool enabled = false; 6302 - u32 mask; 6303 - u32 state; 6304 - u32 ctrl; 6305 - 6306 - mask = PUNIT_PWRGT_MASK(power_well_id); 6307 - ctrl = PUNIT_PWRGT_PWR_ON(power_well_id); 6308 - 6309 - mutex_lock(&dev_priv->rps.hw_lock); 6310 - 6311 - state = vlv_punit_read(dev_priv, PUNIT_REG_PWRGT_STATUS) & mask; 6312 - /* 6313 - * We only ever set the power-on and power-gate states, anything 6314 - * else is unexpected. 6315 - */ 6316 - WARN_ON(state != PUNIT_PWRGT_PWR_ON(power_well_id) && 6317 - state != PUNIT_PWRGT_PWR_GATE(power_well_id)); 6318 - if (state == ctrl) 6319 - enabled = true; 6320 - 6321 - /* 6322 - * A transient state at this point would mean some unexpected party 6323 - * is poking at the power controls too. 6324 - */ 6325 - ctrl = vlv_punit_read(dev_priv, PUNIT_REG_PWRGT_CTRL) & mask; 6326 - WARN_ON(ctrl != state); 6327 - 6328 - mutex_unlock(&dev_priv->rps.hw_lock); 6329 - 6330 - return enabled; 6331 - } 6332 - 6333 - static void vlv_display_power_well_enable(struct drm_i915_private *dev_priv, 6334 - struct i915_power_well *power_well) 6335 - { 6336 - WARN_ON_ONCE(power_well->data != PUNIT_POWER_WELL_DISP2D); 6337 - 6338 - vlv_set_power_well(dev_priv, power_well, true); 6339 - 6340 - spin_lock_irq(&dev_priv->irq_lock); 6341 - valleyview_enable_display_irqs(dev_priv); 6342 - spin_unlock_irq(&dev_priv->irq_lock); 6343 - 6344 - /* 6345 - * During driver initialization/resume we can avoid restoring the 6346 - * part of the HW/SW state that will be inited anyway explicitly. 6347 - */ 6348 - if (dev_priv->power_domains.initializing) 6349 - return; 6350 - 6351 - intel_hpd_init(dev_priv->dev); 6352 - 6353 - i915_redisable_vga_power_on(dev_priv->dev); 6354 - } 6355 - 6356 - static void vlv_display_power_well_disable(struct drm_i915_private *dev_priv, 6357 - struct i915_power_well *power_well) 6358 - { 6359 - WARN_ON_ONCE(power_well->data != PUNIT_POWER_WELL_DISP2D); 6360 - 6361 - spin_lock_irq(&dev_priv->irq_lock); 6362 - valleyview_disable_display_irqs(dev_priv); 6363 - spin_unlock_irq(&dev_priv->irq_lock); 6364 - 6365 - vlv_set_power_well(dev_priv, power_well, false); 6366 - 6367 - vlv_power_sequencer_reset(dev_priv); 6368 - } 6369 - 6370 - static void vlv_dpio_cmn_power_well_enable(struct drm_i915_private *dev_priv, 6371 - struct i915_power_well *power_well) 6372 - { 6373 - WARN_ON_ONCE(power_well->data != PUNIT_POWER_WELL_DPIO_CMN_BC); 6374 - 6375 - /* 6376 - * Enable the CRI clock source so we can get at the 6377 - * display and the reference clock for VGA 6378 - * hotplug / manual detection. 6379 - */ 6380 - I915_WRITE(DPLL(PIPE_B), I915_READ(DPLL(PIPE_B)) | 6381 - DPLL_REFA_CLK_ENABLE_VLV | DPLL_INTEGRATED_CRI_CLK_VLV); 6382 - udelay(1); /* >10ns for cmnreset, >0ns for sidereset */ 6383 - 6384 - vlv_set_power_well(dev_priv, power_well, true); 6385 - 6386 - /* 6387 - * From VLV2A0_DP_eDP_DPIO_driver_vbios_notes_10.docx - 6388 - * 6. De-assert cmn_reset/side_reset. Same as VLV X0. 6389 - * a. GUnit 0x2110 bit[0] set to 1 (def 0) 6390 - * b. The other bits such as sfr settings / modesel may all 6391 - * be set to 0. 6392 - * 6393 - * This should only be done on init and resume from S3 with 6394 - * both PLLs disabled, or we risk losing DPIO and PLL 6395 - * synchronization. 6396 - */ 6397 - I915_WRITE(DPIO_CTL, I915_READ(DPIO_CTL) | DPIO_CMNRST); 6398 - } 6399 - 6400 - static void vlv_dpio_cmn_power_well_disable(struct drm_i915_private *dev_priv, 6401 - struct i915_power_well *power_well) 6402 - { 6403 - enum pipe pipe; 6404 - 6405 - WARN_ON_ONCE(power_well->data != PUNIT_POWER_WELL_DPIO_CMN_BC); 6406 - 6407 - for_each_pipe(dev_priv, pipe) 6408 - assert_pll_disabled(dev_priv, pipe); 6409 - 6410 - /* Assert common reset */ 6411 - I915_WRITE(DPIO_CTL, I915_READ(DPIO_CTL) & ~DPIO_CMNRST); 6412 - 6413 - vlv_set_power_well(dev_priv, power_well, false); 6414 - } 6415 - 6416 - static void chv_dpio_cmn_power_well_enable(struct drm_i915_private *dev_priv, 6417 - struct i915_power_well *power_well) 6418 - { 6419 - enum dpio_phy phy; 6420 - 6421 - WARN_ON_ONCE(power_well->data != PUNIT_POWER_WELL_DPIO_CMN_BC && 6422 - power_well->data != PUNIT_POWER_WELL_DPIO_CMN_D); 6423 - 6424 - /* 6425 - * Enable the CRI clock source so we can get at the 6426 - * display and the reference clock for VGA 6427 - * hotplug / manual detection. 6428 - */ 6429 - if (power_well->data == PUNIT_POWER_WELL_DPIO_CMN_BC) { 6430 - phy = DPIO_PHY0; 6431 - I915_WRITE(DPLL(PIPE_B), I915_READ(DPLL(PIPE_B)) | 6432 - DPLL_REFA_CLK_ENABLE_VLV); 6433 - I915_WRITE(DPLL(PIPE_B), I915_READ(DPLL(PIPE_B)) | 6434 - DPLL_REFA_CLK_ENABLE_VLV | DPLL_INTEGRATED_CRI_CLK_VLV); 6435 - } else { 6436 - phy = DPIO_PHY1; 6437 - I915_WRITE(DPLL(PIPE_C), I915_READ(DPLL(PIPE_C)) | 6438 - DPLL_REFA_CLK_ENABLE_VLV | DPLL_INTEGRATED_CRI_CLK_VLV); 6439 - } 6440 - udelay(1); /* >10ns for cmnreset, >0ns for sidereset */ 6441 - vlv_set_power_well(dev_priv, power_well, true); 6442 - 6443 - /* Poll for phypwrgood signal */ 6444 - if (wait_for(I915_READ(DISPLAY_PHY_STATUS) & PHY_POWERGOOD(phy), 1)) 6445 - DRM_ERROR("Display PHY %d is not power up\n", phy); 6446 - 6447 - I915_WRITE(DISPLAY_PHY_CONTROL, I915_READ(DISPLAY_PHY_CONTROL) | 6448 - PHY_COM_LANE_RESET_DEASSERT(phy)); 6449 - } 6450 - 6451 - static void chv_dpio_cmn_power_well_disable(struct drm_i915_private *dev_priv, 6452 - struct i915_power_well *power_well) 6453 - { 6454 - enum dpio_phy phy; 6455 - 6456 - WARN_ON_ONCE(power_well->data != PUNIT_POWER_WELL_DPIO_CMN_BC && 6457 - power_well->data != PUNIT_POWER_WELL_DPIO_CMN_D); 6458 - 6459 - if (power_well->data == PUNIT_POWER_WELL_DPIO_CMN_BC) { 6460 - phy = DPIO_PHY0; 6461 - assert_pll_disabled(dev_priv, PIPE_A); 6462 - assert_pll_disabled(dev_priv, PIPE_B); 6463 - } else { 6464 - phy = DPIO_PHY1; 6465 - assert_pll_disabled(dev_priv, PIPE_C); 6068 + /* This value was pulled out of someone's hat */ 6069 + I915_WRITE(FBC_CONTROL, 500 << FBC_CTL_INTERVAL_SHIFT); 6466 6070 } 6467 6071 6468 - I915_WRITE(DISPLAY_PHY_CONTROL, I915_READ(DISPLAY_PHY_CONTROL) & 6469 - ~PHY_COM_LANE_RESET_DEASSERT(phy)); 6470 - 6471 - vlv_set_power_well(dev_priv, power_well, false); 6472 - } 6473 - 6474 - static bool chv_pipe_power_well_enabled(struct drm_i915_private *dev_priv, 6475 - struct i915_power_well *power_well) 6476 - { 6477 - enum pipe pipe = power_well->data; 6478 - bool enabled; 6479 - u32 state, ctrl; 6480 - 6481 - mutex_lock(&dev_priv->rps.hw_lock); 6482 - 6483 - state = vlv_punit_read(dev_priv, PUNIT_REG_DSPFREQ) & DP_SSS_MASK(pipe); 6484 - /* 6485 - * We only ever set the power-on and power-gate states, anything 6486 - * else is unexpected. 6487 - */ 6488 - WARN_ON(state != DP_SSS_PWR_ON(pipe) && state != DP_SSS_PWR_GATE(pipe)); 6489 - enabled = state == DP_SSS_PWR_ON(pipe); 6490 - 6491 - /* 6492 - * A transient state at this point would mean some unexpected party 6493 - * is poking at the power controls too. 6494 - */ 6495 - ctrl = vlv_punit_read(dev_priv, PUNIT_REG_DSPFREQ) & DP_SSC_MASK(pipe); 6496 - WARN_ON(ctrl << 16 != state); 6497 - 6498 - mutex_unlock(&dev_priv->rps.hw_lock); 6499 - 6500 - return enabled; 6501 - } 6502 - 6503 - static void chv_set_pipe_power_well(struct drm_i915_private *dev_priv, 6504 - struct i915_power_well *power_well, 6505 - bool enable) 6506 - { 6507 - enum pipe pipe = power_well->data; 6508 - u32 state; 6509 - u32 ctrl; 6510 - 6511 - state = enable ? DP_SSS_PWR_ON(pipe) : DP_SSS_PWR_GATE(pipe); 6512 - 6513 - mutex_lock(&dev_priv->rps.hw_lock); 6514 - 6515 - #define COND \ 6516 - ((vlv_punit_read(dev_priv, PUNIT_REG_DSPFREQ) & DP_SSS_MASK(pipe)) == state) 6517 - 6518 - if (COND) 6519 - goto out; 6520 - 6521 - ctrl = vlv_punit_read(dev_priv, PUNIT_REG_DSPFREQ); 6522 - ctrl &= ~DP_SSC_MASK(pipe); 6523 - ctrl |= enable ? DP_SSC_PWR_ON(pipe) : DP_SSC_PWR_GATE(pipe); 6524 - vlv_punit_write(dev_priv, PUNIT_REG_DSPFREQ, ctrl); 6525 - 6526 - if (wait_for(COND, 100)) 6527 - DRM_ERROR("timout setting power well state %08x (%08x)\n", 6528 - state, 6529 - vlv_punit_read(dev_priv, PUNIT_REG_DSPFREQ)); 6530 - 6531 - #undef COND 6532 - 6533 - out: 6534 - mutex_unlock(&dev_priv->rps.hw_lock); 6535 - } 6536 - 6537 - static void chv_pipe_power_well_sync_hw(struct drm_i915_private *dev_priv, 6538 - struct i915_power_well *power_well) 6539 - { 6540 - chv_set_pipe_power_well(dev_priv, power_well, power_well->count > 0); 6541 - } 6542 - 6543 - static void chv_pipe_power_well_enable(struct drm_i915_private *dev_priv, 6544 - struct i915_power_well *power_well) 6545 - { 6546 - WARN_ON_ONCE(power_well->data != PIPE_A && 6547 - power_well->data != PIPE_B && 6548 - power_well->data != PIPE_C); 6549 - 6550 - chv_set_pipe_power_well(dev_priv, power_well, true); 6551 - } 6552 - 6553 - static void chv_pipe_power_well_disable(struct drm_i915_private *dev_priv, 6554 - struct i915_power_well *power_well) 6555 - { 6556 - WARN_ON_ONCE(power_well->data != PIPE_A && 6557 - power_well->data != PIPE_B && 6558 - power_well->data != PIPE_C); 6559 - 6560 - chv_set_pipe_power_well(dev_priv, power_well, false); 6561 - } 6562 - 6563 - static void check_power_well_state(struct drm_i915_private *dev_priv, 6564 - struct i915_power_well *power_well) 6565 - { 6566 - bool enabled = power_well->ops->is_enabled(dev_priv, power_well); 6567 - 6568 - if (power_well->always_on || !i915.disable_power_well) { 6569 - if (!enabled) 6570 - goto mismatch; 6571 - 6572 - return; 6573 - } 6574 - 6575 - if (enabled != (power_well->count > 0)) 6576 - goto mismatch; 6577 - 6578 - return; 6579 - 6580 - mismatch: 6581 - WARN(1, "state mismatch for '%s' (always_on %d hw state %d use-count %d disable_power_well %d\n", 6582 - power_well->name, power_well->always_on, enabled, 6583 - power_well->count, i915.disable_power_well); 6584 - } 6585 - 6586 - void intel_display_power_get(struct drm_i915_private *dev_priv, 6587 - enum intel_display_power_domain domain) 6588 - { 6589 - struct i915_power_domains *power_domains; 6590 - struct i915_power_well *power_well; 6591 - int i; 6592 - 6593 - intel_runtime_pm_get(dev_priv); 6594 - 6595 - power_domains = &dev_priv->power_domains; 6596 - 6597 - mutex_lock(&power_domains->lock); 6598 - 6599 - for_each_power_well(i, power_well, BIT(domain), power_domains) { 6600 - if (!power_well->count++) { 6601 - DRM_DEBUG_KMS("enabling %s\n", power_well->name); 6602 - power_well->ops->enable(dev_priv, power_well); 6603 - power_well->hw_enabled = true; 6604 - } 6605 - 6606 - check_power_well_state(dev_priv, power_well); 6607 - } 6608 - 6609 - power_domains->domain_use_count[domain]++; 6610 - 6611 - mutex_unlock(&power_domains->lock); 6612 - } 6613 - 6614 - void intel_display_power_put(struct drm_i915_private *dev_priv, 6615 - enum intel_display_power_domain domain) 6616 - { 6617 - struct i915_power_domains *power_domains; 6618 - struct i915_power_well *power_well; 6619 - int i; 6620 - 6621 - power_domains = &dev_priv->power_domains; 6622 - 6623 - mutex_lock(&power_domains->lock); 6624 - 6625 - WARN_ON(!power_domains->domain_use_count[domain]); 6626 - power_domains->domain_use_count[domain]--; 6627 - 6628 - for_each_power_well_rev(i, power_well, BIT(domain), power_domains) { 6629 - WARN_ON(!power_well->count); 6630 - 6631 - if (!--power_well->count && i915.disable_power_well) { 6632 - DRM_DEBUG_KMS("disabling %s\n", power_well->name); 6633 - power_well->hw_enabled = false; 6634 - power_well->ops->disable(dev_priv, power_well); 6635 - } 6636 - 6637 - check_power_well_state(dev_priv, power_well); 6638 - } 6639 - 6640 - mutex_unlock(&power_domains->lock); 6641 - 6642 - intel_runtime_pm_put(dev_priv); 6643 - } 6644 - 6645 - static struct i915_power_domains *hsw_pwr; 6646 - 6647 - /* Display audio driver power well request */ 6648 - int i915_request_power_well(void) 6649 - { 6650 - struct drm_i915_private *dev_priv; 6651 - 6652 - if (!hsw_pwr) 6653 - return -ENODEV; 6654 - 6655 - dev_priv = container_of(hsw_pwr, struct drm_i915_private, 6656 - power_domains); 6657 - intel_display_power_get(dev_priv, POWER_DOMAIN_AUDIO); 6658 - return 0; 6659 - } 6660 - EXPORT_SYMBOL_GPL(i915_request_power_well); 6661 - 6662 - /* Display audio driver power well release */ 6663 - int i915_release_power_well(void) 6664 - { 6665 - struct drm_i915_private *dev_priv; 6666 - 6667 - if (!hsw_pwr) 6668 - return -ENODEV; 6669 - 6670 - dev_priv = container_of(hsw_pwr, struct drm_i915_private, 6671 - power_domains); 6672 - intel_display_power_put(dev_priv, POWER_DOMAIN_AUDIO); 6673 - return 0; 6674 - } 6675 - EXPORT_SYMBOL_GPL(i915_release_power_well); 6676 - 6677 - /* 6678 - * Private interface for the audio driver to get CDCLK in kHz. 6679 - * 6680 - * Caller must request power well using i915_request_power_well() prior to 6681 - * making the call. 6682 - */ 6683 - int i915_get_cdclk_freq(void) 6684 - { 6685 - struct drm_i915_private *dev_priv; 6686 - 6687 - if (!hsw_pwr) 6688 - return -ENODEV; 6689 - 6690 - dev_priv = container_of(hsw_pwr, struct drm_i915_private, 6691 - power_domains); 6692 - 6693 - return intel_ddi_get_cdclk_freq(dev_priv); 6694 - } 6695 - EXPORT_SYMBOL_GPL(i915_get_cdclk_freq); 6696 - 6697 - 6698 - #define POWER_DOMAIN_MASK (BIT(POWER_DOMAIN_NUM) - 1) 6699 - 6700 - #define HSW_ALWAYS_ON_POWER_DOMAINS ( \ 6701 - BIT(POWER_DOMAIN_PIPE_A) | \ 6702 - BIT(POWER_DOMAIN_TRANSCODER_EDP) | \ 6703 - BIT(POWER_DOMAIN_PORT_DDI_A_2_LANES) | \ 6704 - BIT(POWER_DOMAIN_PORT_DDI_A_4_LANES) | \ 6705 - BIT(POWER_DOMAIN_PORT_DDI_B_2_LANES) | \ 6706 - BIT(POWER_DOMAIN_PORT_DDI_B_4_LANES) | \ 6707 - BIT(POWER_DOMAIN_PORT_DDI_C_2_LANES) | \ 6708 - BIT(POWER_DOMAIN_PORT_DDI_C_4_LANES) | \ 6709 - BIT(POWER_DOMAIN_PORT_DDI_D_2_LANES) | \ 6710 - BIT(POWER_DOMAIN_PORT_DDI_D_4_LANES) | \ 6711 - BIT(POWER_DOMAIN_PORT_CRT) | \ 6712 - BIT(POWER_DOMAIN_PLLS) | \ 6713 - BIT(POWER_DOMAIN_INIT)) 6714 - #define HSW_DISPLAY_POWER_DOMAINS ( \ 6715 - (POWER_DOMAIN_MASK & ~HSW_ALWAYS_ON_POWER_DOMAINS) | \ 6716 - BIT(POWER_DOMAIN_INIT)) 6717 - 6718 - #define BDW_ALWAYS_ON_POWER_DOMAINS ( \ 6719 - HSW_ALWAYS_ON_POWER_DOMAINS | \ 6720 - BIT(POWER_DOMAIN_PIPE_A_PANEL_FITTER)) 6721 - #define BDW_DISPLAY_POWER_DOMAINS ( \ 6722 - (POWER_DOMAIN_MASK & ~BDW_ALWAYS_ON_POWER_DOMAINS) | \ 6723 - BIT(POWER_DOMAIN_INIT)) 6724 - 6725 - #define VLV_ALWAYS_ON_POWER_DOMAINS BIT(POWER_DOMAIN_INIT) 6726 - #define VLV_DISPLAY_POWER_DOMAINS POWER_DOMAIN_MASK 6727 - 6728 - #define VLV_DPIO_CMN_BC_POWER_DOMAINS ( \ 6729 - BIT(POWER_DOMAIN_PORT_DDI_B_2_LANES) | \ 6730 - BIT(POWER_DOMAIN_PORT_DDI_B_4_LANES) | \ 6731 - BIT(POWER_DOMAIN_PORT_DDI_C_2_LANES) | \ 6732 - BIT(POWER_DOMAIN_PORT_DDI_C_4_LANES) | \ 6733 - BIT(POWER_DOMAIN_PORT_CRT) | \ 6734 - BIT(POWER_DOMAIN_INIT)) 6735 - 6736 - #define VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS ( \ 6737 - BIT(POWER_DOMAIN_PORT_DDI_B_2_LANES) | \ 6738 - BIT(POWER_DOMAIN_PORT_DDI_B_4_LANES) | \ 6739 - BIT(POWER_DOMAIN_INIT)) 6740 - 6741 - #define VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS ( \ 6742 - BIT(POWER_DOMAIN_PORT_DDI_B_4_LANES) | \ 6743 - BIT(POWER_DOMAIN_INIT)) 6744 - 6745 - #define VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS ( \ 6746 - BIT(POWER_DOMAIN_PORT_DDI_C_2_LANES) | \ 6747 - BIT(POWER_DOMAIN_PORT_DDI_C_4_LANES) | \ 6748 - BIT(POWER_DOMAIN_INIT)) 6749 - 6750 - #define VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS ( \ 6751 - BIT(POWER_DOMAIN_PORT_DDI_C_4_LANES) | \ 6752 - BIT(POWER_DOMAIN_INIT)) 6753 - 6754 - #define CHV_PIPE_A_POWER_DOMAINS ( \ 6755 - BIT(POWER_DOMAIN_PIPE_A) | \ 6756 - BIT(POWER_DOMAIN_INIT)) 6757 - 6758 - #define CHV_PIPE_B_POWER_DOMAINS ( \ 6759 - BIT(POWER_DOMAIN_PIPE_B) | \ 6760 - BIT(POWER_DOMAIN_INIT)) 6761 - 6762 - #define CHV_PIPE_C_POWER_DOMAINS ( \ 6763 - BIT(POWER_DOMAIN_PIPE_C) | \ 6764 - BIT(POWER_DOMAIN_INIT)) 6765 - 6766 - #define CHV_DPIO_CMN_BC_POWER_DOMAINS ( \ 6767 - BIT(POWER_DOMAIN_PORT_DDI_B_2_LANES) | \ 6768 - BIT(POWER_DOMAIN_PORT_DDI_B_4_LANES) | \ 6769 - BIT(POWER_DOMAIN_PORT_DDI_C_2_LANES) | \ 6770 - BIT(POWER_DOMAIN_PORT_DDI_C_4_LANES) | \ 6771 - BIT(POWER_DOMAIN_INIT)) 6772 - 6773 - #define CHV_DPIO_CMN_D_POWER_DOMAINS ( \ 6774 - BIT(POWER_DOMAIN_PORT_DDI_D_2_LANES) | \ 6775 - BIT(POWER_DOMAIN_PORT_DDI_D_4_LANES) | \ 6776 - BIT(POWER_DOMAIN_INIT)) 6777 - 6778 - #define CHV_DPIO_TX_D_LANES_01_POWER_DOMAINS ( \ 6779 - BIT(POWER_DOMAIN_PORT_DDI_D_2_LANES) | \ 6780 - BIT(POWER_DOMAIN_PORT_DDI_D_4_LANES) | \ 6781 - BIT(POWER_DOMAIN_INIT)) 6782 - 6783 - #define CHV_DPIO_TX_D_LANES_23_POWER_DOMAINS ( \ 6784 - BIT(POWER_DOMAIN_PORT_DDI_D_4_LANES) | \ 6785 - BIT(POWER_DOMAIN_INIT)) 6786 - 6787 - static const struct i915_power_well_ops i9xx_always_on_power_well_ops = { 6788 - .sync_hw = i9xx_always_on_power_well_noop, 6789 - .enable = i9xx_always_on_power_well_noop, 6790 - .disable = i9xx_always_on_power_well_noop, 6791 - .is_enabled = i9xx_always_on_power_well_enabled, 6792 - }; 6793 - 6794 - static const struct i915_power_well_ops chv_pipe_power_well_ops = { 6795 - .sync_hw = chv_pipe_power_well_sync_hw, 6796 - .enable = chv_pipe_power_well_enable, 6797 - .disable = chv_pipe_power_well_disable, 6798 - .is_enabled = chv_pipe_power_well_enabled, 6799 - }; 6800 - 6801 - static const struct i915_power_well_ops chv_dpio_cmn_power_well_ops = { 6802 - .sync_hw = vlv_power_well_sync_hw, 6803 - .enable = chv_dpio_cmn_power_well_enable, 6804 - .disable = chv_dpio_cmn_power_well_disable, 6805 - .is_enabled = vlv_power_well_enabled, 6806 - }; 6807 - 6808 - static struct i915_power_well i9xx_always_on_power_well[] = { 6809 - { 6810 - .name = "always-on", 6811 - .always_on = 1, 6812 - .domains = POWER_DOMAIN_MASK, 6813 - .ops = &i9xx_always_on_power_well_ops, 6814 - }, 6815 - }; 6816 - 6817 - static const struct i915_power_well_ops hsw_power_well_ops = { 6818 - .sync_hw = hsw_power_well_sync_hw, 6819 - .enable = hsw_power_well_enable, 6820 - .disable = hsw_power_well_disable, 6821 - .is_enabled = hsw_power_well_enabled, 6822 - }; 6823 - 6824 - static struct i915_power_well hsw_power_wells[] = { 6825 - { 6826 - .name = "always-on", 6827 - .always_on = 1, 6828 - .domains = HSW_ALWAYS_ON_POWER_DOMAINS, 6829 - .ops = &i9xx_always_on_power_well_ops, 6830 - }, 6831 - { 6832 - .name = "display", 6833 - .domains = HSW_DISPLAY_POWER_DOMAINS, 6834 - .ops = &hsw_power_well_ops, 6835 - }, 6836 - }; 6837 - 6838 - static struct i915_power_well bdw_power_wells[] = { 6839 - { 6840 - .name = "always-on", 6841 - .always_on = 1, 6842 - .domains = BDW_ALWAYS_ON_POWER_DOMAINS, 6843 - .ops = &i9xx_always_on_power_well_ops, 6844 - }, 6845 - { 6846 - .name = "display", 6847 - .domains = BDW_DISPLAY_POWER_DOMAINS, 6848 - .ops = &hsw_power_well_ops, 6849 - }, 6850 - }; 6851 - 6852 - static const struct i915_power_well_ops vlv_display_power_well_ops = { 6853 - .sync_hw = vlv_power_well_sync_hw, 6854 - .enable = vlv_display_power_well_enable, 6855 - .disable = vlv_display_power_well_disable, 6856 - .is_enabled = vlv_power_well_enabled, 6857 - }; 6858 - 6859 - static const struct i915_power_well_ops vlv_dpio_cmn_power_well_ops = { 6860 - .sync_hw = vlv_power_well_sync_hw, 6861 - .enable = vlv_dpio_cmn_power_well_enable, 6862 - .disable = vlv_dpio_cmn_power_well_disable, 6863 - .is_enabled = vlv_power_well_enabled, 6864 - }; 6865 - 6866 - static const struct i915_power_well_ops vlv_dpio_power_well_ops = { 6867 - .sync_hw = vlv_power_well_sync_hw, 6868 - .enable = vlv_power_well_enable, 6869 - .disable = vlv_power_well_disable, 6870 - .is_enabled = vlv_power_well_enabled, 6871 - }; 6872 - 6873 - static struct i915_power_well vlv_power_wells[] = { 6874 - { 6875 - .name = "always-on", 6876 - .always_on = 1, 6877 - .domains = VLV_ALWAYS_ON_POWER_DOMAINS, 6878 - .ops = &i9xx_always_on_power_well_ops, 6879 - }, 6880 - { 6881 - .name = "display", 6882 - .domains = VLV_DISPLAY_POWER_DOMAINS, 6883 - .data = PUNIT_POWER_WELL_DISP2D, 6884 - .ops = &vlv_display_power_well_ops, 6885 - }, 6886 - { 6887 - .name = "dpio-tx-b-01", 6888 - .domains = VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS | 6889 - VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS | 6890 - VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS | 6891 - VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS, 6892 - .ops = &vlv_dpio_power_well_ops, 6893 - .data = PUNIT_POWER_WELL_DPIO_TX_B_LANES_01, 6894 - }, 6895 - { 6896 - .name = "dpio-tx-b-23", 6897 - .domains = VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS | 6898 - VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS | 6899 - VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS | 6900 - VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS, 6901 - .ops = &vlv_dpio_power_well_ops, 6902 - .data = PUNIT_POWER_WELL_DPIO_TX_B_LANES_23, 6903 - }, 6904 - { 6905 - .name = "dpio-tx-c-01", 6906 - .domains = VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS | 6907 - VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS | 6908 - VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS | 6909 - VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS, 6910 - .ops = &vlv_dpio_power_well_ops, 6911 - .data = PUNIT_POWER_WELL_DPIO_TX_C_LANES_01, 6912 - }, 6913 - { 6914 - .name = "dpio-tx-c-23", 6915 - .domains = VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS | 6916 - VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS | 6917 - VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS | 6918 - VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS, 6919 - .ops = &vlv_dpio_power_well_ops, 6920 - .data = PUNIT_POWER_WELL_DPIO_TX_C_LANES_23, 6921 - }, 6922 - { 6923 - .name = "dpio-common", 6924 - .domains = VLV_DPIO_CMN_BC_POWER_DOMAINS, 6925 - .data = PUNIT_POWER_WELL_DPIO_CMN_BC, 6926 - .ops = &vlv_dpio_cmn_power_well_ops, 6927 - }, 6928 - }; 6929 - 6930 - static struct i915_power_well chv_power_wells[] = { 6931 - { 6932 - .name = "always-on", 6933 - .always_on = 1, 6934 - .domains = VLV_ALWAYS_ON_POWER_DOMAINS, 6935 - .ops = &i9xx_always_on_power_well_ops, 6936 - }, 6937 - #if 0 6938 - { 6939 - .name = "display", 6940 - .domains = VLV_DISPLAY_POWER_DOMAINS, 6941 - .data = PUNIT_POWER_WELL_DISP2D, 6942 - .ops = &vlv_display_power_well_ops, 6943 - }, 6944 - { 6945 - .name = "pipe-a", 6946 - .domains = CHV_PIPE_A_POWER_DOMAINS, 6947 - .data = PIPE_A, 6948 - .ops = &chv_pipe_power_well_ops, 6949 - }, 6950 - { 6951 - .name = "pipe-b", 6952 - .domains = CHV_PIPE_B_POWER_DOMAINS, 6953 - .data = PIPE_B, 6954 - .ops = &chv_pipe_power_well_ops, 6955 - }, 6956 - { 6957 - .name = "pipe-c", 6958 - .domains = CHV_PIPE_C_POWER_DOMAINS, 6959 - .data = PIPE_C, 6960 - .ops = &chv_pipe_power_well_ops, 6961 - }, 6962 - #endif 6963 - { 6964 - .name = "dpio-common-bc", 6965 - /* 6966 - * XXX: cmnreset for one PHY seems to disturb the other. 6967 - * As a workaround keep both powered on at the same 6968 - * time for now. 6969 - */ 6970 - .domains = CHV_DPIO_CMN_BC_POWER_DOMAINS | CHV_DPIO_CMN_D_POWER_DOMAINS, 6971 - .data = PUNIT_POWER_WELL_DPIO_CMN_BC, 6972 - .ops = &chv_dpio_cmn_power_well_ops, 6973 - }, 6974 - { 6975 - .name = "dpio-common-d", 6976 - /* 6977 - * XXX: cmnreset for one PHY seems to disturb the other. 6978 - * As a workaround keep both powered on at the same 6979 - * time for now. 6980 - */ 6981 - .domains = CHV_DPIO_CMN_BC_POWER_DOMAINS | CHV_DPIO_CMN_D_POWER_DOMAINS, 6982 - .data = PUNIT_POWER_WELL_DPIO_CMN_D, 6983 - .ops = &chv_dpio_cmn_power_well_ops, 6984 - }, 6985 - #if 0 6986 - { 6987 - .name = "dpio-tx-b-01", 6988 - .domains = VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS | 6989 - VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS, 6990 - .ops = &vlv_dpio_power_well_ops, 6991 - .data = PUNIT_POWER_WELL_DPIO_TX_B_LANES_01, 6992 - }, 6993 - { 6994 - .name = "dpio-tx-b-23", 6995 - .domains = VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS | 6996 - VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS, 6997 - .ops = &vlv_dpio_power_well_ops, 6998 - .data = PUNIT_POWER_WELL_DPIO_TX_B_LANES_23, 6999 - }, 7000 - { 7001 - .name = "dpio-tx-c-01", 7002 - .domains = VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS | 7003 - VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS, 7004 - .ops = &vlv_dpio_power_well_ops, 7005 - .data = PUNIT_POWER_WELL_DPIO_TX_C_LANES_01, 7006 - }, 7007 - { 7008 - .name = "dpio-tx-c-23", 7009 - .domains = VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS | 7010 - VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS, 7011 - .ops = &vlv_dpio_power_well_ops, 7012 - .data = PUNIT_POWER_WELL_DPIO_TX_C_LANES_23, 7013 - }, 7014 - { 7015 - .name = "dpio-tx-d-01", 7016 - .domains = CHV_DPIO_TX_D_LANES_01_POWER_DOMAINS | 7017 - CHV_DPIO_TX_D_LANES_23_POWER_DOMAINS, 7018 - .ops = &vlv_dpio_power_well_ops, 7019 - .data = PUNIT_POWER_WELL_DPIO_TX_D_LANES_01, 7020 - }, 7021 - { 7022 - .name = "dpio-tx-d-23", 7023 - .domains = CHV_DPIO_TX_D_LANES_01_POWER_DOMAINS | 7024 - CHV_DPIO_TX_D_LANES_23_POWER_DOMAINS, 7025 - .ops = &vlv_dpio_power_well_ops, 7026 - .data = PUNIT_POWER_WELL_DPIO_TX_D_LANES_23, 7027 - }, 7028 - #endif 7029 - }; 7030 - 7031 - static struct i915_power_well *lookup_power_well(struct drm_i915_private *dev_priv, 7032 - enum punit_power_well power_well_id) 7033 - { 7034 - struct i915_power_domains *power_domains = &dev_priv->power_domains; 7035 - struct i915_power_well *power_well; 7036 - int i; 7037 - 7038 - for_each_power_well(i, power_well, POWER_DOMAIN_MASK, power_domains) { 7039 - if (power_well->data == power_well_id) 7040 - return power_well; 7041 - } 7042 - 7043 - return NULL; 7044 - } 7045 - 7046 - #define set_power_wells(power_domains, __power_wells) ({ \ 7047 - (power_domains)->power_wells = (__power_wells); \ 7048 - (power_domains)->power_well_count = ARRAY_SIZE(__power_wells); \ 7049 - }) 7050 - 7051 - int intel_power_domains_init(struct drm_i915_private *dev_priv) 7052 - { 7053 - struct i915_power_domains *power_domains = &dev_priv->power_domains; 7054 - 7055 - mutex_init(&power_domains->lock); 7056 - 7057 - /* 7058 - * The enabling order will be from lower to higher indexed wells, 7059 - * the disabling order is reversed. 7060 - */ 7061 - if (IS_HASWELL(dev_priv->dev)) { 7062 - set_power_wells(power_domains, hsw_power_wells); 7063 - hsw_pwr = power_domains; 7064 - } else if (IS_BROADWELL(dev_priv->dev)) { 7065 - set_power_wells(power_domains, bdw_power_wells); 7066 - hsw_pwr = power_domains; 7067 - } else if (IS_CHERRYVIEW(dev_priv->dev)) { 7068 - set_power_wells(power_domains, chv_power_wells); 7069 - } else if (IS_VALLEYVIEW(dev_priv->dev)) { 7070 - set_power_wells(power_domains, vlv_power_wells); 7071 - } else { 7072 - set_power_wells(power_domains, i9xx_always_on_power_well); 7073 - } 7074 - 7075 - return 0; 7076 - } 7077 - 7078 - void intel_power_domains_remove(struct drm_i915_private *dev_priv) 7079 - { 7080 - hsw_pwr = NULL; 7081 - } 7082 - 7083 - static void intel_power_domains_resume(struct drm_i915_private *dev_priv) 7084 - { 7085 - struct i915_power_domains *power_domains = &dev_priv->power_domains; 7086 - struct i915_power_well *power_well; 7087 - int i; 7088 - 7089 - mutex_lock(&power_domains->lock); 7090 - for_each_power_well(i, power_well, POWER_DOMAIN_MASK, power_domains) { 7091 - power_well->ops->sync_hw(dev_priv, power_well); 7092 - power_well->hw_enabled = power_well->ops->is_enabled(dev_priv, 7093 - power_well); 7094 - } 7095 - mutex_unlock(&power_domains->lock); 7096 - } 7097 - 7098 - static void vlv_cmnlane_wa(struct drm_i915_private *dev_priv) 7099 - { 7100 - struct i915_power_well *cmn = 7101 - lookup_power_well(dev_priv, PUNIT_POWER_WELL_DPIO_CMN_BC); 7102 - struct i915_power_well *disp2d = 7103 - lookup_power_well(dev_priv, PUNIT_POWER_WELL_DISP2D); 7104 - 7105 - /* nothing to do if common lane is already off */ 7106 - if (!cmn->ops->is_enabled(dev_priv, cmn)) 7107 - return; 7108 - 7109 - /* If the display might be already active skip this */ 7110 - if (disp2d->ops->is_enabled(dev_priv, disp2d) && 7111 - I915_READ(DPIO_CTL) & DPIO_CMNRST) 7112 - return; 7113 - 7114 - DRM_DEBUG_KMS("toggling display PHY side reset\n"); 7115 - 7116 - /* cmnlane needs DPLL registers */ 7117 - disp2d->ops->enable(dev_priv, disp2d); 7118 - 7119 - /* 7120 - * From VLV2A0_DP_eDP_HDMI_DPIO_driver_vbios_notes_11.docx: 7121 - * Need to assert and de-assert PHY SB reset by gating the 7122 - * common lane power, then un-gating it. 7123 - * Simply ungating isn't enough to reset the PHY enough to get 7124 - * ports and lanes running. 7125 - */ 7126 - cmn->ops->disable(dev_priv, cmn); 7127 - } 7128 - 7129 - void intel_power_domains_init_hw(struct drm_i915_private *dev_priv) 7130 - { 7131 - struct drm_device *dev = dev_priv->dev; 7132 - struct i915_power_domains *power_domains = &dev_priv->power_domains; 7133 - 7134 - power_domains->initializing = true; 7135 - 7136 - if (IS_VALLEYVIEW(dev) && !IS_CHERRYVIEW(dev)) { 7137 - mutex_lock(&power_domains->lock); 7138 - vlv_cmnlane_wa(dev_priv); 7139 - mutex_unlock(&power_domains->lock); 7140 - } 7141 - 7142 - /* For now, we need the power well to be always enabled. */ 7143 - intel_display_set_init_power(dev_priv, true); 7144 - intel_power_domains_resume(dev_priv); 7145 - power_domains->initializing = false; 7146 - } 7147 - 7148 - void intel_aux_display_runtime_get(struct drm_i915_private *dev_priv) 7149 - { 7150 - intel_runtime_pm_get(dev_priv); 7151 - } 7152 - 7153 - void intel_aux_display_runtime_put(struct drm_i915_private *dev_priv) 7154 - { 7155 - intel_runtime_pm_put(dev_priv); 7156 - } 7157 - 7158 - void intel_runtime_pm_get(struct drm_i915_private *dev_priv) 7159 - { 7160 - struct drm_device *dev = dev_priv->dev; 7161 - struct device *device = &dev->pdev->dev; 7162 - 7163 - if (!HAS_RUNTIME_PM(dev)) 7164 - return; 7165 - 7166 - pm_runtime_get_sync(device); 7167 - WARN(dev_priv->pm.suspended, "Device still suspended.\n"); 7168 - } 7169 - 7170 - void intel_runtime_pm_get_noresume(struct drm_i915_private *dev_priv) 7171 - { 7172 - struct drm_device *dev = dev_priv->dev; 7173 - struct device *device = &dev->pdev->dev; 7174 - 7175 - if (!HAS_RUNTIME_PM(dev)) 7176 - return; 7177 - 7178 - WARN(dev_priv->pm.suspended, "Getting nosync-ref while suspended.\n"); 7179 - pm_runtime_get_noresume(device); 7180 - } 7181 - 7182 - void intel_runtime_pm_put(struct drm_i915_private *dev_priv) 7183 - { 7184 - struct drm_device *dev = dev_priv->dev; 7185 - struct device *device = &dev->pdev->dev; 7186 - 7187 - if (!HAS_RUNTIME_PM(dev)) 7188 - return; 7189 - 7190 - pm_runtime_mark_last_busy(device); 7191 - pm_runtime_put_autosuspend(device); 7192 - } 7193 - 7194 - void intel_init_runtime_pm(struct drm_i915_private *dev_priv) 7195 - { 7196 - struct drm_device *dev = dev_priv->dev; 7197 - struct device *device = &dev->pdev->dev; 7198 - 7199 - if (!HAS_RUNTIME_PM(dev)) 7200 - return; 7201 - 7202 - pm_runtime_set_active(device); 7203 - 7204 - /* 7205 - * RPM depends on RC6 to save restore the GT HW context, so make RC6 a 7206 - * requirement. 7207 - */ 7208 - if (!intel_enable_rc6(dev)) { 7209 - DRM_INFO("RC6 disabled, disabling runtime PM support\n"); 7210 - return; 7211 - } 7212 - 7213 - pm_runtime_set_autosuspend_delay(device, 10000); /* 10s */ 7214 - pm_runtime_mark_last_busy(device); 7215 - pm_runtime_use_autosuspend(device); 7216 - 7217 - pm_runtime_put_autosuspend(device); 7218 - } 7219 - 7220 - void intel_fini_runtime_pm(struct drm_i915_private *dev_priv) 7221 - { 7222 - struct drm_device *dev = dev_priv->dev; 7223 - struct device *device = &dev->pdev->dev; 7224 - 7225 - if (!HAS_RUNTIME_PM(dev)) 7226 - return; 7227 - 7228 - if (!intel_enable_rc6(dev)) 7229 - return; 7230 - 7231 - /* Make sure we're not suspended first. */ 7232 - pm_runtime_get_sync(device); 7233 - pm_runtime_disable(device); 6072 + dev_priv->fbc.enabled = dev_priv->display.fbc_enabled(dev_priv->dev); 7234 6073 } 7235 6074 7236 6075 /* Set up chip specific power management-related functions */ ··· 6112 7203 { 6113 7204 struct drm_i915_private *dev_priv = dev->dev_private; 6114 7205 6115 - if (HAS_FBC(dev)) { 6116 - if (INTEL_INFO(dev)->gen >= 7) { 6117 - dev_priv->display.fbc_enabled = ironlake_fbc_enabled; 6118 - dev_priv->display.enable_fbc = gen7_enable_fbc; 6119 - dev_priv->display.disable_fbc = ironlake_disable_fbc; 6120 - } else if (INTEL_INFO(dev)->gen >= 5) { 6121 - dev_priv->display.fbc_enabled = ironlake_fbc_enabled; 6122 - dev_priv->display.enable_fbc = ironlake_enable_fbc; 6123 - dev_priv->display.disable_fbc = ironlake_disable_fbc; 6124 - } else if (IS_GM45(dev)) { 6125 - dev_priv->display.fbc_enabled = g4x_fbc_enabled; 6126 - dev_priv->display.enable_fbc = g4x_enable_fbc; 6127 - dev_priv->display.disable_fbc = g4x_disable_fbc; 6128 - } else { 6129 - dev_priv->display.fbc_enabled = i8xx_fbc_enabled; 6130 - dev_priv->display.enable_fbc = i8xx_enable_fbc; 6131 - dev_priv->display.disable_fbc = i8xx_disable_fbc; 6132 - 6133 - /* This value was pulled out of someone's hat */ 6134 - I915_WRITE(FBC_CONTROL, 500 << FBC_CTL_INTERVAL_SHIFT); 6135 - } 6136 - } 7206 + intel_init_fbc(dev_priv); 6137 7207 6138 7208 /* For cxsr */ 6139 7209 if (IS_PINEVIEW(dev)) ··· 6121 7233 i915_ironlake_get_mem_freq(dev); 6122 7234 6123 7235 /* For FIFO watermark updates */ 6124 - if (HAS_PCH_SPLIT(dev)) { 7236 + if (IS_GEN9(dev)) { 7237 + dev_priv->display.init_clock_gating = gen9_init_clock_gating; 7238 + } else if (HAS_PCH_SPLIT(dev)) { 6125 7239 ilk_setup_wm_latency(dev); 6126 7240 6127 7241 if ((IS_GEN5(dev) && dev_priv->wm.pri_latency[1] && ··· 6380 7490 intel_gen6_powersave_work); 6381 7491 6382 7492 dev_priv->pm.suspended = false; 6383 - dev_priv->pm._irqs_disabled = false; 6384 7493 }
+20 -14
drivers/gpu/drm/i915/intel_ringbuffer.c
··· 729 729 * workaround for for a possible hang in the unlikely event a TLB 730 730 * invalidation occurs during a PSD flush. 731 731 */ 732 + /* WaDisableFenceDestinationToSLM:bdw (GT3 pre-production) */ 732 733 intel_ring_emit_wa(ring, HDC_CHICKEN0, 733 - _MASKED_BIT_ENABLE(HDC_FORCE_NON_COHERENT)); 734 + _MASKED_BIT_ENABLE(HDC_FORCE_NON_COHERENT | 735 + (IS_BDW_GT3(dev) ? 736 + HDC_FENCE_DEST_SLM_DISABLE : 0) 737 + )); 734 738 735 739 /* Wa4x4STCOptimizationDisable:bdw */ 736 740 intel_ring_emit_wa(ring, CACHE_MODE_1, ··· 816 812 * 817 813 * WaDisableAsyncFlipPerfMode:snb,ivb,hsw,vlv,bdw,chv 818 814 */ 819 - if (INTEL_INFO(dev)->gen >= 6) 815 + if (INTEL_INFO(dev)->gen >= 6 && INTEL_INFO(dev)->gen < 9) 820 816 I915_WRITE(MI_MODE, _MASKED_BIT_ENABLE(ASYNC_FLIP_PERF_DISABLE)); 821 817 822 818 /* Required for the hardware to program scanline values for waiting */ ··· 1190 1186 struct drm_i915_private *dev_priv = dev->dev_private; 1191 1187 unsigned long flags; 1192 1188 1193 - if (!dev->irq_enabled) 1189 + if (WARN_ON(!intel_irqs_enabled(dev_priv))) 1194 1190 return false; 1195 1191 1196 1192 spin_lock_irqsave(&dev_priv->irq_lock, flags); ··· 1221 1217 struct drm_i915_private *dev_priv = dev->dev_private; 1222 1218 unsigned long flags; 1223 1219 1224 - if (!dev->irq_enabled) 1220 + if (!intel_irqs_enabled(dev_priv)) 1225 1221 return false; 1226 1222 1227 1223 spin_lock_irqsave(&dev_priv->irq_lock, flags); ··· 1258 1254 struct drm_i915_private *dev_priv = dev->dev_private; 1259 1255 unsigned long flags; 1260 1256 1261 - if (!dev->irq_enabled) 1257 + if (!intel_irqs_enabled(dev_priv)) 1262 1258 return false; 1263 1259 1264 1260 spin_lock_irqsave(&dev_priv->irq_lock, flags); ··· 1392 1388 struct drm_i915_private *dev_priv = dev->dev_private; 1393 1389 unsigned long flags; 1394 1390 1395 - if (!dev->irq_enabled) 1396 - return false; 1391 + if (WARN_ON(!intel_irqs_enabled(dev_priv))) 1392 + return false; 1397 1393 1398 1394 spin_lock_irqsave(&dev_priv->irq_lock, flags); 1399 1395 if (ring->irq_refcount++ == 0) { ··· 1435 1431 struct drm_i915_private *dev_priv = dev->dev_private; 1436 1432 unsigned long flags; 1437 1433 1438 - if (!dev->irq_enabled) 1434 + if (WARN_ON(!intel_irqs_enabled(dev_priv))) 1439 1435 return false; 1440 1436 1441 1437 spin_lock_irqsave(&dev_priv->irq_lock, flags); ··· 1455 1451 struct drm_i915_private *dev_priv = dev->dev_private; 1456 1452 unsigned long flags; 1457 1453 1458 - if (!dev->irq_enabled) 1459 - return; 1460 - 1461 1454 spin_lock_irqsave(&dev_priv->irq_lock, flags); 1462 1455 if (--ring->irq_refcount == 0) { 1463 1456 I915_WRITE_IMR(ring, ~0); ··· 1470 1469 struct drm_i915_private *dev_priv = dev->dev_private; 1471 1470 unsigned long flags; 1472 1471 1473 - if (!dev->irq_enabled) 1472 + if (WARN_ON(!intel_irqs_enabled(dev_priv))) 1474 1473 return false; 1475 1474 1476 1475 spin_lock_irqsave(&dev_priv->irq_lock, flags); ··· 2230 2229 u32 invalidate, u32 flush) 2231 2230 { 2232 2231 struct drm_device *dev = ring->dev; 2232 + struct drm_i915_private *dev_priv = dev->dev_private; 2233 2233 uint32_t cmd; 2234 2234 int ret; 2235 2235 ··· 2261 2259 } 2262 2260 intel_ring_advance(ring); 2263 2261 2264 - if (IS_GEN7(dev) && !invalidate && flush) 2265 - return gen7_ring_fbc_flush(ring, FBC_REND_CACHE_CLEAN); 2262 + if (!invalidate && flush) { 2263 + if (IS_GEN7(dev)) 2264 + return gen7_ring_fbc_flush(ring, FBC_REND_CACHE_CLEAN); 2265 + else if (IS_BROADWELL(dev)) 2266 + dev_priv->fbc.need_sw_cache_clean = true; 2267 + } 2266 2268 2267 2269 return 0; 2268 2270 }
+1375
drivers/gpu/drm/i915/intel_runtime_pm.c
··· 1 + /* 2 + * Copyright © 2012-2014 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 20 + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 21 + * IN THE SOFTWARE. 22 + * 23 + * Authors: 24 + * Eugeni Dodonov <eugeni.dodonov@intel.com> 25 + * Daniel Vetter <daniel.vetter@ffwll.ch> 26 + * 27 + */ 28 + 29 + #include <linux/pm_runtime.h> 30 + #include <linux/vgaarb.h> 31 + 32 + #include "i915_drv.h" 33 + #include "intel_drv.h" 34 + #include <drm/i915_powerwell.h> 35 + 36 + /** 37 + * DOC: runtime pm 38 + * 39 + * The i915 driver supports dynamic enabling and disabling of entire hardware 40 + * blocks at runtime. This is especially important on the display side where 41 + * software is supposed to control many power gates manually on recent hardware, 42 + * since on the GT side a lot of the power management is done by the hardware. 43 + * But even there some manual control at the device level is required. 44 + * 45 + * Since i915 supports a diverse set of platforms with a unified codebase and 46 + * hardware engineers just love to shuffle functionality around between power 47 + * domains there's a sizeable amount of indirection required. This file provides 48 + * generic functions to the driver for grabbing and releasing references for 49 + * abstract power domains. It then maps those to the actual power wells 50 + * present for a given platform. 51 + */ 52 + 53 + static struct i915_power_domains *hsw_pwr; 54 + 55 + #define for_each_power_well(i, power_well, domain_mask, power_domains) \ 56 + for (i = 0; \ 57 + i < (power_domains)->power_well_count && \ 58 + ((power_well) = &(power_domains)->power_wells[i]); \ 59 + i++) \ 60 + if ((power_well)->domains & (domain_mask)) 61 + 62 + #define for_each_power_well_rev(i, power_well, domain_mask, power_domains) \ 63 + for (i = (power_domains)->power_well_count - 1; \ 64 + i >= 0 && ((power_well) = &(power_domains)->power_wells[i]);\ 65 + i--) \ 66 + if ((power_well)->domains & (domain_mask)) 67 + 68 + /* 69 + * We should only use the power well if we explicitly asked the hardware to 70 + * enable it, so check if it's enabled and also check if we've requested it to 71 + * be enabled. 72 + */ 73 + static bool hsw_power_well_enabled(struct drm_i915_private *dev_priv, 74 + struct i915_power_well *power_well) 75 + { 76 + return I915_READ(HSW_PWR_WELL_DRIVER) == 77 + (HSW_PWR_WELL_ENABLE_REQUEST | HSW_PWR_WELL_STATE_ENABLED); 78 + } 79 + 80 + /** 81 + * __intel_display_power_is_enabled - unlocked check for a power domain 82 + * @dev_priv: i915 device instance 83 + * @domain: power domain to check 84 + * 85 + * This is the unlocked version of intel_display_power_is_enabled() and should 86 + * only be used from error capture and recovery code where deadlocks are 87 + * possible. 88 + * 89 + * Returns: 90 + * True when the power domain is enabled, false otherwise. 91 + */ 92 + bool __intel_display_power_is_enabled(struct drm_i915_private *dev_priv, 93 + enum intel_display_power_domain domain) 94 + { 95 + struct i915_power_domains *power_domains; 96 + struct i915_power_well *power_well; 97 + bool is_enabled; 98 + int i; 99 + 100 + if (dev_priv->pm.suspended) 101 + return false; 102 + 103 + power_domains = &dev_priv->power_domains; 104 + 105 + is_enabled = true; 106 + 107 + for_each_power_well_rev(i, power_well, BIT(domain), power_domains) { 108 + if (power_well->always_on) 109 + continue; 110 + 111 + if (!power_well->hw_enabled) { 112 + is_enabled = false; 113 + break; 114 + } 115 + } 116 + 117 + return is_enabled; 118 + } 119 + 120 + /** 121 + * intel_display_power_is_enabled - unlocked check for a power domain 122 + * @dev_priv: i915 device instance 123 + * @domain: power domain to check 124 + * 125 + * This function can be used to check the hw power domain state. It is mostly 126 + * used in hardware state readout functions. Everywhere else code should rely 127 + * upon explicit power domain reference counting to ensure that the hardware 128 + * block is powered up before accessing it. 129 + * 130 + * Callers must hold the relevant modesetting locks to ensure that concurrent 131 + * threads can't disable the power well while the caller tries to read a few 132 + * registers. 133 + * 134 + * Returns: 135 + * True when the power domain is enabled, false otherwise. 136 + */ 137 + bool intel_display_power_is_enabled(struct drm_i915_private *dev_priv, 138 + enum intel_display_power_domain domain) 139 + { 140 + struct i915_power_domains *power_domains; 141 + bool ret; 142 + 143 + power_domains = &dev_priv->power_domains; 144 + 145 + mutex_lock(&power_domains->lock); 146 + ret = __intel_display_power_is_enabled(dev_priv, domain); 147 + mutex_unlock(&power_domains->lock); 148 + 149 + return ret; 150 + } 151 + 152 + /** 153 + * intel_display_set_init_power - set the initial power domain state 154 + * @dev_priv: i915 device instance 155 + * @enable: whether to enable or disable the initial power domain state 156 + * 157 + * For simplicity our driver load/unload and system suspend/resume code assumes 158 + * that all power domains are always enabled. This functions controls the state 159 + * of this little hack. While the initial power domain state is enabled runtime 160 + * pm is effectively disabled. 161 + */ 162 + void intel_display_set_init_power(struct drm_i915_private *dev_priv, 163 + bool enable) 164 + { 165 + if (dev_priv->power_domains.init_power_on == enable) 166 + return; 167 + 168 + if (enable) 169 + intel_display_power_get(dev_priv, POWER_DOMAIN_INIT); 170 + else 171 + intel_display_power_put(dev_priv, POWER_DOMAIN_INIT); 172 + 173 + dev_priv->power_domains.init_power_on = enable; 174 + } 175 + 176 + /* 177 + * Starting with Haswell, we have a "Power Down Well" that can be turned off 178 + * when not needed anymore. We have 4 registers that can request the power well 179 + * to be enabled, and it will only be disabled if none of the registers is 180 + * requesting it to be enabled. 181 + */ 182 + static void hsw_power_well_post_enable(struct drm_i915_private *dev_priv) 183 + { 184 + struct drm_device *dev = dev_priv->dev; 185 + 186 + /* 187 + * After we re-enable the power well, if we touch VGA register 0x3d5 188 + * we'll get unclaimed register interrupts. This stops after we write 189 + * anything to the VGA MSR register. The vgacon module uses this 190 + * register all the time, so if we unbind our driver and, as a 191 + * consequence, bind vgacon, we'll get stuck in an infinite loop at 192 + * console_unlock(). So make here we touch the VGA MSR register, making 193 + * sure vgacon can keep working normally without triggering interrupts 194 + * and error messages. 195 + */ 196 + vga_get_uninterruptible(dev->pdev, VGA_RSRC_LEGACY_IO); 197 + outb(inb(VGA_MSR_READ), VGA_MSR_WRITE); 198 + vga_put(dev->pdev, VGA_RSRC_LEGACY_IO); 199 + 200 + if (IS_BROADWELL(dev) || (INTEL_INFO(dev)->gen >= 9)) 201 + gen8_irq_power_well_post_enable(dev_priv); 202 + } 203 + 204 + static void hsw_set_power_well(struct drm_i915_private *dev_priv, 205 + struct i915_power_well *power_well, bool enable) 206 + { 207 + bool is_enabled, enable_requested; 208 + uint32_t tmp; 209 + 210 + tmp = I915_READ(HSW_PWR_WELL_DRIVER); 211 + is_enabled = tmp & HSW_PWR_WELL_STATE_ENABLED; 212 + enable_requested = tmp & HSW_PWR_WELL_ENABLE_REQUEST; 213 + 214 + if (enable) { 215 + if (!enable_requested) 216 + I915_WRITE(HSW_PWR_WELL_DRIVER, 217 + HSW_PWR_WELL_ENABLE_REQUEST); 218 + 219 + if (!is_enabled) { 220 + DRM_DEBUG_KMS("Enabling power well\n"); 221 + if (wait_for((I915_READ(HSW_PWR_WELL_DRIVER) & 222 + HSW_PWR_WELL_STATE_ENABLED), 20)) 223 + DRM_ERROR("Timeout enabling power well\n"); 224 + } 225 + 226 + hsw_power_well_post_enable(dev_priv); 227 + } else { 228 + if (enable_requested) { 229 + I915_WRITE(HSW_PWR_WELL_DRIVER, 0); 230 + POSTING_READ(HSW_PWR_WELL_DRIVER); 231 + DRM_DEBUG_KMS("Requesting to disable the power well\n"); 232 + } 233 + } 234 + } 235 + 236 + static void hsw_power_well_sync_hw(struct drm_i915_private *dev_priv, 237 + struct i915_power_well *power_well) 238 + { 239 + hsw_set_power_well(dev_priv, power_well, power_well->count > 0); 240 + 241 + /* 242 + * We're taking over the BIOS, so clear any requests made by it since 243 + * the driver is in charge now. 244 + */ 245 + if (I915_READ(HSW_PWR_WELL_BIOS) & HSW_PWR_WELL_ENABLE_REQUEST) 246 + I915_WRITE(HSW_PWR_WELL_BIOS, 0); 247 + } 248 + 249 + static void hsw_power_well_enable(struct drm_i915_private *dev_priv, 250 + struct i915_power_well *power_well) 251 + { 252 + hsw_set_power_well(dev_priv, power_well, true); 253 + } 254 + 255 + static void hsw_power_well_disable(struct drm_i915_private *dev_priv, 256 + struct i915_power_well *power_well) 257 + { 258 + hsw_set_power_well(dev_priv, power_well, false); 259 + } 260 + 261 + static void i9xx_always_on_power_well_noop(struct drm_i915_private *dev_priv, 262 + struct i915_power_well *power_well) 263 + { 264 + } 265 + 266 + static bool i9xx_always_on_power_well_enabled(struct drm_i915_private *dev_priv, 267 + struct i915_power_well *power_well) 268 + { 269 + return true; 270 + } 271 + 272 + static void vlv_set_power_well(struct drm_i915_private *dev_priv, 273 + struct i915_power_well *power_well, bool enable) 274 + { 275 + enum punit_power_well power_well_id = power_well->data; 276 + u32 mask; 277 + u32 state; 278 + u32 ctrl; 279 + 280 + mask = PUNIT_PWRGT_MASK(power_well_id); 281 + state = enable ? PUNIT_PWRGT_PWR_ON(power_well_id) : 282 + PUNIT_PWRGT_PWR_GATE(power_well_id); 283 + 284 + mutex_lock(&dev_priv->rps.hw_lock); 285 + 286 + #define COND \ 287 + ((vlv_punit_read(dev_priv, PUNIT_REG_PWRGT_STATUS) & mask) == state) 288 + 289 + if (COND) 290 + goto out; 291 + 292 + ctrl = vlv_punit_read(dev_priv, PUNIT_REG_PWRGT_CTRL); 293 + ctrl &= ~mask; 294 + ctrl |= state; 295 + vlv_punit_write(dev_priv, PUNIT_REG_PWRGT_CTRL, ctrl); 296 + 297 + if (wait_for(COND, 100)) 298 + DRM_ERROR("timout setting power well state %08x (%08x)\n", 299 + state, 300 + vlv_punit_read(dev_priv, PUNIT_REG_PWRGT_CTRL)); 301 + 302 + #undef COND 303 + 304 + out: 305 + mutex_unlock(&dev_priv->rps.hw_lock); 306 + } 307 + 308 + static void vlv_power_well_sync_hw(struct drm_i915_private *dev_priv, 309 + struct i915_power_well *power_well) 310 + { 311 + vlv_set_power_well(dev_priv, power_well, power_well->count > 0); 312 + } 313 + 314 + static void vlv_power_well_enable(struct drm_i915_private *dev_priv, 315 + struct i915_power_well *power_well) 316 + { 317 + vlv_set_power_well(dev_priv, power_well, true); 318 + } 319 + 320 + static void vlv_power_well_disable(struct drm_i915_private *dev_priv, 321 + struct i915_power_well *power_well) 322 + { 323 + vlv_set_power_well(dev_priv, power_well, false); 324 + } 325 + 326 + static bool vlv_power_well_enabled(struct drm_i915_private *dev_priv, 327 + struct i915_power_well *power_well) 328 + { 329 + int power_well_id = power_well->data; 330 + bool enabled = false; 331 + u32 mask; 332 + u32 state; 333 + u32 ctrl; 334 + 335 + mask = PUNIT_PWRGT_MASK(power_well_id); 336 + ctrl = PUNIT_PWRGT_PWR_ON(power_well_id); 337 + 338 + mutex_lock(&dev_priv->rps.hw_lock); 339 + 340 + state = vlv_punit_read(dev_priv, PUNIT_REG_PWRGT_STATUS) & mask; 341 + /* 342 + * We only ever set the power-on and power-gate states, anything 343 + * else is unexpected. 344 + */ 345 + WARN_ON(state != PUNIT_PWRGT_PWR_ON(power_well_id) && 346 + state != PUNIT_PWRGT_PWR_GATE(power_well_id)); 347 + if (state == ctrl) 348 + enabled = true; 349 + 350 + /* 351 + * A transient state at this point would mean some unexpected party 352 + * is poking at the power controls too. 353 + */ 354 + ctrl = vlv_punit_read(dev_priv, PUNIT_REG_PWRGT_CTRL) & mask; 355 + WARN_ON(ctrl != state); 356 + 357 + mutex_unlock(&dev_priv->rps.hw_lock); 358 + 359 + return enabled; 360 + } 361 + 362 + static void vlv_display_power_well_enable(struct drm_i915_private *dev_priv, 363 + struct i915_power_well *power_well) 364 + { 365 + WARN_ON_ONCE(power_well->data != PUNIT_POWER_WELL_DISP2D); 366 + 367 + vlv_set_power_well(dev_priv, power_well, true); 368 + 369 + spin_lock_irq(&dev_priv->irq_lock); 370 + valleyview_enable_display_irqs(dev_priv); 371 + spin_unlock_irq(&dev_priv->irq_lock); 372 + 373 + /* 374 + * During driver initialization/resume we can avoid restoring the 375 + * part of the HW/SW state that will be inited anyway explicitly. 376 + */ 377 + if (dev_priv->power_domains.initializing) 378 + return; 379 + 380 + intel_hpd_init(dev_priv); 381 + 382 + i915_redisable_vga_power_on(dev_priv->dev); 383 + } 384 + 385 + static void vlv_display_power_well_disable(struct drm_i915_private *dev_priv, 386 + struct i915_power_well *power_well) 387 + { 388 + WARN_ON_ONCE(power_well->data != PUNIT_POWER_WELL_DISP2D); 389 + 390 + spin_lock_irq(&dev_priv->irq_lock); 391 + valleyview_disable_display_irqs(dev_priv); 392 + spin_unlock_irq(&dev_priv->irq_lock); 393 + 394 + vlv_set_power_well(dev_priv, power_well, false); 395 + 396 + vlv_power_sequencer_reset(dev_priv); 397 + } 398 + 399 + static void vlv_dpio_cmn_power_well_enable(struct drm_i915_private *dev_priv, 400 + struct i915_power_well *power_well) 401 + { 402 + WARN_ON_ONCE(power_well->data != PUNIT_POWER_WELL_DPIO_CMN_BC); 403 + 404 + /* 405 + * Enable the CRI clock source so we can get at the 406 + * display and the reference clock for VGA 407 + * hotplug / manual detection. 408 + */ 409 + I915_WRITE(DPLL(PIPE_B), I915_READ(DPLL(PIPE_B)) | 410 + DPLL_REFA_CLK_ENABLE_VLV | DPLL_INTEGRATED_CRI_CLK_VLV); 411 + udelay(1); /* >10ns for cmnreset, >0ns for sidereset */ 412 + 413 + vlv_set_power_well(dev_priv, power_well, true); 414 + 415 + /* 416 + * From VLV2A0_DP_eDP_DPIO_driver_vbios_notes_10.docx - 417 + * 6. De-assert cmn_reset/side_reset. Same as VLV X0. 418 + * a. GUnit 0x2110 bit[0] set to 1 (def 0) 419 + * b. The other bits such as sfr settings / modesel may all 420 + * be set to 0. 421 + * 422 + * This should only be done on init and resume from S3 with 423 + * both PLLs disabled, or we risk losing DPIO and PLL 424 + * synchronization. 425 + */ 426 + I915_WRITE(DPIO_CTL, I915_READ(DPIO_CTL) | DPIO_CMNRST); 427 + } 428 + 429 + static void vlv_dpio_cmn_power_well_disable(struct drm_i915_private *dev_priv, 430 + struct i915_power_well *power_well) 431 + { 432 + enum pipe pipe; 433 + 434 + WARN_ON_ONCE(power_well->data != PUNIT_POWER_WELL_DPIO_CMN_BC); 435 + 436 + for_each_pipe(dev_priv, pipe) 437 + assert_pll_disabled(dev_priv, pipe); 438 + 439 + /* Assert common reset */ 440 + I915_WRITE(DPIO_CTL, I915_READ(DPIO_CTL) & ~DPIO_CMNRST); 441 + 442 + vlv_set_power_well(dev_priv, power_well, false); 443 + } 444 + 445 + static void chv_dpio_cmn_power_well_enable(struct drm_i915_private *dev_priv, 446 + struct i915_power_well *power_well) 447 + { 448 + enum dpio_phy phy; 449 + 450 + WARN_ON_ONCE(power_well->data != PUNIT_POWER_WELL_DPIO_CMN_BC && 451 + power_well->data != PUNIT_POWER_WELL_DPIO_CMN_D); 452 + 453 + /* 454 + * Enable the CRI clock source so we can get at the 455 + * display and the reference clock for VGA 456 + * hotplug / manual detection. 457 + */ 458 + if (power_well->data == PUNIT_POWER_WELL_DPIO_CMN_BC) { 459 + phy = DPIO_PHY0; 460 + I915_WRITE(DPLL(PIPE_B), I915_READ(DPLL(PIPE_B)) | 461 + DPLL_REFA_CLK_ENABLE_VLV); 462 + I915_WRITE(DPLL(PIPE_B), I915_READ(DPLL(PIPE_B)) | 463 + DPLL_REFA_CLK_ENABLE_VLV | DPLL_INTEGRATED_CRI_CLK_VLV); 464 + } else { 465 + phy = DPIO_PHY1; 466 + I915_WRITE(DPLL(PIPE_C), I915_READ(DPLL(PIPE_C)) | 467 + DPLL_REFA_CLK_ENABLE_VLV | DPLL_INTEGRATED_CRI_CLK_VLV); 468 + } 469 + udelay(1); /* >10ns for cmnreset, >0ns for sidereset */ 470 + vlv_set_power_well(dev_priv, power_well, true); 471 + 472 + /* Poll for phypwrgood signal */ 473 + if (wait_for(I915_READ(DISPLAY_PHY_STATUS) & PHY_POWERGOOD(phy), 1)) 474 + DRM_ERROR("Display PHY %d is not power up\n", phy); 475 + 476 + I915_WRITE(DISPLAY_PHY_CONTROL, I915_READ(DISPLAY_PHY_CONTROL) | 477 + PHY_COM_LANE_RESET_DEASSERT(phy)); 478 + } 479 + 480 + static void chv_dpio_cmn_power_well_disable(struct drm_i915_private *dev_priv, 481 + struct i915_power_well *power_well) 482 + { 483 + enum dpio_phy phy; 484 + 485 + WARN_ON_ONCE(power_well->data != PUNIT_POWER_WELL_DPIO_CMN_BC && 486 + power_well->data != PUNIT_POWER_WELL_DPIO_CMN_D); 487 + 488 + if (power_well->data == PUNIT_POWER_WELL_DPIO_CMN_BC) { 489 + phy = DPIO_PHY0; 490 + assert_pll_disabled(dev_priv, PIPE_A); 491 + assert_pll_disabled(dev_priv, PIPE_B); 492 + } else { 493 + phy = DPIO_PHY1; 494 + assert_pll_disabled(dev_priv, PIPE_C); 495 + } 496 + 497 + I915_WRITE(DISPLAY_PHY_CONTROL, I915_READ(DISPLAY_PHY_CONTROL) & 498 + ~PHY_COM_LANE_RESET_DEASSERT(phy)); 499 + 500 + vlv_set_power_well(dev_priv, power_well, false); 501 + } 502 + 503 + static bool chv_pipe_power_well_enabled(struct drm_i915_private *dev_priv, 504 + struct i915_power_well *power_well) 505 + { 506 + enum pipe pipe = power_well->data; 507 + bool enabled; 508 + u32 state, ctrl; 509 + 510 + mutex_lock(&dev_priv->rps.hw_lock); 511 + 512 + state = vlv_punit_read(dev_priv, PUNIT_REG_DSPFREQ) & DP_SSS_MASK(pipe); 513 + /* 514 + * We only ever set the power-on and power-gate states, anything 515 + * else is unexpected. 516 + */ 517 + WARN_ON(state != DP_SSS_PWR_ON(pipe) && state != DP_SSS_PWR_GATE(pipe)); 518 + enabled = state == DP_SSS_PWR_ON(pipe); 519 + 520 + /* 521 + * A transient state at this point would mean some unexpected party 522 + * is poking at the power controls too. 523 + */ 524 + ctrl = vlv_punit_read(dev_priv, PUNIT_REG_DSPFREQ) & DP_SSC_MASK(pipe); 525 + WARN_ON(ctrl << 16 != state); 526 + 527 + mutex_unlock(&dev_priv->rps.hw_lock); 528 + 529 + return enabled; 530 + } 531 + 532 + static void chv_set_pipe_power_well(struct drm_i915_private *dev_priv, 533 + struct i915_power_well *power_well, 534 + bool enable) 535 + { 536 + enum pipe pipe = power_well->data; 537 + u32 state; 538 + u32 ctrl; 539 + 540 + state = enable ? DP_SSS_PWR_ON(pipe) : DP_SSS_PWR_GATE(pipe); 541 + 542 + mutex_lock(&dev_priv->rps.hw_lock); 543 + 544 + #define COND \ 545 + ((vlv_punit_read(dev_priv, PUNIT_REG_DSPFREQ) & DP_SSS_MASK(pipe)) == state) 546 + 547 + if (COND) 548 + goto out; 549 + 550 + ctrl = vlv_punit_read(dev_priv, PUNIT_REG_DSPFREQ); 551 + ctrl &= ~DP_SSC_MASK(pipe); 552 + ctrl |= enable ? DP_SSC_PWR_ON(pipe) : DP_SSC_PWR_GATE(pipe); 553 + vlv_punit_write(dev_priv, PUNIT_REG_DSPFREQ, ctrl); 554 + 555 + if (wait_for(COND, 100)) 556 + DRM_ERROR("timout setting power well state %08x (%08x)\n", 557 + state, 558 + vlv_punit_read(dev_priv, PUNIT_REG_DSPFREQ)); 559 + 560 + #undef COND 561 + 562 + out: 563 + mutex_unlock(&dev_priv->rps.hw_lock); 564 + } 565 + 566 + static void chv_pipe_power_well_sync_hw(struct drm_i915_private *dev_priv, 567 + struct i915_power_well *power_well) 568 + { 569 + chv_set_pipe_power_well(dev_priv, power_well, power_well->count > 0); 570 + } 571 + 572 + static void chv_pipe_power_well_enable(struct drm_i915_private *dev_priv, 573 + struct i915_power_well *power_well) 574 + { 575 + WARN_ON_ONCE(power_well->data != PIPE_A && 576 + power_well->data != PIPE_B && 577 + power_well->data != PIPE_C); 578 + 579 + chv_set_pipe_power_well(dev_priv, power_well, true); 580 + } 581 + 582 + static void chv_pipe_power_well_disable(struct drm_i915_private *dev_priv, 583 + struct i915_power_well *power_well) 584 + { 585 + WARN_ON_ONCE(power_well->data != PIPE_A && 586 + power_well->data != PIPE_B && 587 + power_well->data != PIPE_C); 588 + 589 + chv_set_pipe_power_well(dev_priv, power_well, false); 590 + } 591 + 592 + static void check_power_well_state(struct drm_i915_private *dev_priv, 593 + struct i915_power_well *power_well) 594 + { 595 + bool enabled = power_well->ops->is_enabled(dev_priv, power_well); 596 + 597 + if (power_well->always_on || !i915.disable_power_well) { 598 + if (!enabled) 599 + goto mismatch; 600 + 601 + return; 602 + } 603 + 604 + if (enabled != (power_well->count > 0)) 605 + goto mismatch; 606 + 607 + return; 608 + 609 + mismatch: 610 + WARN(1, "state mismatch for '%s' (always_on %d hw state %d use-count %d disable_power_well %d\n", 611 + power_well->name, power_well->always_on, enabled, 612 + power_well->count, i915.disable_power_well); 613 + } 614 + 615 + /** 616 + * intel_display_power_get - grab a power domain reference 617 + * @dev_priv: i915 device instance 618 + * @domain: power domain to reference 619 + * 620 + * This function grabs a power domain reference for @domain and ensures that the 621 + * power domain and all its parents are powered up. Therefore users should only 622 + * grab a reference to the innermost power domain they need. 623 + * 624 + * Any power domain reference obtained by this function must have a symmetric 625 + * call to intel_display_power_put() to release the reference again. 626 + */ 627 + void intel_display_power_get(struct drm_i915_private *dev_priv, 628 + enum intel_display_power_domain domain) 629 + { 630 + struct i915_power_domains *power_domains; 631 + struct i915_power_well *power_well; 632 + int i; 633 + 634 + intel_runtime_pm_get(dev_priv); 635 + 636 + power_domains = &dev_priv->power_domains; 637 + 638 + mutex_lock(&power_domains->lock); 639 + 640 + for_each_power_well(i, power_well, BIT(domain), power_domains) { 641 + if (!power_well->count++) { 642 + DRM_DEBUG_KMS("enabling %s\n", power_well->name); 643 + power_well->ops->enable(dev_priv, power_well); 644 + power_well->hw_enabled = true; 645 + } 646 + 647 + check_power_well_state(dev_priv, power_well); 648 + } 649 + 650 + power_domains->domain_use_count[domain]++; 651 + 652 + mutex_unlock(&power_domains->lock); 653 + } 654 + 655 + /** 656 + * intel_display_power_put - release a power domain reference 657 + * @dev_priv: i915 device instance 658 + * @domain: power domain to reference 659 + * 660 + * This function drops the power domain reference obtained by 661 + * intel_display_power_get() and might power down the corresponding hardware 662 + * block right away if this is the last reference. 663 + */ 664 + void intel_display_power_put(struct drm_i915_private *dev_priv, 665 + enum intel_display_power_domain domain) 666 + { 667 + struct i915_power_domains *power_domains; 668 + struct i915_power_well *power_well; 669 + int i; 670 + 671 + power_domains = &dev_priv->power_domains; 672 + 673 + mutex_lock(&power_domains->lock); 674 + 675 + WARN_ON(!power_domains->domain_use_count[domain]); 676 + power_domains->domain_use_count[domain]--; 677 + 678 + for_each_power_well_rev(i, power_well, BIT(domain), power_domains) { 679 + WARN_ON(!power_well->count); 680 + 681 + if (!--power_well->count && i915.disable_power_well) { 682 + DRM_DEBUG_KMS("disabling %s\n", power_well->name); 683 + power_well->hw_enabled = false; 684 + power_well->ops->disable(dev_priv, power_well); 685 + } 686 + 687 + check_power_well_state(dev_priv, power_well); 688 + } 689 + 690 + mutex_unlock(&power_domains->lock); 691 + 692 + intel_runtime_pm_put(dev_priv); 693 + } 694 + 695 + #define POWER_DOMAIN_MASK (BIT(POWER_DOMAIN_NUM) - 1) 696 + 697 + #define HSW_ALWAYS_ON_POWER_DOMAINS ( \ 698 + BIT(POWER_DOMAIN_PIPE_A) | \ 699 + BIT(POWER_DOMAIN_TRANSCODER_EDP) | \ 700 + BIT(POWER_DOMAIN_PORT_DDI_A_2_LANES) | \ 701 + BIT(POWER_DOMAIN_PORT_DDI_A_4_LANES) | \ 702 + BIT(POWER_DOMAIN_PORT_DDI_B_2_LANES) | \ 703 + BIT(POWER_DOMAIN_PORT_DDI_B_4_LANES) | \ 704 + BIT(POWER_DOMAIN_PORT_DDI_C_2_LANES) | \ 705 + BIT(POWER_DOMAIN_PORT_DDI_C_4_LANES) | \ 706 + BIT(POWER_DOMAIN_PORT_DDI_D_2_LANES) | \ 707 + BIT(POWER_DOMAIN_PORT_DDI_D_4_LANES) | \ 708 + BIT(POWER_DOMAIN_PORT_CRT) | \ 709 + BIT(POWER_DOMAIN_PLLS) | \ 710 + BIT(POWER_DOMAIN_INIT)) 711 + #define HSW_DISPLAY_POWER_DOMAINS ( \ 712 + (POWER_DOMAIN_MASK & ~HSW_ALWAYS_ON_POWER_DOMAINS) | \ 713 + BIT(POWER_DOMAIN_INIT)) 714 + 715 + #define BDW_ALWAYS_ON_POWER_DOMAINS ( \ 716 + HSW_ALWAYS_ON_POWER_DOMAINS | \ 717 + BIT(POWER_DOMAIN_PIPE_A_PANEL_FITTER)) 718 + #define BDW_DISPLAY_POWER_DOMAINS ( \ 719 + (POWER_DOMAIN_MASK & ~BDW_ALWAYS_ON_POWER_DOMAINS) | \ 720 + BIT(POWER_DOMAIN_INIT)) 721 + 722 + #define VLV_ALWAYS_ON_POWER_DOMAINS BIT(POWER_DOMAIN_INIT) 723 + #define VLV_DISPLAY_POWER_DOMAINS POWER_DOMAIN_MASK 724 + 725 + #define VLV_DPIO_CMN_BC_POWER_DOMAINS ( \ 726 + BIT(POWER_DOMAIN_PORT_DDI_B_2_LANES) | \ 727 + BIT(POWER_DOMAIN_PORT_DDI_B_4_LANES) | \ 728 + BIT(POWER_DOMAIN_PORT_DDI_C_2_LANES) | \ 729 + BIT(POWER_DOMAIN_PORT_DDI_C_4_LANES) | \ 730 + BIT(POWER_DOMAIN_PORT_CRT) | \ 731 + BIT(POWER_DOMAIN_INIT)) 732 + 733 + #define VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS ( \ 734 + BIT(POWER_DOMAIN_PORT_DDI_B_2_LANES) | \ 735 + BIT(POWER_DOMAIN_PORT_DDI_B_4_LANES) | \ 736 + BIT(POWER_DOMAIN_INIT)) 737 + 738 + #define VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS ( \ 739 + BIT(POWER_DOMAIN_PORT_DDI_B_4_LANES) | \ 740 + BIT(POWER_DOMAIN_INIT)) 741 + 742 + #define VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS ( \ 743 + BIT(POWER_DOMAIN_PORT_DDI_C_2_LANES) | \ 744 + BIT(POWER_DOMAIN_PORT_DDI_C_4_LANES) | \ 745 + BIT(POWER_DOMAIN_INIT)) 746 + 747 + #define VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS ( \ 748 + BIT(POWER_DOMAIN_PORT_DDI_C_4_LANES) | \ 749 + BIT(POWER_DOMAIN_INIT)) 750 + 751 + #define CHV_PIPE_A_POWER_DOMAINS ( \ 752 + BIT(POWER_DOMAIN_PIPE_A) | \ 753 + BIT(POWER_DOMAIN_INIT)) 754 + 755 + #define CHV_PIPE_B_POWER_DOMAINS ( \ 756 + BIT(POWER_DOMAIN_PIPE_B) | \ 757 + BIT(POWER_DOMAIN_INIT)) 758 + 759 + #define CHV_PIPE_C_POWER_DOMAINS ( \ 760 + BIT(POWER_DOMAIN_PIPE_C) | \ 761 + BIT(POWER_DOMAIN_INIT)) 762 + 763 + #define CHV_DPIO_CMN_BC_POWER_DOMAINS ( \ 764 + BIT(POWER_DOMAIN_PORT_DDI_B_2_LANES) | \ 765 + BIT(POWER_DOMAIN_PORT_DDI_B_4_LANES) | \ 766 + BIT(POWER_DOMAIN_PORT_DDI_C_2_LANES) | \ 767 + BIT(POWER_DOMAIN_PORT_DDI_C_4_LANES) | \ 768 + BIT(POWER_DOMAIN_INIT)) 769 + 770 + #define CHV_DPIO_CMN_D_POWER_DOMAINS ( \ 771 + BIT(POWER_DOMAIN_PORT_DDI_D_2_LANES) | \ 772 + BIT(POWER_DOMAIN_PORT_DDI_D_4_LANES) | \ 773 + BIT(POWER_DOMAIN_INIT)) 774 + 775 + #define CHV_DPIO_TX_D_LANES_01_POWER_DOMAINS ( \ 776 + BIT(POWER_DOMAIN_PORT_DDI_D_2_LANES) | \ 777 + BIT(POWER_DOMAIN_PORT_DDI_D_4_LANES) | \ 778 + BIT(POWER_DOMAIN_INIT)) 779 + 780 + #define CHV_DPIO_TX_D_LANES_23_POWER_DOMAINS ( \ 781 + BIT(POWER_DOMAIN_PORT_DDI_D_4_LANES) | \ 782 + BIT(POWER_DOMAIN_INIT)) 783 + 784 + static const struct i915_power_well_ops i9xx_always_on_power_well_ops = { 785 + .sync_hw = i9xx_always_on_power_well_noop, 786 + .enable = i9xx_always_on_power_well_noop, 787 + .disable = i9xx_always_on_power_well_noop, 788 + .is_enabled = i9xx_always_on_power_well_enabled, 789 + }; 790 + 791 + static const struct i915_power_well_ops chv_pipe_power_well_ops = { 792 + .sync_hw = chv_pipe_power_well_sync_hw, 793 + .enable = chv_pipe_power_well_enable, 794 + .disable = chv_pipe_power_well_disable, 795 + .is_enabled = chv_pipe_power_well_enabled, 796 + }; 797 + 798 + static const struct i915_power_well_ops chv_dpio_cmn_power_well_ops = { 799 + .sync_hw = vlv_power_well_sync_hw, 800 + .enable = chv_dpio_cmn_power_well_enable, 801 + .disable = chv_dpio_cmn_power_well_disable, 802 + .is_enabled = vlv_power_well_enabled, 803 + }; 804 + 805 + static struct i915_power_well i9xx_always_on_power_well[] = { 806 + { 807 + .name = "always-on", 808 + .always_on = 1, 809 + .domains = POWER_DOMAIN_MASK, 810 + .ops = &i9xx_always_on_power_well_ops, 811 + }, 812 + }; 813 + 814 + static const struct i915_power_well_ops hsw_power_well_ops = { 815 + .sync_hw = hsw_power_well_sync_hw, 816 + .enable = hsw_power_well_enable, 817 + .disable = hsw_power_well_disable, 818 + .is_enabled = hsw_power_well_enabled, 819 + }; 820 + 821 + static struct i915_power_well hsw_power_wells[] = { 822 + { 823 + .name = "always-on", 824 + .always_on = 1, 825 + .domains = HSW_ALWAYS_ON_POWER_DOMAINS, 826 + .ops = &i9xx_always_on_power_well_ops, 827 + }, 828 + { 829 + .name = "display", 830 + .domains = HSW_DISPLAY_POWER_DOMAINS, 831 + .ops = &hsw_power_well_ops, 832 + }, 833 + }; 834 + 835 + static struct i915_power_well bdw_power_wells[] = { 836 + { 837 + .name = "always-on", 838 + .always_on = 1, 839 + .domains = BDW_ALWAYS_ON_POWER_DOMAINS, 840 + .ops = &i9xx_always_on_power_well_ops, 841 + }, 842 + { 843 + .name = "display", 844 + .domains = BDW_DISPLAY_POWER_DOMAINS, 845 + .ops = &hsw_power_well_ops, 846 + }, 847 + }; 848 + 849 + static const struct i915_power_well_ops vlv_display_power_well_ops = { 850 + .sync_hw = vlv_power_well_sync_hw, 851 + .enable = vlv_display_power_well_enable, 852 + .disable = vlv_display_power_well_disable, 853 + .is_enabled = vlv_power_well_enabled, 854 + }; 855 + 856 + static const struct i915_power_well_ops vlv_dpio_cmn_power_well_ops = { 857 + .sync_hw = vlv_power_well_sync_hw, 858 + .enable = vlv_dpio_cmn_power_well_enable, 859 + .disable = vlv_dpio_cmn_power_well_disable, 860 + .is_enabled = vlv_power_well_enabled, 861 + }; 862 + 863 + static const struct i915_power_well_ops vlv_dpio_power_well_ops = { 864 + .sync_hw = vlv_power_well_sync_hw, 865 + .enable = vlv_power_well_enable, 866 + .disable = vlv_power_well_disable, 867 + .is_enabled = vlv_power_well_enabled, 868 + }; 869 + 870 + static struct i915_power_well vlv_power_wells[] = { 871 + { 872 + .name = "always-on", 873 + .always_on = 1, 874 + .domains = VLV_ALWAYS_ON_POWER_DOMAINS, 875 + .ops = &i9xx_always_on_power_well_ops, 876 + }, 877 + { 878 + .name = "display", 879 + .domains = VLV_DISPLAY_POWER_DOMAINS, 880 + .data = PUNIT_POWER_WELL_DISP2D, 881 + .ops = &vlv_display_power_well_ops, 882 + }, 883 + { 884 + .name = "dpio-tx-b-01", 885 + .domains = VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS | 886 + VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS | 887 + VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS | 888 + VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS, 889 + .ops = &vlv_dpio_power_well_ops, 890 + .data = PUNIT_POWER_WELL_DPIO_TX_B_LANES_01, 891 + }, 892 + { 893 + .name = "dpio-tx-b-23", 894 + .domains = VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS | 895 + VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS | 896 + VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS | 897 + VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS, 898 + .ops = &vlv_dpio_power_well_ops, 899 + .data = PUNIT_POWER_WELL_DPIO_TX_B_LANES_23, 900 + }, 901 + { 902 + .name = "dpio-tx-c-01", 903 + .domains = VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS | 904 + VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS | 905 + VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS | 906 + VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS, 907 + .ops = &vlv_dpio_power_well_ops, 908 + .data = PUNIT_POWER_WELL_DPIO_TX_C_LANES_01, 909 + }, 910 + { 911 + .name = "dpio-tx-c-23", 912 + .domains = VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS | 913 + VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS | 914 + VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS | 915 + VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS, 916 + .ops = &vlv_dpio_power_well_ops, 917 + .data = PUNIT_POWER_WELL_DPIO_TX_C_LANES_23, 918 + }, 919 + { 920 + .name = "dpio-common", 921 + .domains = VLV_DPIO_CMN_BC_POWER_DOMAINS, 922 + .data = PUNIT_POWER_WELL_DPIO_CMN_BC, 923 + .ops = &vlv_dpio_cmn_power_well_ops, 924 + }, 925 + }; 926 + 927 + static struct i915_power_well chv_power_wells[] = { 928 + { 929 + .name = "always-on", 930 + .always_on = 1, 931 + .domains = VLV_ALWAYS_ON_POWER_DOMAINS, 932 + .ops = &i9xx_always_on_power_well_ops, 933 + }, 934 + #if 0 935 + { 936 + .name = "display", 937 + .domains = VLV_DISPLAY_POWER_DOMAINS, 938 + .data = PUNIT_POWER_WELL_DISP2D, 939 + .ops = &vlv_display_power_well_ops, 940 + }, 941 + { 942 + .name = "pipe-a", 943 + .domains = CHV_PIPE_A_POWER_DOMAINS, 944 + .data = PIPE_A, 945 + .ops = &chv_pipe_power_well_ops, 946 + }, 947 + { 948 + .name = "pipe-b", 949 + .domains = CHV_PIPE_B_POWER_DOMAINS, 950 + .data = PIPE_B, 951 + .ops = &chv_pipe_power_well_ops, 952 + }, 953 + { 954 + .name = "pipe-c", 955 + .domains = CHV_PIPE_C_POWER_DOMAINS, 956 + .data = PIPE_C, 957 + .ops = &chv_pipe_power_well_ops, 958 + }, 959 + #endif 960 + { 961 + .name = "dpio-common-bc", 962 + /* 963 + * XXX: cmnreset for one PHY seems to disturb the other. 964 + * As a workaround keep both powered on at the same 965 + * time for now. 966 + */ 967 + .domains = CHV_DPIO_CMN_BC_POWER_DOMAINS | CHV_DPIO_CMN_D_POWER_DOMAINS, 968 + .data = PUNIT_POWER_WELL_DPIO_CMN_BC, 969 + .ops = &chv_dpio_cmn_power_well_ops, 970 + }, 971 + { 972 + .name = "dpio-common-d", 973 + /* 974 + * XXX: cmnreset for one PHY seems to disturb the other. 975 + * As a workaround keep both powered on at the same 976 + * time for now. 977 + */ 978 + .domains = CHV_DPIO_CMN_BC_POWER_DOMAINS | CHV_DPIO_CMN_D_POWER_DOMAINS, 979 + .data = PUNIT_POWER_WELL_DPIO_CMN_D, 980 + .ops = &chv_dpio_cmn_power_well_ops, 981 + }, 982 + #if 0 983 + { 984 + .name = "dpio-tx-b-01", 985 + .domains = VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS | 986 + VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS, 987 + .ops = &vlv_dpio_power_well_ops, 988 + .data = PUNIT_POWER_WELL_DPIO_TX_B_LANES_01, 989 + }, 990 + { 991 + .name = "dpio-tx-b-23", 992 + .domains = VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS | 993 + VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS, 994 + .ops = &vlv_dpio_power_well_ops, 995 + .data = PUNIT_POWER_WELL_DPIO_TX_B_LANES_23, 996 + }, 997 + { 998 + .name = "dpio-tx-c-01", 999 + .domains = VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS | 1000 + VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS, 1001 + .ops = &vlv_dpio_power_well_ops, 1002 + .data = PUNIT_POWER_WELL_DPIO_TX_C_LANES_01, 1003 + }, 1004 + { 1005 + .name = "dpio-tx-c-23", 1006 + .domains = VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS | 1007 + VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS, 1008 + .ops = &vlv_dpio_power_well_ops, 1009 + .data = PUNIT_POWER_WELL_DPIO_TX_C_LANES_23, 1010 + }, 1011 + { 1012 + .name = "dpio-tx-d-01", 1013 + .domains = CHV_DPIO_TX_D_LANES_01_POWER_DOMAINS | 1014 + CHV_DPIO_TX_D_LANES_23_POWER_DOMAINS, 1015 + .ops = &vlv_dpio_power_well_ops, 1016 + .data = PUNIT_POWER_WELL_DPIO_TX_D_LANES_01, 1017 + }, 1018 + { 1019 + .name = "dpio-tx-d-23", 1020 + .domains = CHV_DPIO_TX_D_LANES_01_POWER_DOMAINS | 1021 + CHV_DPIO_TX_D_LANES_23_POWER_DOMAINS, 1022 + .ops = &vlv_dpio_power_well_ops, 1023 + .data = PUNIT_POWER_WELL_DPIO_TX_D_LANES_23, 1024 + }, 1025 + #endif 1026 + }; 1027 + 1028 + static struct i915_power_well *lookup_power_well(struct drm_i915_private *dev_priv, 1029 + enum punit_power_well power_well_id) 1030 + { 1031 + struct i915_power_domains *power_domains = &dev_priv->power_domains; 1032 + struct i915_power_well *power_well; 1033 + int i; 1034 + 1035 + for_each_power_well(i, power_well, POWER_DOMAIN_MASK, power_domains) { 1036 + if (power_well->data == power_well_id) 1037 + return power_well; 1038 + } 1039 + 1040 + return NULL; 1041 + } 1042 + 1043 + #define set_power_wells(power_domains, __power_wells) ({ \ 1044 + (power_domains)->power_wells = (__power_wells); \ 1045 + (power_domains)->power_well_count = ARRAY_SIZE(__power_wells); \ 1046 + }) 1047 + 1048 + /** 1049 + * intel_power_domains_init - initializes the power domain structures 1050 + * @dev_priv: i915 device instance 1051 + * 1052 + * Initializes the power domain structures for @dev_priv depending upon the 1053 + * supported platform. 1054 + */ 1055 + int intel_power_domains_init(struct drm_i915_private *dev_priv) 1056 + { 1057 + struct i915_power_domains *power_domains = &dev_priv->power_domains; 1058 + 1059 + mutex_init(&power_domains->lock); 1060 + 1061 + /* 1062 + * The enabling order will be from lower to higher indexed wells, 1063 + * the disabling order is reversed. 1064 + */ 1065 + if (IS_HASWELL(dev_priv->dev)) { 1066 + set_power_wells(power_domains, hsw_power_wells); 1067 + hsw_pwr = power_domains; 1068 + } else if (IS_BROADWELL(dev_priv->dev)) { 1069 + set_power_wells(power_domains, bdw_power_wells); 1070 + hsw_pwr = power_domains; 1071 + } else if (IS_CHERRYVIEW(dev_priv->dev)) { 1072 + set_power_wells(power_domains, chv_power_wells); 1073 + } else if (IS_VALLEYVIEW(dev_priv->dev)) { 1074 + set_power_wells(power_domains, vlv_power_wells); 1075 + } else { 1076 + set_power_wells(power_domains, i9xx_always_on_power_well); 1077 + } 1078 + 1079 + return 0; 1080 + } 1081 + 1082 + static void intel_runtime_pm_disable(struct drm_i915_private *dev_priv) 1083 + { 1084 + struct drm_device *dev = dev_priv->dev; 1085 + struct device *device = &dev->pdev->dev; 1086 + 1087 + if (!HAS_RUNTIME_PM(dev)) 1088 + return; 1089 + 1090 + if (!intel_enable_rc6(dev)) 1091 + return; 1092 + 1093 + /* Make sure we're not suspended first. */ 1094 + pm_runtime_get_sync(device); 1095 + pm_runtime_disable(device); 1096 + } 1097 + 1098 + /** 1099 + * intel_power_domains_fini - finalizes the power domain structures 1100 + * @dev_priv: i915 device instance 1101 + * 1102 + * Finalizes the power domain structures for @dev_priv depending upon the 1103 + * supported platform. This function also disables runtime pm and ensures that 1104 + * the device stays powered up so that the driver can be reloaded. 1105 + */ 1106 + void intel_power_domains_fini(struct drm_i915_private *dev_priv) 1107 + { 1108 + intel_runtime_pm_disable(dev_priv); 1109 + 1110 + /* The i915.ko module is still not prepared to be loaded when 1111 + * the power well is not enabled, so just enable it in case 1112 + * we're going to unload/reload. */ 1113 + intel_display_set_init_power(dev_priv, true); 1114 + 1115 + hsw_pwr = NULL; 1116 + } 1117 + 1118 + static void intel_power_domains_resume(struct drm_i915_private *dev_priv) 1119 + { 1120 + struct i915_power_domains *power_domains = &dev_priv->power_domains; 1121 + struct i915_power_well *power_well; 1122 + int i; 1123 + 1124 + mutex_lock(&power_domains->lock); 1125 + for_each_power_well(i, power_well, POWER_DOMAIN_MASK, power_domains) { 1126 + power_well->ops->sync_hw(dev_priv, power_well); 1127 + power_well->hw_enabled = power_well->ops->is_enabled(dev_priv, 1128 + power_well); 1129 + } 1130 + mutex_unlock(&power_domains->lock); 1131 + } 1132 + 1133 + static void vlv_cmnlane_wa(struct drm_i915_private *dev_priv) 1134 + { 1135 + struct i915_power_well *cmn = 1136 + lookup_power_well(dev_priv, PUNIT_POWER_WELL_DPIO_CMN_BC); 1137 + struct i915_power_well *disp2d = 1138 + lookup_power_well(dev_priv, PUNIT_POWER_WELL_DISP2D); 1139 + 1140 + /* nothing to do if common lane is already off */ 1141 + if (!cmn->ops->is_enabled(dev_priv, cmn)) 1142 + return; 1143 + 1144 + /* If the display might be already active skip this */ 1145 + if (disp2d->ops->is_enabled(dev_priv, disp2d) && 1146 + I915_READ(DPIO_CTL) & DPIO_CMNRST) 1147 + return; 1148 + 1149 + DRM_DEBUG_KMS("toggling display PHY side reset\n"); 1150 + 1151 + /* cmnlane needs DPLL registers */ 1152 + disp2d->ops->enable(dev_priv, disp2d); 1153 + 1154 + /* 1155 + * From VLV2A0_DP_eDP_HDMI_DPIO_driver_vbios_notes_11.docx: 1156 + * Need to assert and de-assert PHY SB reset by gating the 1157 + * common lane power, then un-gating it. 1158 + * Simply ungating isn't enough to reset the PHY enough to get 1159 + * ports and lanes running. 1160 + */ 1161 + cmn->ops->disable(dev_priv, cmn); 1162 + } 1163 + 1164 + /** 1165 + * intel_power_domains_init_hw - initialize hardware power domain state 1166 + * @dev_priv: i915 device instance 1167 + * 1168 + * This function initializes the hardware power domain state and enables all 1169 + * power domains using intel_display_set_init_power(). 1170 + */ 1171 + void intel_power_domains_init_hw(struct drm_i915_private *dev_priv) 1172 + { 1173 + struct drm_device *dev = dev_priv->dev; 1174 + struct i915_power_domains *power_domains = &dev_priv->power_domains; 1175 + 1176 + power_domains->initializing = true; 1177 + 1178 + if (IS_VALLEYVIEW(dev) && !IS_CHERRYVIEW(dev)) { 1179 + mutex_lock(&power_domains->lock); 1180 + vlv_cmnlane_wa(dev_priv); 1181 + mutex_unlock(&power_domains->lock); 1182 + } 1183 + 1184 + /* For now, we need the power well to be always enabled. */ 1185 + intel_display_set_init_power(dev_priv, true); 1186 + intel_power_domains_resume(dev_priv); 1187 + power_domains->initializing = false; 1188 + } 1189 + 1190 + /** 1191 + * intel_aux_display_runtime_get - grab an auxilliary power domain reference 1192 + * @dev_priv: i915 device instance 1193 + * 1194 + * This function grabs a power domain reference for the auxiliary power domain 1195 + * (for access to the GMBUS and DP AUX blocks) and ensures that it and all its 1196 + * parents are powered up. Therefore users should only grab a reference to the 1197 + * innermost power domain they need. 1198 + * 1199 + * Any power domain reference obtained by this function must have a symmetric 1200 + * call to intel_aux_display_runtime_put() to release the reference again. 1201 + */ 1202 + void intel_aux_display_runtime_get(struct drm_i915_private *dev_priv) 1203 + { 1204 + intel_runtime_pm_get(dev_priv); 1205 + } 1206 + 1207 + /** 1208 + * intel_aux_display_runtime_put - release an auxilliary power domain reference 1209 + * @dev_priv: i915 device instance 1210 + * 1211 + * This function drops the auxilliary power domain reference obtained by 1212 + * intel_aux_display_runtime_get() and might power down the corresponding 1213 + * hardware block right away if this is the last reference. 1214 + */ 1215 + void intel_aux_display_runtime_put(struct drm_i915_private *dev_priv) 1216 + { 1217 + intel_runtime_pm_put(dev_priv); 1218 + } 1219 + 1220 + /** 1221 + * intel_runtime_pm_get - grab a runtime pm reference 1222 + * @dev_priv: i915 device instance 1223 + * 1224 + * This function grabs a device-level runtime pm reference (mostly used for GEM 1225 + * code to ensure the GTT or GT is on) and ensures that it is powered up. 1226 + * 1227 + * Any runtime pm reference obtained by this function must have a symmetric 1228 + * call to intel_runtime_pm_put() to release the reference again. 1229 + */ 1230 + void intel_runtime_pm_get(struct drm_i915_private *dev_priv) 1231 + { 1232 + struct drm_device *dev = dev_priv->dev; 1233 + struct device *device = &dev->pdev->dev; 1234 + 1235 + if (!HAS_RUNTIME_PM(dev)) 1236 + return; 1237 + 1238 + pm_runtime_get_sync(device); 1239 + WARN(dev_priv->pm.suspended, "Device still suspended.\n"); 1240 + } 1241 + 1242 + /** 1243 + * intel_runtime_pm_get_noresume - grab a runtime pm reference 1244 + * @dev_priv: i915 device instance 1245 + * 1246 + * This function grabs a device-level runtime pm reference (mostly used for GEM 1247 + * code to ensure the GTT or GT is on). 1248 + * 1249 + * It will _not_ power up the device but instead only check that it's powered 1250 + * on. Therefore it is only valid to call this functions from contexts where 1251 + * the device is known to be powered up and where trying to power it up would 1252 + * result in hilarity and deadlocks. That pretty much means only the system 1253 + * suspend/resume code where this is used to grab runtime pm references for 1254 + * delayed setup down in work items. 1255 + * 1256 + * Any runtime pm reference obtained by this function must have a symmetric 1257 + * call to intel_runtime_pm_put() to release the reference again. 1258 + */ 1259 + void intel_runtime_pm_get_noresume(struct drm_i915_private *dev_priv) 1260 + { 1261 + struct drm_device *dev = dev_priv->dev; 1262 + struct device *device = &dev->pdev->dev; 1263 + 1264 + if (!HAS_RUNTIME_PM(dev)) 1265 + return; 1266 + 1267 + WARN(dev_priv->pm.suspended, "Getting nosync-ref while suspended.\n"); 1268 + pm_runtime_get_noresume(device); 1269 + } 1270 + 1271 + /** 1272 + * intel_runtime_pm_put - release a runtime pm reference 1273 + * @dev_priv: i915 device instance 1274 + * 1275 + * This function drops the device-level runtime pm reference obtained by 1276 + * intel_runtime_pm_get() and might power down the corresponding 1277 + * hardware block right away if this is the last reference. 1278 + */ 1279 + void intel_runtime_pm_put(struct drm_i915_private *dev_priv) 1280 + { 1281 + struct drm_device *dev = dev_priv->dev; 1282 + struct device *device = &dev->pdev->dev; 1283 + 1284 + if (!HAS_RUNTIME_PM(dev)) 1285 + return; 1286 + 1287 + pm_runtime_mark_last_busy(device); 1288 + pm_runtime_put_autosuspend(device); 1289 + } 1290 + 1291 + /** 1292 + * intel_runtime_pm_enable - enable runtime pm 1293 + * @dev_priv: i915 device instance 1294 + * 1295 + * This function enables runtime pm at the end of the driver load sequence. 1296 + * 1297 + * Note that this function does currently not enable runtime pm for the 1298 + * subordinate display power domains. That is only done on the first modeset 1299 + * using intel_display_set_init_power(). 1300 + */ 1301 + void intel_runtime_pm_enable(struct drm_i915_private *dev_priv) 1302 + { 1303 + struct drm_device *dev = dev_priv->dev; 1304 + struct device *device = &dev->pdev->dev; 1305 + 1306 + if (!HAS_RUNTIME_PM(dev)) 1307 + return; 1308 + 1309 + pm_runtime_set_active(device); 1310 + 1311 + /* 1312 + * RPM depends on RC6 to save restore the GT HW context, so make RC6 a 1313 + * requirement. 1314 + */ 1315 + if (!intel_enable_rc6(dev)) { 1316 + DRM_INFO("RC6 disabled, disabling runtime PM support\n"); 1317 + return; 1318 + } 1319 + 1320 + pm_runtime_set_autosuspend_delay(device, 10000); /* 10s */ 1321 + pm_runtime_mark_last_busy(device); 1322 + pm_runtime_use_autosuspend(device); 1323 + 1324 + pm_runtime_put_autosuspend(device); 1325 + } 1326 + 1327 + /* Display audio driver power well request */ 1328 + int i915_request_power_well(void) 1329 + { 1330 + struct drm_i915_private *dev_priv; 1331 + 1332 + if (!hsw_pwr) 1333 + return -ENODEV; 1334 + 1335 + dev_priv = container_of(hsw_pwr, struct drm_i915_private, 1336 + power_domains); 1337 + intel_display_power_get(dev_priv, POWER_DOMAIN_AUDIO); 1338 + return 0; 1339 + } 1340 + EXPORT_SYMBOL_GPL(i915_request_power_well); 1341 + 1342 + /* Display audio driver power well release */ 1343 + int i915_release_power_well(void) 1344 + { 1345 + struct drm_i915_private *dev_priv; 1346 + 1347 + if (!hsw_pwr) 1348 + return -ENODEV; 1349 + 1350 + dev_priv = container_of(hsw_pwr, struct drm_i915_private, 1351 + power_domains); 1352 + intel_display_power_put(dev_priv, POWER_DOMAIN_AUDIO); 1353 + return 0; 1354 + } 1355 + EXPORT_SYMBOL_GPL(i915_release_power_well); 1356 + 1357 + /* 1358 + * Private interface for the audio driver to get CDCLK in kHz. 1359 + * 1360 + * Caller must request power well using i915_request_power_well() prior to 1361 + * making the call. 1362 + */ 1363 + int i915_get_cdclk_freq(void) 1364 + { 1365 + struct drm_i915_private *dev_priv; 1366 + 1367 + if (!hsw_pwr) 1368 + return -ENODEV; 1369 + 1370 + dev_priv = container_of(hsw_pwr, struct drm_i915_private, 1371 + power_domains); 1372 + 1373 + return intel_ddi_get_cdclk_freq(dev_priv); 1374 + } 1375 + EXPORT_SYMBOL_GPL(i915_get_cdclk_freq);
+364 -107
drivers/gpu/drm/i915/intel_sprite.c
··· 139 139 } 140 140 141 141 static void 142 + skl_update_plane(struct drm_plane *drm_plane, struct drm_crtc *crtc, 143 + struct drm_framebuffer *fb, 144 + struct drm_i915_gem_object *obj, int crtc_x, int crtc_y, 145 + unsigned int crtc_w, unsigned int crtc_h, 146 + uint32_t x, uint32_t y, 147 + uint32_t src_w, uint32_t src_h) 148 + { 149 + struct drm_device *dev = drm_plane->dev; 150 + struct drm_i915_private *dev_priv = dev->dev_private; 151 + struct intel_plane *intel_plane = to_intel_plane(drm_plane); 152 + const int pipe = intel_plane->pipe; 153 + const int plane = intel_plane->plane + 1; 154 + u32 plane_ctl, stride; 155 + int pixel_size = drm_format_plane_cpp(fb->pixel_format, 0); 156 + 157 + plane_ctl = I915_READ(PLANE_CTL(pipe, plane)); 158 + 159 + /* Mask out pixel format bits in case we change it */ 160 + plane_ctl &= ~PLANE_CTL_FORMAT_MASK; 161 + plane_ctl &= ~PLANE_CTL_ORDER_RGBX; 162 + plane_ctl &= ~PLANE_CTL_YUV422_ORDER_MASK; 163 + plane_ctl &= ~PLANE_CTL_TILED_MASK; 164 + plane_ctl &= ~PLANE_CTL_ALPHA_MASK; 165 + 166 + /* Trickle feed has to be enabled */ 167 + plane_ctl &= ~PLANE_CTL_TRICKLE_FEED_DISABLE; 168 + 169 + switch (fb->pixel_format) { 170 + case DRM_FORMAT_RGB565: 171 + plane_ctl |= PLANE_CTL_FORMAT_RGB_565; 172 + break; 173 + case DRM_FORMAT_XBGR8888: 174 + plane_ctl |= PLANE_CTL_FORMAT_XRGB_8888 | PLANE_CTL_ORDER_RGBX; 175 + break; 176 + case DRM_FORMAT_XRGB8888: 177 + plane_ctl |= PLANE_CTL_FORMAT_XRGB_8888; 178 + break; 179 + /* 180 + * XXX: For ARBG/ABGR formats we default to expecting scanout buffers 181 + * to be already pre-multiplied. We need to add a knob (or a different 182 + * DRM_FORMAT) for user-space to configure that. 183 + */ 184 + case DRM_FORMAT_ABGR8888: 185 + plane_ctl |= PLANE_CTL_FORMAT_XRGB_8888 | 186 + PLANE_CTL_ORDER_RGBX | 187 + PLANE_CTL_ALPHA_SW_PREMULTIPLY; 188 + break; 189 + case DRM_FORMAT_ARGB8888: 190 + plane_ctl |= PLANE_CTL_FORMAT_XRGB_8888 | 191 + PLANE_CTL_ALPHA_SW_PREMULTIPLY; 192 + break; 193 + case DRM_FORMAT_YUYV: 194 + plane_ctl |= PLANE_CTL_FORMAT_YUV422 | PLANE_CTL_YUV422_YUYV; 195 + break; 196 + case DRM_FORMAT_YVYU: 197 + plane_ctl |= PLANE_CTL_FORMAT_YUV422 | PLANE_CTL_YUV422_YVYU; 198 + break; 199 + case DRM_FORMAT_UYVY: 200 + plane_ctl |= PLANE_CTL_FORMAT_YUV422 | PLANE_CTL_YUV422_UYVY; 201 + break; 202 + case DRM_FORMAT_VYUY: 203 + plane_ctl |= PLANE_CTL_FORMAT_YUV422 | PLANE_CTL_YUV422_VYUY; 204 + break; 205 + default: 206 + BUG(); 207 + } 208 + 209 + switch (obj->tiling_mode) { 210 + case I915_TILING_NONE: 211 + stride = fb->pitches[0] >> 6; 212 + break; 213 + case I915_TILING_X: 214 + plane_ctl |= PLANE_CTL_TILED_X; 215 + stride = fb->pitches[0] >> 9; 216 + break; 217 + default: 218 + BUG(); 219 + } 220 + 221 + plane_ctl |= PLANE_CTL_ENABLE; 222 + plane_ctl |= PLANE_CTL_PIPE_CSC_ENABLE; 223 + 224 + intel_update_sprite_watermarks(drm_plane, crtc, src_w, src_h, 225 + pixel_size, true, 226 + src_w != crtc_w || src_h != crtc_h); 227 + 228 + /* Sizes are 0 based */ 229 + src_w--; 230 + src_h--; 231 + crtc_w--; 232 + crtc_h--; 233 + 234 + I915_WRITE(PLANE_OFFSET(pipe, plane), (y << 16) | x); 235 + I915_WRITE(PLANE_STRIDE(pipe, plane), stride); 236 + I915_WRITE(PLANE_POS(pipe, plane), (crtc_y << 16) | crtc_x); 237 + I915_WRITE(PLANE_SIZE(pipe, plane), (crtc_h << 16) | crtc_w); 238 + I915_WRITE(PLANE_CTL(pipe, plane), plane_ctl); 239 + I915_WRITE(PLANE_SURF(pipe, plane), i915_gem_obj_ggtt_offset(obj)); 240 + POSTING_READ(PLANE_SURF(pipe, plane)); 241 + } 242 + 243 + static void 244 + skl_disable_plane(struct drm_plane *drm_plane, struct drm_crtc *crtc) 245 + { 246 + struct drm_device *dev = drm_plane->dev; 247 + struct drm_i915_private *dev_priv = dev->dev_private; 248 + struct intel_plane *intel_plane = to_intel_plane(drm_plane); 249 + const int pipe = intel_plane->pipe; 250 + const int plane = intel_plane->plane + 1; 251 + 252 + I915_WRITE(PLANE_CTL(pipe, plane), 253 + I915_READ(PLANE_CTL(pipe, plane)) & ~PLANE_CTL_ENABLE); 254 + 255 + /* Activate double buffered register update */ 256 + I915_WRITE(PLANE_CTL(pipe, plane), 0); 257 + POSTING_READ(PLANE_CTL(pipe, plane)); 258 + 259 + intel_update_sprite_watermarks(drm_plane, crtc, 0, 0, 0, false, false); 260 + } 261 + 262 + static int 263 + skl_update_colorkey(struct drm_plane *drm_plane, 264 + struct drm_intel_sprite_colorkey *key) 265 + { 266 + struct drm_device *dev = drm_plane->dev; 267 + struct drm_i915_private *dev_priv = dev->dev_private; 268 + struct intel_plane *intel_plane = to_intel_plane(drm_plane); 269 + const int pipe = intel_plane->pipe; 270 + const int plane = intel_plane->plane; 271 + u32 plane_ctl; 272 + 273 + I915_WRITE(PLANE_KEYVAL(pipe, plane), key->min_value); 274 + I915_WRITE(PLANE_KEYMAX(pipe, plane), key->max_value); 275 + I915_WRITE(PLANE_KEYMSK(pipe, plane), key->channel_mask); 276 + 277 + plane_ctl = I915_READ(PLANE_CTL(pipe, plane)); 278 + plane_ctl &= ~PLANE_CTL_KEY_ENABLE_MASK; 279 + if (key->flags & I915_SET_COLORKEY_DESTINATION) 280 + plane_ctl |= PLANE_CTL_KEY_ENABLE_DESTINATION; 281 + else if (key->flags & I915_SET_COLORKEY_SOURCE) 282 + plane_ctl |= PLANE_CTL_KEY_ENABLE_SOURCE; 283 + I915_WRITE(PLANE_CTL(pipe, plane), plane_ctl); 284 + 285 + POSTING_READ(PLANE_CTL(pipe, plane)); 286 + 287 + return 0; 288 + } 289 + 290 + static void 291 + skl_get_colorkey(struct drm_plane *drm_plane, 292 + struct drm_intel_sprite_colorkey *key) 293 + { 294 + struct drm_device *dev = drm_plane->dev; 295 + struct drm_i915_private *dev_priv = dev->dev_private; 296 + struct intel_plane *intel_plane = to_intel_plane(drm_plane); 297 + const int pipe = intel_plane->pipe; 298 + const int plane = intel_plane->plane; 299 + u32 plane_ctl; 300 + 301 + key->min_value = I915_READ(PLANE_KEYVAL(pipe, plane)); 302 + key->max_value = I915_READ(PLANE_KEYMAX(pipe, plane)); 303 + key->channel_mask = I915_READ(PLANE_KEYMSK(pipe, plane)); 304 + 305 + plane_ctl = I915_READ(PLANE_CTL(pipe, plane)); 306 + 307 + switch (plane_ctl & PLANE_CTL_KEY_ENABLE_MASK) { 308 + case PLANE_CTL_KEY_ENABLE_DESTINATION: 309 + key->flags = I915_SET_COLORKEY_DESTINATION; 310 + break; 311 + case PLANE_CTL_KEY_ENABLE_SOURCE: 312 + key->flags = I915_SET_COLORKEY_SOURCE; 313 + break; 314 + default: 315 + key->flags = I915_SET_COLORKEY_NONE; 316 + } 317 + } 318 + 319 + static void 142 320 vlv_update_plane(struct drm_plane *dplane, struct drm_crtc *crtc, 143 321 struct drm_framebuffer *fb, 144 322 struct drm_i915_gem_object *obj, int crtc_x, int crtc_y, ··· 1023 845 } 1024 846 1025 847 static int 1026 - intel_update_plane(struct drm_plane *plane, struct drm_crtc *crtc, 1027 - struct drm_framebuffer *fb, int crtc_x, int crtc_y, 1028 - unsigned int crtc_w, unsigned int crtc_h, 1029 - uint32_t src_x, uint32_t src_y, 1030 - uint32_t src_w, uint32_t src_h) 848 + intel_check_sprite_plane(struct drm_plane *plane, 849 + struct intel_plane_state *state) 1031 850 { 1032 - struct drm_device *dev = plane->dev; 1033 - struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 851 + struct intel_crtc *intel_crtc = to_intel_crtc(state->crtc); 1034 852 struct intel_plane *intel_plane = to_intel_plane(plane); 1035 - enum pipe pipe = intel_crtc->pipe; 853 + struct drm_framebuffer *fb = state->fb; 1036 854 struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb); 1037 855 struct drm_i915_gem_object *obj = intel_fb->obj; 1038 - struct drm_i915_gem_object *old_obj = intel_plane->obj; 1039 - int ret; 1040 - bool primary_enabled; 1041 - bool visible; 856 + int crtc_x, crtc_y; 857 + unsigned int crtc_w, crtc_h; 858 + uint32_t src_x, src_y, src_w, src_h; 859 + struct drm_rect *src = &state->src; 860 + struct drm_rect *dst = &state->dst; 861 + struct drm_rect *orig_src = &state->orig_src; 862 + const struct drm_rect *clip = &state->clip; 1042 863 int hscale, vscale; 1043 864 int max_scale, min_scale; 1044 865 int pixel_size = drm_format_plane_cpp(fb->pixel_format, 0); 1045 - struct drm_rect src = { 1046 - /* sample coordinates in 16.16 fixed point */ 1047 - .x1 = src_x, 1048 - .x2 = src_x + src_w, 1049 - .y1 = src_y, 1050 - .y2 = src_y + src_h, 1051 - }; 1052 - struct drm_rect dst = { 1053 - /* integer pixels */ 1054 - .x1 = crtc_x, 1055 - .x2 = crtc_x + crtc_w, 1056 - .y1 = crtc_y, 1057 - .y2 = crtc_y + crtc_h, 1058 - }; 1059 - const struct drm_rect clip = { 1060 - .x2 = intel_crtc->active ? intel_crtc->config.pipe_src_w : 0, 1061 - .y2 = intel_crtc->active ? intel_crtc->config.pipe_src_h : 0, 1062 - }; 1063 - const struct { 1064 - int crtc_x, crtc_y; 1065 - unsigned int crtc_w, crtc_h; 1066 - uint32_t src_x, src_y, src_w, src_h; 1067 - } orig = { 1068 - .crtc_x = crtc_x, 1069 - .crtc_y = crtc_y, 1070 - .crtc_w = crtc_w, 1071 - .crtc_h = crtc_h, 1072 - .src_x = src_x, 1073 - .src_y = src_y, 1074 - .src_w = src_w, 1075 - .src_h = src_h, 1076 - }; 1077 866 1078 867 /* Don't modify another pipe's plane */ 1079 868 if (intel_plane->pipe != intel_crtc->pipe) { ··· 1072 927 max_scale = intel_plane->max_downscale << 16; 1073 928 min_scale = intel_plane->can_scale ? 1 : (1 << 16); 1074 929 1075 - drm_rect_rotate(&src, fb->width << 16, fb->height << 16, 930 + drm_rect_rotate(src, fb->width << 16, fb->height << 16, 1076 931 intel_plane->rotation); 1077 932 1078 - hscale = drm_rect_calc_hscale_relaxed(&src, &dst, min_scale, max_scale); 933 + hscale = drm_rect_calc_hscale_relaxed(src, dst, min_scale, max_scale); 1079 934 BUG_ON(hscale < 0); 1080 935 1081 - vscale = drm_rect_calc_vscale_relaxed(&src, &dst, min_scale, max_scale); 936 + vscale = drm_rect_calc_vscale_relaxed(src, dst, min_scale, max_scale); 1082 937 BUG_ON(vscale < 0); 1083 938 1084 - visible = drm_rect_clip_scaled(&src, &dst, &clip, hscale, vscale); 939 + state->visible = drm_rect_clip_scaled(src, dst, clip, hscale, vscale); 1085 940 1086 - crtc_x = dst.x1; 1087 - crtc_y = dst.y1; 1088 - crtc_w = drm_rect_width(&dst); 1089 - crtc_h = drm_rect_height(&dst); 941 + crtc_x = dst->x1; 942 + crtc_y = dst->y1; 943 + crtc_w = drm_rect_width(dst); 944 + crtc_h = drm_rect_height(dst); 1090 945 1091 - if (visible) { 946 + if (state->visible) { 1092 947 /* check again in case clipping clamped the results */ 1093 - hscale = drm_rect_calc_hscale(&src, &dst, min_scale, max_scale); 948 + hscale = drm_rect_calc_hscale(src, dst, min_scale, max_scale); 1094 949 if (hscale < 0) { 1095 950 DRM_DEBUG_KMS("Horizontal scaling factor out of limits\n"); 1096 - drm_rect_debug_print(&src, true); 1097 - drm_rect_debug_print(&dst, false); 951 + drm_rect_debug_print(src, true); 952 + drm_rect_debug_print(dst, false); 1098 953 1099 954 return hscale; 1100 955 } 1101 956 1102 - vscale = drm_rect_calc_vscale(&src, &dst, min_scale, max_scale); 957 + vscale = drm_rect_calc_vscale(src, dst, min_scale, max_scale); 1103 958 if (vscale < 0) { 1104 959 DRM_DEBUG_KMS("Vertical scaling factor out of limits\n"); 1105 - drm_rect_debug_print(&src, true); 1106 - drm_rect_debug_print(&dst, false); 960 + drm_rect_debug_print(src, true); 961 + drm_rect_debug_print(dst, false); 1107 962 1108 963 return vscale; 1109 964 } 1110 965 1111 966 /* Make the source viewport size an exact multiple of the scaling factors. */ 1112 - drm_rect_adjust_size(&src, 1113 - drm_rect_width(&dst) * hscale - drm_rect_width(&src), 1114 - drm_rect_height(&dst) * vscale - drm_rect_height(&src)); 967 + drm_rect_adjust_size(src, 968 + drm_rect_width(dst) * hscale - drm_rect_width(src), 969 + drm_rect_height(dst) * vscale - drm_rect_height(src)); 1115 970 1116 - drm_rect_rotate_inv(&src, fb->width << 16, fb->height << 16, 971 + drm_rect_rotate_inv(src, fb->width << 16, fb->height << 16, 1117 972 intel_plane->rotation); 1118 973 1119 974 /* sanity check to make sure the src viewport wasn't enlarged */ 1120 - WARN_ON(src.x1 < (int) src_x || 1121 - src.y1 < (int) src_y || 1122 - src.x2 > (int) (src_x + src_w) || 1123 - src.y2 > (int) (src_y + src_h)); 975 + WARN_ON(src->x1 < (int) orig_src->x1 || 976 + src->y1 < (int) orig_src->y1 || 977 + src->x2 > (int) orig_src->x2 || 978 + src->y2 > (int) orig_src->y2); 1124 979 1125 980 /* 1126 981 * Hardware doesn't handle subpixel coordinates. ··· 1128 983 * increase the source viewport size, because that could 1129 984 * push the downscaling factor out of bounds. 1130 985 */ 1131 - src_x = src.x1 >> 16; 1132 - src_w = drm_rect_width(&src) >> 16; 1133 - src_y = src.y1 >> 16; 1134 - src_h = drm_rect_height(&src) >> 16; 986 + src_x = src->x1 >> 16; 987 + src_w = drm_rect_width(src) >> 16; 988 + src_y = src->y1 >> 16; 989 + src_h = drm_rect_height(src) >> 16; 1135 990 1136 991 if (format_is_yuv(fb->pixel_format)) { 1137 992 src_x &= ~1; ··· 1145 1000 crtc_w &= ~1; 1146 1001 1147 1002 if (crtc_w == 0) 1148 - visible = false; 1003 + state->visible = false; 1149 1004 } 1150 1005 } 1151 1006 1152 1007 /* Check size restrictions when scaling */ 1153 - if (visible && (src_w != crtc_w || src_h != crtc_h)) { 1008 + if (state->visible && (src_w != crtc_w || src_h != crtc_h)) { 1154 1009 unsigned int width_bytes; 1155 1010 1156 1011 WARN_ON(!intel_plane->can_scale); ··· 1158 1013 /* FIXME interlacing min height is 6 */ 1159 1014 1160 1015 if (crtc_w < 3 || crtc_h < 3) 1161 - visible = false; 1016 + state->visible = false; 1162 1017 1163 1018 if (src_w < 3 || src_h < 3) 1164 - visible = false; 1019 + state->visible = false; 1165 1020 1166 - width_bytes = ((src_x * pixel_size) & 63) + src_w * pixel_size; 1021 + width_bytes = ((src_x * pixel_size) & 63) + 1022 + src_w * pixel_size; 1167 1023 1168 1024 if (src_w > 2048 || src_h > 2048 || 1169 1025 width_bytes > 4096 || fb->pitches[0] > 4096) { ··· 1173 1027 } 1174 1028 } 1175 1029 1176 - dst.x1 = crtc_x; 1177 - dst.x2 = crtc_x + crtc_w; 1178 - dst.y1 = crtc_y; 1179 - dst.y2 = crtc_y + crtc_h; 1030 + if (state->visible) { 1031 + src->x1 = src_x; 1032 + src->x2 = src_x + src_w; 1033 + src->y1 = src_y; 1034 + src->y2 = src_y + src_h; 1035 + } 1036 + 1037 + dst->x1 = crtc_x; 1038 + dst->x2 = crtc_x + crtc_w; 1039 + dst->y1 = crtc_y; 1040 + dst->y2 = crtc_y + crtc_h; 1041 + 1042 + return 0; 1043 + } 1044 + 1045 + static int 1046 + intel_commit_sprite_plane(struct drm_plane *plane, 1047 + struct intel_plane_state *state) 1048 + { 1049 + struct drm_device *dev = plane->dev; 1050 + struct drm_crtc *crtc = state->crtc; 1051 + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 1052 + struct intel_plane *intel_plane = to_intel_plane(plane); 1053 + enum pipe pipe = intel_crtc->pipe; 1054 + struct drm_framebuffer *fb = state->fb; 1055 + struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb); 1056 + struct drm_i915_gem_object *obj = intel_fb->obj; 1057 + struct drm_i915_gem_object *old_obj = intel_plane->obj; 1058 + int crtc_x, crtc_y; 1059 + unsigned int crtc_w, crtc_h; 1060 + uint32_t src_x, src_y, src_w, src_h; 1061 + struct drm_rect *dst = &state->dst; 1062 + const struct drm_rect *clip = &state->clip; 1063 + bool primary_enabled; 1064 + int ret; 1180 1065 1181 1066 /* 1182 1067 * If the sprite is completely covering the primary plane, 1183 1068 * we can disable the primary and save power. 1184 1069 */ 1185 - primary_enabled = !drm_rect_equals(&dst, &clip) || colorkey_enabled(intel_plane); 1186 - WARN_ON(!primary_enabled && !visible && intel_crtc->active); 1070 + primary_enabled = !drm_rect_equals(dst, clip) || colorkey_enabled(intel_plane); 1071 + WARN_ON(!primary_enabled && !state->visible && intel_crtc->active); 1187 1072 1188 - mutex_lock(&dev->struct_mutex); 1189 1073 1190 - /* Note that this will apply the VT-d workaround for scanouts, 1191 - * which is more restrictive than required for sprites. (The 1192 - * primary plane requires 256KiB alignment with 64 PTE padding, 1193 - * the sprite planes only require 128KiB alignment and 32 PTE padding. 1194 - */ 1195 - ret = intel_pin_and_fence_fb_obj(dev, obj, NULL); 1074 + if (old_obj != obj) { 1075 + mutex_lock(&dev->struct_mutex); 1196 1076 1197 - i915_gem_track_fb(old_obj, obj, 1198 - INTEL_FRONTBUFFER_SPRITE(pipe)); 1199 - mutex_unlock(&dev->struct_mutex); 1077 + /* Note that this will apply the VT-d workaround for scanouts, 1078 + * which is more restrictive than required for sprites. (The 1079 + * primary plane requires 256KiB alignment with 64 PTE padding, 1080 + * the sprite planes only require 128KiB alignment and 32 PTE 1081 + * padding. 1082 + */ 1083 + ret = intel_pin_and_fence_fb_obj(dev, obj, NULL); 1084 + if (ret == 0) 1085 + i915_gem_track_fb(old_obj, obj, 1086 + INTEL_FRONTBUFFER_SPRITE(pipe)); 1087 + mutex_unlock(&dev->struct_mutex); 1088 + if (ret) 1089 + return ret; 1090 + } 1200 1091 1201 - if (ret) 1202 - return ret; 1203 - 1204 - intel_plane->crtc_x = orig.crtc_x; 1205 - intel_plane->crtc_y = orig.crtc_y; 1206 - intel_plane->crtc_w = orig.crtc_w; 1207 - intel_plane->crtc_h = orig.crtc_h; 1208 - intel_plane->src_x = orig.src_x; 1209 - intel_plane->src_y = orig.src_y; 1210 - intel_plane->src_w = orig.src_w; 1211 - intel_plane->src_h = orig.src_h; 1092 + intel_plane->crtc_x = state->orig_dst.x1; 1093 + intel_plane->crtc_y = state->orig_dst.y1; 1094 + intel_plane->crtc_w = drm_rect_width(&state->orig_dst); 1095 + intel_plane->crtc_h = drm_rect_height(&state->orig_dst); 1096 + intel_plane->src_x = state->orig_src.x1; 1097 + intel_plane->src_y = state->orig_src.y1; 1098 + intel_plane->src_w = drm_rect_width(&state->orig_src); 1099 + intel_plane->src_h = drm_rect_height(&state->orig_src); 1212 1100 intel_plane->obj = obj; 1213 1101 1214 1102 if (intel_crtc->active) { ··· 1256 1076 if (primary_was_enabled && !primary_enabled) 1257 1077 intel_pre_disable_primary(crtc); 1258 1078 1259 - if (visible) 1079 + if (state->visible) { 1080 + crtc_x = state->dst.x1; 1081 + crtc_y = state->dst.y1; 1082 + crtc_w = drm_rect_width(&state->dst); 1083 + crtc_h = drm_rect_height(&state->dst); 1084 + src_x = state->src.x1; 1085 + src_y = state->src.y1; 1086 + src_w = drm_rect_width(&state->src); 1087 + src_h = drm_rect_height(&state->src); 1260 1088 intel_plane->update_plane(plane, crtc, fb, obj, 1261 1089 crtc_x, crtc_y, crtc_w, crtc_h, 1262 1090 src_x, src_y, src_w, src_h); 1263 - else 1091 + } else { 1264 1092 intel_plane->disable_plane(plane, crtc); 1093 + } 1094 + 1265 1095 1266 1096 intel_frontbuffer_flip(dev, INTEL_FRONTBUFFER_SPRITE(pipe)); 1267 1097 ··· 1280 1090 } 1281 1091 1282 1092 /* Unpin old obj after new one is active to avoid ugliness */ 1283 - if (old_obj) { 1093 + if (old_obj && old_obj != obj) { 1094 + 1284 1095 /* 1285 1096 * It's fairly common to simply update the position of 1286 1097 * an existing object. In that case, we don't need to 1287 1098 * wait for vblank to avoid ugliness, we only need to 1288 1099 * do the pin & ref bookkeeping. 1289 1100 */ 1290 - if (old_obj != obj && intel_crtc->active) 1101 + if (intel_crtc->active) 1291 1102 intel_wait_for_vblank(dev, intel_crtc->pipe); 1292 1103 1293 1104 mutex_lock(&dev->struct_mutex); ··· 1297 1106 } 1298 1107 1299 1108 return 0; 1109 + } 1110 + 1111 + static int 1112 + intel_update_plane(struct drm_plane *plane, struct drm_crtc *crtc, 1113 + struct drm_framebuffer *fb, int crtc_x, int crtc_y, 1114 + unsigned int crtc_w, unsigned int crtc_h, 1115 + uint32_t src_x, uint32_t src_y, 1116 + uint32_t src_w, uint32_t src_h) 1117 + { 1118 + struct intel_plane_state state; 1119 + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 1120 + int ret; 1121 + 1122 + state.crtc = crtc; 1123 + state.fb = fb; 1124 + 1125 + /* sample coordinates in 16.16 fixed point */ 1126 + state.src.x1 = src_x; 1127 + state.src.x2 = src_x + src_w; 1128 + state.src.y1 = src_y; 1129 + state.src.y2 = src_y + src_h; 1130 + 1131 + /* integer pixels */ 1132 + state.dst.x1 = crtc_x; 1133 + state.dst.x2 = crtc_x + crtc_w; 1134 + state.dst.y1 = crtc_y; 1135 + state.dst.y2 = crtc_y + crtc_h; 1136 + 1137 + state.clip.x1 = 0; 1138 + state.clip.y1 = 0; 1139 + state.clip.x2 = intel_crtc->active ? intel_crtc->config.pipe_src_w : 0; 1140 + state.clip.y2 = intel_crtc->active ? intel_crtc->config.pipe_src_h : 0; 1141 + state.orig_src = state.src; 1142 + state.orig_dst = state.dst; 1143 + 1144 + ret = intel_check_sprite_plane(plane, &state); 1145 + if (ret) 1146 + return ret; 1147 + 1148 + return intel_commit_sprite_plane(plane, &state); 1300 1149 } 1301 1150 1302 1151 static int ··· 1536 1305 DRM_FORMAT_VYUY, 1537 1306 }; 1538 1307 1308 + static uint32_t skl_plane_formats[] = { 1309 + DRM_FORMAT_RGB565, 1310 + DRM_FORMAT_ABGR8888, 1311 + DRM_FORMAT_ARGB8888, 1312 + DRM_FORMAT_XBGR8888, 1313 + DRM_FORMAT_XRGB8888, 1314 + DRM_FORMAT_YUYV, 1315 + DRM_FORMAT_YVYU, 1316 + DRM_FORMAT_UYVY, 1317 + DRM_FORMAT_VYUY, 1318 + }; 1319 + 1539 1320 int 1540 1321 intel_plane_init(struct drm_device *dev, enum pipe pipe, int plane) 1541 1322 { ··· 1611 1368 num_plane_formats = ARRAY_SIZE(snb_plane_formats); 1612 1369 } 1613 1370 break; 1371 + case 9: 1372 + /* 1373 + * FIXME: Skylake planes can be scaled (with some restrictions), 1374 + * but this is for another time. 1375 + */ 1376 + intel_plane->can_scale = false; 1377 + intel_plane->max_downscale = 1; 1378 + intel_plane->update_plane = skl_update_plane; 1379 + intel_plane->disable_plane = skl_disable_plane; 1380 + intel_plane->update_colorkey = skl_update_colorkey; 1381 + intel_plane->get_colorkey = skl_get_colorkey; 1614 1382 1383 + plane_formats = skl_plane_formats; 1384 + num_plane_formats = ARRAY_SIZE(skl_plane_formats); 1385 + break; 1615 1386 default: 1616 1387 kfree(intel_plane); 1617 1388 return -ENODEV;
+4 -5
drivers/gpu/drm/i915/intel_tv.c
··· 1182 1182 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 1183 1183 struct drm_device *dev = encoder->dev; 1184 1184 struct drm_i915_private *dev_priv = dev->dev_private; 1185 - unsigned long irqflags; 1186 1185 u32 tv_ctl, save_tv_ctl; 1187 1186 u32 tv_dac, save_tv_dac; 1188 1187 int type; 1189 1188 1190 1189 /* Disable TV interrupts around load detect or we'll recurse */ 1191 1190 if (connector->polled & DRM_CONNECTOR_POLL_HPD) { 1192 - spin_lock_irqsave(&dev_priv->irq_lock, irqflags); 1191 + spin_lock_irq(&dev_priv->irq_lock); 1193 1192 i915_disable_pipestat(dev_priv, 0, 1194 1193 PIPE_HOTPLUG_INTERRUPT_STATUS | 1195 1194 PIPE_HOTPLUG_TV_INTERRUPT_STATUS); 1196 - spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); 1195 + spin_unlock_irq(&dev_priv->irq_lock); 1197 1196 } 1198 1197 1199 1198 save_tv_dac = tv_dac = I915_READ(TV_DAC); ··· 1265 1266 1266 1267 /* Restore interrupt config */ 1267 1268 if (connector->polled & DRM_CONNECTOR_POLL_HPD) { 1268 - spin_lock_irqsave(&dev_priv->irq_lock, irqflags); 1269 + spin_lock_irq(&dev_priv->irq_lock); 1269 1270 i915_enable_pipestat(dev_priv, 0, 1270 1271 PIPE_HOTPLUG_INTERRUPT_STATUS | 1271 1272 PIPE_HOTPLUG_TV_INTERRUPT_STATUS); 1272 - spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); 1273 + spin_unlock_irq(&dev_priv->irq_lock); 1273 1274 } 1274 1275 1275 1276 return type;
+8 -11
drivers/gpu/drm/i915/intel_uncore.c
··· 194 194 static void __vlv_force_wake_get(struct drm_i915_private *dev_priv, 195 195 int fw_engine) 196 196 { 197 + /* 198 + * WaRsDontPollForAckOnClearingFWBits:vlv 199 + * Hardware clears ack bits lazily (only when all ack 200 + * bits become 0) so don't poll for individiual ack 201 + * bits to be clear here like on other platforms. 202 + */ 203 + 197 204 /* Check for Render Engine */ 198 205 if (FORCEWAKE_RENDER & fw_engine) { 199 - if (wait_for_atomic((__raw_i915_read32(dev_priv, 200 - FORCEWAKE_ACK_VLV) & 201 - FORCEWAKE_KERNEL) == 0, 202 - FORCEWAKE_ACK_TIMEOUT_MS)) 203 - DRM_ERROR("Timed out: Render forcewake old ack to clear.\n"); 204 206 205 207 __raw_i915_write32(dev_priv, FORCEWAKE_VLV, 206 208 _MASKED_BIT_ENABLE(FORCEWAKE_KERNEL)); ··· 216 214 217 215 /* Check for Media Engine */ 218 216 if (FORCEWAKE_MEDIA & fw_engine) { 219 - if (wait_for_atomic((__raw_i915_read32(dev_priv, 220 - FORCEWAKE_ACK_MEDIA_VLV) & 221 - FORCEWAKE_KERNEL) == 0, 222 - FORCEWAKE_ACK_TIMEOUT_MS)) 223 - DRM_ERROR("Timed out: Media forcewake old ack to clear.\n"); 224 217 225 218 __raw_i915_write32(dev_priv, FORCEWAKE_MEDIA_VLV, 226 219 _MASKED_BIT_ENABLE(FORCEWAKE_KERNEL)); ··· 965 968 /* supported gens, 0x10 for 4, 0x30 for 4 and 5, etc. */ 966 969 uint32_t gen_bitmask; 967 970 } whitelist[] = { 968 - { RING_TIMESTAMP(RENDER_RING_BASE), 8, GEN_RANGE(4, 8) }, 971 + { RING_TIMESTAMP(RENDER_RING_BASE), 8, GEN_RANGE(4, 9) }, 969 972 }; 970 973 971 974 int i915_reg_read_ioctl(struct drm_device *dev,
+3 -2
include/drm/drm_dp_helper.h
··· 303 303 #define DP_TEST_CRC_B_CB 0x244 304 304 305 305 #define DP_TEST_SINK_MISC 0x246 306 - #define DP_TEST_CRC_SUPPORTED (1 << 5) 306 + # define DP_TEST_CRC_SUPPORTED (1 << 5) 307 + # define DP_TEST_COUNT_MASK 0x7 307 308 308 309 #define DP_TEST_RESPONSE 0x260 309 310 # define DP_TEST_ACK (1 << 0) ··· 314 313 #define DP_TEST_EDID_CHECKSUM 0x261 315 314 316 315 #define DP_TEST_SINK 0x270 317 - #define DP_TEST_SINK_START (1 << 0) 316 + # define DP_TEST_SINK_START (1 << 0) 318 317 319 318 #define DP_PAYLOAD_TABLE_UPDATE_STATUS 0x2c0 /* 1.2 MST */ 320 319 # define DP_PAYLOAD_TABLE_UPDATED (1 << 0)
+17
include/drm/i915_pciids.h
··· 259 259 INTEL_VGA_DEVICE(0x22b2, info), \ 260 260 INTEL_VGA_DEVICE(0x22b3, info) 261 261 262 + #define INTEL_SKL_IDS(info) \ 263 + INTEL_VGA_DEVICE(0x1916, info), /* ULT GT2 */ \ 264 + INTEL_VGA_DEVICE(0x1906, info), /* ULT GT1 */ \ 265 + INTEL_VGA_DEVICE(0x1926, info), /* ULT GT3 */ \ 266 + INTEL_VGA_DEVICE(0x1921, info), /* ULT GT2F */ \ 267 + INTEL_VGA_DEVICE(0x190E, info), /* ULX GT1 */ \ 268 + INTEL_VGA_DEVICE(0x191E, info), /* ULX GT2 */ \ 269 + INTEL_VGA_DEVICE(0x1912, info), /* DT GT2 */ \ 270 + INTEL_VGA_DEVICE(0x1902, info), /* DT GT1 */ \ 271 + INTEL_VGA_DEVICE(0x191B, info), /* Halo GT2 */ \ 272 + INTEL_VGA_DEVICE(0x192B, info), /* Halo GT3 */ \ 273 + INTEL_VGA_DEVICE(0x190B, info), /* Halo GT1 */ \ 274 + INTEL_VGA_DEVICE(0x191A, info), /* SRV GT2 */ \ 275 + INTEL_VGA_DEVICE(0x192A, info), /* SRV GT3 */ \ 276 + INTEL_VGA_DEVICE(0x190A, info), /* SRV GT1 */ \ 277 + INTEL_VGA_DEVICE(0x191D, info) /* WKS GT2 */ 278 + 262 279 #endif /* _I915_PCIIDS_H */