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

Merge tag 'bdw-stage1-2013-11-08-v2' of git://people.freedesktop.org/~danvet/drm-intel into drm-next

So here's the Broadwell pull request. From a kernel driver pov there's
two areas with big changes in Broadwell:
- Completely new enumerated interrupt bits. On the plus side it now looks
fairly unform and sane.
- Completely new pagetable layout.

To ensure minimal impact on existing platforms we've refactored both the
irq and low-level gtt handling code a lot in anticipation of the bdw push.
So now bdw enabling in these areas just plugs in a bunch of vfuncs.

Otherwise it's all fairly harmless adjusting of switch cases and
if-ladders to shovel bdw into the right blocks. So minimized impact on
existing platforms. I've also merged the bdw-stage1 branch into our
-nightly integration branch for the past week to make sure we don't break
anything.

Note that there's still quite a flurry or patches floating around, but
I've figured I'll push this out. I plan to keep the bdw fixes separate
from my usual -fixes stream so that you can reject them easily in case it
still looks like too much churn. Also, bdw is for now hidden behind the
preliminary hw enabling module option. So there's no real pressure to get
follow-up patches all into 3.13.

* tag 'bdw-stage1-2013-11-08-v2' of git://people.freedesktop.org/~danvet/drm-intel: (75 commits)
drm/i915: Mask the vblank interrupt on bdw by default
drm/i915: Wire up cpu fifo underrun reporting support for bdw
drm/i915: Optimize gen8_enable|disable_vblank functions
drm/i915: Wire up pipe CRC support for bdw
drm/i915: Wire up PCH interrupts for bdw
drm/i915: Wire up port A aux channel
drm/i915: Fix up the bdw pipe interrupt enable lists
drm/i915: Optimize pipe irq handling on bdw
drm/i915/bdw: Take render error interrupt out of the mask
drm/i915/bdw: Add BDW PCH check first
drm/i915: Use hsw_crt_get_config on BDW
drm/i915/bdw: Change dp aux timeout to 600us on DDIA
drm/i915/bdw: Enable trickle feed on Broadwell
drm/i915/bdw: WaSingleSubspanDispatchOnAALinesAndPoints
drm/i915/bdw: conservative SBE VUE cache mode
drm/i915/bdw: Limit SDE poly depth FIFO to 2
drm/i915/bdw: Sampler power bypass disable
ddrm/i915/bdw: Disable centroid pixel perf optimization
drm/i915/bdw: BWGTLB clock gate disable
drm/i915/bdw: Implement edp PSR workarounds
...

+1847 -126
+12
arch/x86/kernel/early-quirks.c
··· 313 313 return gmch_ctrl << 25; /* 32 MB units */ 314 314 } 315 315 316 + static inline size_t gen8_stolen_size(int num, int slot, int func) 317 + { 318 + u16 gmch_ctrl; 319 + 320 + gmch_ctrl = read_pci_config_16(num, slot, func, SNB_GMCH_CTRL); 321 + gmch_ctrl >>= BDW_GMCH_GMS_SHIFT; 322 + gmch_ctrl &= BDW_GMCH_GMS_MASK; 323 + return gmch_ctrl << 25; /* 32 MB units */ 324 + } 325 + 316 326 typedef size_t (*stolen_size_fn)(int num, int slot, int func); 317 327 318 328 static struct pci_device_id intel_stolen_ids[] __initdata = { ··· 346 336 INTEL_IVB_D_IDS(gen6_stolen_size), 347 337 INTEL_HSW_D_IDS(gen6_stolen_size), 348 338 INTEL_HSW_M_IDS(gen6_stolen_size), 339 + INTEL_BDW_M_IDS(gen8_stolen_size), 340 + INTEL_BDW_D_IDS(gen8_stolen_size) 349 341 }; 350 342 351 343 static void __init intel_graphics_stolen(int num, int slot, int func)
+97 -12
drivers/gpu/drm/i915/i915_debugfs.c
··· 586 586 if (ret) 587 587 return ret; 588 588 589 - if (IS_VALLEYVIEW(dev)) { 589 + if (INTEL_INFO(dev)->gen >= 8) { 590 + int i; 591 + seq_printf(m, "Master Interrupt Control:\t%08x\n", 592 + I915_READ(GEN8_MASTER_IRQ)); 593 + 594 + for (i = 0; i < 4; i++) { 595 + seq_printf(m, "GT Interrupt IMR %d:\t%08x\n", 596 + i, I915_READ(GEN8_GT_IMR(i))); 597 + seq_printf(m, "GT Interrupt IIR %d:\t%08x\n", 598 + i, I915_READ(GEN8_GT_IIR(i))); 599 + seq_printf(m, "GT Interrupt IER %d:\t%08x\n", 600 + i, I915_READ(GEN8_GT_IER(i))); 601 + } 602 + 603 + for_each_pipe(i) { 604 + seq_printf(m, "Pipe %c IMR:\t%08x\n", 605 + pipe_name(i), 606 + I915_READ(GEN8_DE_PIPE_IMR(i))); 607 + seq_printf(m, "Pipe %c IIR:\t%08x\n", 608 + pipe_name(i), 609 + I915_READ(GEN8_DE_PIPE_IIR(i))); 610 + seq_printf(m, "Pipe %c IER:\t%08x\n", 611 + pipe_name(i), 612 + I915_READ(GEN8_DE_PIPE_IER(i))); 613 + } 614 + 615 + seq_printf(m, "Display Engine port interrupt mask:\t%08x\n", 616 + I915_READ(GEN8_DE_PORT_IMR)); 617 + seq_printf(m, "Display Engine port interrupt identity:\t%08x\n", 618 + I915_READ(GEN8_DE_PORT_IIR)); 619 + seq_printf(m, "Display Engine port interrupt enable:\t%08x\n", 620 + I915_READ(GEN8_DE_PORT_IER)); 621 + 622 + seq_printf(m, "Display Engine misc interrupt mask:\t%08x\n", 623 + I915_READ(GEN8_DE_MISC_IMR)); 624 + seq_printf(m, "Display Engine misc interrupt identity:\t%08x\n", 625 + I915_READ(GEN8_DE_MISC_IIR)); 626 + seq_printf(m, "Display Engine misc interrupt enable:\t%08x\n", 627 + I915_READ(GEN8_DE_MISC_IER)); 628 + 629 + seq_printf(m, "PCU interrupt mask:\t%08x\n", 630 + I915_READ(GEN8_PCU_IMR)); 631 + seq_printf(m, "PCU interrupt identity:\t%08x\n", 632 + I915_READ(GEN8_PCU_IIR)); 633 + seq_printf(m, "PCU interrupt enable:\t%08x\n", 634 + I915_READ(GEN8_PCU_IER)); 635 + } else if (IS_VALLEYVIEW(dev)) { 590 636 seq_printf(m, "Display IER:\t%08x\n", 591 637 I915_READ(VLV_IER)); 592 638 seq_printf(m, "Display IIR:\t%08x\n", ··· 704 658 seq_printf(m, "Interrupts received: %d\n", 705 659 atomic_read(&dev_priv->irq_received)); 706 660 for_each_ring(ring, dev_priv, i) { 707 - if (IS_GEN6(dev) || IS_GEN7(dev)) { 661 + if (INTEL_INFO(dev)->gen >= 6) { 708 662 seq_printf(m, 709 663 "Graphics Interrupt mask (%s): %08x\n", 710 664 ring->name, I915_READ_IMR(ring)); ··· 1623 1577 I915_READ16(C0DRB3)); 1624 1578 seq_printf(m, "C1DRB3 = 0x%04x\n", 1625 1579 I915_READ16(C1DRB3)); 1626 - } else if (IS_GEN6(dev) || IS_GEN7(dev)) { 1580 + } else if (INTEL_INFO(dev)->gen >= 6) { 1627 1581 seq_printf(m, "MAD_DIMM_C0 = 0x%08x\n", 1628 1582 I915_READ(MAD_DIMM_C0)); 1629 1583 seq_printf(m, "MAD_DIMM_C1 = 0x%08x\n", ··· 1632 1586 I915_READ(MAD_DIMM_C2)); 1633 1587 seq_printf(m, "TILECTL = 0x%08x\n", 1634 1588 I915_READ(TILECTL)); 1635 - seq_printf(m, "ARB_MODE = 0x%08x\n", 1636 - I915_READ(ARB_MODE)); 1589 + if (IS_GEN8(dev)) 1590 + seq_printf(m, "GAMTARBMODE = 0x%08x\n", 1591 + I915_READ(GAMTARBMODE)); 1592 + else 1593 + seq_printf(m, "ARB_MODE = 0x%08x\n", 1594 + I915_READ(ARB_MODE)); 1637 1595 seq_printf(m, "DISP_ARB_CTL = 0x%08x\n", 1638 1596 I915_READ(DISP_ARB_CTL)); 1639 1597 } ··· 1646 1596 return 0; 1647 1597 } 1648 1598 1649 - static int i915_ppgtt_info(struct seq_file *m, void *data) 1599 + static void gen8_ppgtt_info(struct seq_file *m, struct drm_device *dev) 1650 1600 { 1651 - struct drm_info_node *node = (struct drm_info_node *) m->private; 1652 - struct drm_device *dev = node->minor->dev; 1653 1601 struct drm_i915_private *dev_priv = dev->dev_private; 1654 1602 struct intel_ring_buffer *ring; 1655 - int i, ret; 1603 + struct i915_hw_ppgtt *ppgtt = dev_priv->mm.aliasing_ppgtt; 1604 + int unused, i; 1656 1605 1606 + if (!ppgtt) 1607 + return; 1657 1608 1658 - ret = mutex_lock_interruptible(&dev->struct_mutex); 1659 - if (ret) 1660 - return ret; 1609 + seq_printf(m, "Page directories: %d\n", ppgtt->num_pd_pages); 1610 + seq_printf(m, "Page tables: %d\n", ppgtt->num_pt_pages); 1611 + for_each_ring(ring, dev_priv, unused) { 1612 + seq_printf(m, "%s\n", ring->name); 1613 + for (i = 0; i < 4; i++) { 1614 + u32 offset = 0x270 + i * 8; 1615 + u64 pdp = I915_READ(ring->mmio_base + offset + 4); 1616 + pdp <<= 32; 1617 + pdp |= I915_READ(ring->mmio_base + offset); 1618 + for (i = 0; i < 4; i++) 1619 + seq_printf(m, "\tPDP%d 0x%016llx\n", i, pdp); 1620 + } 1621 + } 1622 + } 1623 + 1624 + static void gen6_ppgtt_info(struct seq_file *m, struct drm_device *dev) 1625 + { 1626 + struct drm_i915_private *dev_priv = dev->dev_private; 1627 + struct intel_ring_buffer *ring; 1628 + int i; 1629 + 1661 1630 if (INTEL_INFO(dev)->gen == 6) 1662 1631 seq_printf(m, "GFX_MODE: 0x%08x\n", I915_READ(GFX_MODE)); 1663 1632 ··· 1695 1626 seq_printf(m, "pd gtt offset: 0x%08x\n", ppgtt->pd_offset); 1696 1627 } 1697 1628 seq_printf(m, "ECOCHK: 0x%08x\n", I915_READ(GAM_ECOCHK)); 1629 + } 1630 + 1631 + static int i915_ppgtt_info(struct seq_file *m, void *data) 1632 + { 1633 + struct drm_info_node *node = (struct drm_info_node *) m->private; 1634 + struct drm_device *dev = node->minor->dev; 1635 + 1636 + int ret = mutex_lock_interruptible(&dev->struct_mutex); 1637 + if (ret) 1638 + return ret; 1639 + 1640 + if (INTEL_INFO(dev)->gen >= 8) 1641 + gen8_ppgtt_info(m, dev); 1642 + else if (INTEL_INFO(dev)->gen >= 6) 1643 + gen6_ppgtt_info(m, dev); 1644 + 1698 1645 mutex_unlock(&dev->struct_mutex); 1699 1646 1700 1647 return 0;
+33 -1
drivers/gpu/drm/i915/i915_drv.c
··· 336 336 .ring_mask = RENDER_RING | BSD_RING | BLT_RING | VEBOX_RING, 337 337 }; 338 338 339 + static const struct intel_device_info intel_broadwell_d_info = { 340 + .is_preliminary = 1, 341 + .gen = 8, .num_pipes = 3, 342 + .need_gfx_hws = 1, .has_hotplug = 1, 343 + .ring_mask = RENDER_RING | BSD_RING | BLT_RING | VEBOX_RING, 344 + .has_llc = 1, 345 + .has_ddi = 1, 346 + }; 347 + 348 + static const struct intel_device_info intel_broadwell_m_info = { 349 + .is_preliminary = 1, 350 + .gen = 8, .is_mobile = 1, .num_pipes = 3, 351 + .need_gfx_hws = 1, .has_hotplug = 1, 352 + .ring_mask = RENDER_RING | BSD_RING | BLT_RING | VEBOX_RING, 353 + .has_llc = 1, 354 + .has_ddi = 1, 355 + }; 356 + 339 357 /* 340 358 * Make sure any device matches here are from most specific to most 341 359 * general. For example, since the Quanta match is based on the subsystem ··· 385 367 INTEL_HSW_D_IDS(&intel_haswell_d_info), \ 386 368 INTEL_HSW_M_IDS(&intel_haswell_m_info), \ 387 369 INTEL_VLV_M_IDS(&intel_valleyview_m_info), \ 388 - INTEL_VLV_D_IDS(&intel_valleyview_d_info) 370 + INTEL_VLV_D_IDS(&intel_valleyview_d_info), \ 371 + INTEL_BDW_M_IDS(&intel_broadwell_m_info), \ 372 + INTEL_BDW_D_IDS(&intel_broadwell_d_info) 389 373 390 374 static const struct pci_device_id pciidlist[] = { /* aka */ 391 375 INTEL_PCI_IDS, ··· 448 428 DRM_DEBUG_KMS("Found LynxPoint PCH\n"); 449 429 WARN_ON(!IS_HASWELL(dev)); 450 430 WARN_ON(IS_ULT(dev)); 431 + } else if (IS_BROADWELL(dev)) { 432 + dev_priv->pch_type = PCH_LPT; 433 + dev_priv->pch_id = 434 + INTEL_PCH_LPT_LP_DEVICE_ID_TYPE; 435 + DRM_DEBUG_KMS("This is Broadwell, assuming " 436 + "LynxPoint LP PCH\n"); 451 437 } else if (id == INTEL_PCH_LPT_LP_DEVICE_ID_TYPE) { 452 438 dev_priv->pch_type = PCH_LPT; 453 439 DRM_DEBUG_KMS("Found LynxPoint LP PCH\n"); ··· 477 451 { 478 452 if (INTEL_INFO(dev)->gen < 6) 479 453 return 0; 454 + 455 + /* Until we get further testing... */ 456 + if (IS_GEN8(dev)) { 457 + WARN_ON(!i915_preliminary_hw_support); 458 + return 0; 459 + } 480 460 481 461 if (i915_semaphores >= 0) 482 462 return i915_semaphores;
+28 -8
drivers/gpu/drm/i915/i915_drv.h
··· 118 118 #define HSW_ALWAYS_ON_POWER_DOMAINS ( \ 119 119 BIT(POWER_DOMAIN_PIPE_A) | \ 120 120 BIT(POWER_DOMAIN_TRANSCODER_EDP)) 121 + #define BDW_ALWAYS_ON_POWER_DOMAINS ( \ 122 + BIT(POWER_DOMAIN_PIPE_A) | \ 123 + BIT(POWER_DOMAIN_TRANSCODER_EDP) | \ 124 + BIT(POWER_DOMAIN_PIPE_A_PANEL_FITTER)) 121 125 122 126 enum hpd_pin { 123 127 HPD_NONE = 0, ··· 579 575 struct i915_hw_ppgtt { 580 576 struct i915_address_space base; 581 577 unsigned num_pd_entries; 582 - struct page **pt_pages; 583 - uint32_t pd_offset; 584 - dma_addr_t *pt_dma_addr; 585 - 578 + union { 579 + struct page **pt_pages; 580 + struct page *gen8_pt_pages; 581 + }; 582 + struct page *pd_pages; 583 + int num_pd_pages; 584 + int num_pt_pages; 585 + union { 586 + uint32_t pd_offset; 587 + dma_addr_t pd_dma_addr[4]; 588 + }; 589 + union { 590 + dma_addr_t *pt_dma_addr; 591 + dma_addr_t *gen8_pt_dma_addr[4]; 592 + }; 586 593 int (*enable)(struct drm_device *dev); 587 594 }; 588 595 ··· 1337 1322 struct mutex dpio_lock; 1338 1323 1339 1324 /** Cached value of IMR to avoid reads in updating the bitfield */ 1340 - u32 irq_mask; 1325 + union { 1326 + u32 irq_mask; 1327 + u32 de_irq_mask[I915_MAX_PIPES]; 1328 + }; 1341 1329 u32 gt_irq_mask; 1342 1330 u32 pm_irq_mask; 1343 1331 ··· 1751 1733 (dev)->pdev->device == 0x010A) 1752 1734 #define IS_VALLEYVIEW(dev) (INTEL_INFO(dev)->is_valleyview) 1753 1735 #define IS_HASWELL(dev) (INTEL_INFO(dev)->is_haswell) 1736 + #define IS_BROADWELL(dev) (INTEL_INFO(dev)->gen == 8) 1754 1737 #define IS_MOBILE(dev) (INTEL_INFO(dev)->is_mobile) 1755 1738 #define IS_HSW_EARLY_SDV(dev) (IS_HASWELL(dev) && \ 1756 1739 ((dev)->pdev->device & 0xFF00) == 0x0C00) ··· 1773 1754 #define IS_GEN5(dev) (INTEL_INFO(dev)->gen == 5) 1774 1755 #define IS_GEN6(dev) (INTEL_INFO(dev)->gen == 6) 1775 1756 #define IS_GEN7(dev) (INTEL_INFO(dev)->gen == 7) 1757 + #define IS_GEN8(dev) (INTEL_INFO(dev)->gen == 8) 1776 1758 1777 1759 #define RENDER_RING (1<<RCS) 1778 1760 #define BSD_RING (1<<VCS) ··· 1810 1790 #define HAS_PIPE_CXSR(dev) (INTEL_INFO(dev)->has_pipe_cxsr) 1811 1791 #define I915_HAS_FBC(dev) (INTEL_INFO(dev)->has_fbc) 1812 1792 1813 - #define HAS_IPS(dev) (IS_ULT(dev)) 1793 + #define HAS_IPS(dev) (IS_ULT(dev) || IS_BROADWELL(dev)) 1814 1794 1815 1795 #define HAS_DDI(dev) (INTEL_INFO(dev)->has_ddi) 1816 - #define HAS_POWER_WELL(dev) (IS_HASWELL(dev)) 1796 + #define HAS_POWER_WELL(dev) (IS_HASWELL(dev) || IS_BROADWELL(dev)) 1817 1797 #define HAS_FPGA_DBG_UNCLAIMED(dev) (INTEL_INFO(dev)->has_fpga_dbg) 1818 - #define HAS_PSR(dev) (IS_HASWELL(dev)) 1798 + #define HAS_PSR(dev) (IS_HASWELL(dev) || IS_BROADWELL(dev)) 1819 1799 1820 1800 #define INTEL_PCH_DEVICE_ID_MASK 0xff00 1821 1801 #define INTEL_PCH_IBX_DEVICE_ID_TYPE 0x3b00
+3
drivers/gpu/drm/i915/i915_gem.c
··· 2954 2954 obj->stride, obj->tiling_mode); 2955 2955 2956 2956 switch (INTEL_INFO(dev)->gen) { 2957 + case 8: 2957 2958 case 7: 2958 2959 case 6: 2959 2960 case 5: ··· 4362 4361 I915_WRITE(ARB_MODE, _MASKED_BIT_ENABLE(ARB_MODE_SWIZZLE_SNB)); 4363 4362 else if (IS_GEN7(dev)) 4364 4363 I915_WRITE(ARB_MODE, _MASKED_BIT_ENABLE(ARB_MODE_SWIZZLE_IVB)); 4364 + else if (IS_GEN8(dev)) 4365 + I915_WRITE(GAMTARBMODE, _MASKED_BIT_ENABLE(ARB_MODE_SWIZZLE_BDW)); 4365 4366 else 4366 4367 BUG(); 4367 4368 }
+3
drivers/gpu/drm/i915/i915_gem_context.c
··· 117 117 else 118 118 ret = GEN7_CXT_TOTAL_SIZE(reg) * 64; 119 119 break; 120 + case 8: 121 + ret = GEN8_CXT_TOTAL_SIZE; 122 + break; 120 123 default: 121 124 BUG(); 122 125 }
+32 -3
drivers/gpu/drm/i915/i915_gem_execbuffer.c
··· 212 212 relocate_entry_cpu(struct drm_i915_gem_object *obj, 213 213 struct drm_i915_gem_relocation_entry *reloc) 214 214 { 215 + struct drm_device *dev = obj->base.dev; 215 216 uint32_t page_offset = offset_in_page(reloc->offset); 216 217 char *vaddr; 217 218 int ret = -EINVAL; ··· 224 223 vaddr = kmap_atomic(i915_gem_object_get_page(obj, 225 224 reloc->offset >> PAGE_SHIFT)); 226 225 *(uint32_t *)(vaddr + page_offset) = reloc->delta; 226 + 227 + if (INTEL_INFO(dev)->gen >= 8) { 228 + page_offset = offset_in_page(page_offset + sizeof(uint32_t)); 229 + 230 + if (page_offset == 0) { 231 + kunmap_atomic(vaddr); 232 + vaddr = kmap_atomic(i915_gem_object_get_page(obj, 233 + (reloc->offset + sizeof(uint32_t)) >> PAGE_SHIFT)); 234 + } 235 + 236 + *(uint32_t *)(vaddr + page_offset) = 0; 237 + } 238 + 227 239 kunmap_atomic(vaddr); 228 240 229 241 return 0; ··· 267 253 reloc_entry = (uint32_t __iomem *) 268 254 (reloc_page + offset_in_page(reloc->offset)); 269 255 iowrite32(reloc->delta, reloc_entry); 256 + 257 + if (INTEL_INFO(dev)->gen >= 8) { 258 + reloc_entry += 1; 259 + 260 + if (offset_in_page(reloc->offset + sizeof(uint32_t)) == 0) { 261 + io_mapping_unmap_atomic(reloc_page); 262 + reloc_page = io_mapping_map_atomic_wc( 263 + dev_priv->gtt.mappable, 264 + reloc->offset + sizeof(uint32_t)); 265 + reloc_entry = reloc_page; 266 + } 267 + 268 + iowrite32(0, reloc_entry); 269 + } 270 + 270 271 io_mapping_unmap_atomic(reloc_page); 271 272 272 273 return 0; ··· 352 323 return 0; 353 324 354 325 /* Check that the relocation address is valid... */ 355 - if (unlikely(reloc->offset > obj->base.size - 4)) { 326 + if (unlikely(reloc->offset > 327 + obj->base.size - (INTEL_INFO(dev)->gen >= 8 ? 8 : 4))) { 356 328 DRM_DEBUG("Relocation beyond object bounds: " 357 329 "obj %p target %d offset %d size %d.\n", 358 330 obj, reloc->target_handle, ··· 1146 1116 1147 1117 /* snb/ivb/vlv conflate the "batch in ppgtt" bit with the "non-secure 1148 1118 * batch" bit. Hence we need to pin secure batches into the global gtt. 1149 - * hsw should have this fixed, but let's be paranoid and do it 1150 - * unconditionally for now. */ 1119 + * hsw should have this fixed, but bdw mucks it up again. */ 1151 1120 if (flags & I915_DISPATCH_SECURE && !batch_obj->has_global_gtt_mapping) 1152 1121 i915_gem_gtt_bind_object(batch_obj, batch_obj->cache_level); 1153 1122
+486 -18
drivers/gpu/drm/i915/i915_gem_gtt.c
··· 30 30 31 31 #define GEN6_PPGTT_PD_ENTRIES 512 32 32 #define I915_PPGTT_PT_ENTRIES (PAGE_SIZE / sizeof(gen6_gtt_pte_t)) 33 + typedef uint64_t gen8_gtt_pte_t; 34 + typedef gen8_gtt_pte_t gen8_ppgtt_pde_t; 33 35 34 36 /* PPGTT stuff */ 35 37 #define GEN6_GTT_ADDR_ENCODE(addr) ((addr) | (((addr) >> 28) & 0xff0)) ··· 58 56 #define HSW_WB_LLC_AGE0 HSW_CACHEABILITY_CONTROL(0x3) 59 57 #define HSW_WB_ELLC_LLC_AGE0 HSW_CACHEABILITY_CONTROL(0xb) 60 58 #define HSW_WT_ELLC_LLC_AGE0 HSW_CACHEABILITY_CONTROL(0x6) 59 + 60 + #define GEN8_PTES_PER_PAGE (PAGE_SIZE / sizeof(gen8_gtt_pte_t)) 61 + #define GEN8_PDES_PER_PAGE (PAGE_SIZE / sizeof(gen8_ppgtt_pde_t)) 62 + #define GEN8_LEGACY_PDPS 4 63 + 64 + #define PPAT_UNCACHED_INDEX (_PAGE_PWT | _PAGE_PCD) 65 + #define PPAT_CACHED_PDE_INDEX 0 /* WB LLC */ 66 + #define PPAT_CACHED_INDEX _PAGE_PAT /* WB LLCeLLC */ 67 + #define PPAT_DISPLAY_ELLC_INDEX _PAGE_PCD /* WT eLLC */ 68 + 69 + static inline gen8_gtt_pte_t gen8_pte_encode(dma_addr_t addr, 70 + enum i915_cache_level level, 71 + bool valid) 72 + { 73 + gen8_gtt_pte_t pte = valid ? _PAGE_PRESENT | _PAGE_RW : 0; 74 + pte |= addr; 75 + if (level != I915_CACHE_NONE) 76 + pte |= PPAT_CACHED_INDEX; 77 + else 78 + pte |= PPAT_UNCACHED_INDEX; 79 + return pte; 80 + } 81 + 82 + static inline gen8_ppgtt_pde_t gen8_pde_encode(struct drm_device *dev, 83 + dma_addr_t addr, 84 + enum i915_cache_level level) 85 + { 86 + gen8_ppgtt_pde_t pde = _PAGE_PRESENT | _PAGE_RW; 87 + pde |= addr; 88 + if (level != I915_CACHE_NONE) 89 + pde |= PPAT_CACHED_PDE_INDEX; 90 + else 91 + pde |= PPAT_UNCACHED_INDEX; 92 + return pde; 93 + } 61 94 62 95 static gen6_gtt_pte_t snb_pte_encode(dma_addr_t addr, 63 96 enum i915_cache_level level, ··· 193 156 } 194 157 195 158 return pte; 159 + } 160 + 161 + /* Broadwell Page Directory Pointer Descriptors */ 162 + static int gen8_write_pdp(struct intel_ring_buffer *ring, unsigned entry, 163 + uint64_t val) 164 + { 165 + int ret; 166 + 167 + BUG_ON(entry >= 4); 168 + 169 + ret = intel_ring_begin(ring, 6); 170 + if (ret) 171 + return ret; 172 + 173 + intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(1)); 174 + intel_ring_emit(ring, GEN8_RING_PDP_UDW(ring, entry)); 175 + intel_ring_emit(ring, (u32)(val >> 32)); 176 + intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(1)); 177 + intel_ring_emit(ring, GEN8_RING_PDP_LDW(ring, entry)); 178 + intel_ring_emit(ring, (u32)(val)); 179 + intel_ring_advance(ring); 180 + 181 + return 0; 182 + } 183 + 184 + static int gen8_ppgtt_enable(struct drm_device *dev) 185 + { 186 + struct drm_i915_private *dev_priv = dev->dev_private; 187 + struct intel_ring_buffer *ring; 188 + struct i915_hw_ppgtt *ppgtt = dev_priv->mm.aliasing_ppgtt; 189 + int i, j, ret; 190 + 191 + /* bit of a hack to find the actual last used pd */ 192 + int used_pd = ppgtt->num_pd_entries / GEN8_PDES_PER_PAGE; 193 + 194 + for_each_ring(ring, dev_priv, j) { 195 + I915_WRITE(RING_MODE_GEN7(ring), 196 + _MASKED_BIT_ENABLE(GFX_PPGTT_ENABLE)); 197 + } 198 + 199 + for (i = used_pd - 1; i >= 0; i--) { 200 + dma_addr_t addr = ppgtt->pd_dma_addr[i]; 201 + for_each_ring(ring, dev_priv, j) { 202 + ret = gen8_write_pdp(ring, i, addr); 203 + if (ret) 204 + return ret; 205 + } 206 + } 207 + return 0; 208 + } 209 + 210 + static void gen8_ppgtt_clear_range(struct i915_address_space *vm, 211 + unsigned first_entry, 212 + unsigned num_entries, 213 + bool use_scratch) 214 + { 215 + struct i915_hw_ppgtt *ppgtt = 216 + container_of(vm, struct i915_hw_ppgtt, base); 217 + gen8_gtt_pte_t *pt_vaddr, scratch_pte; 218 + unsigned act_pt = first_entry / GEN8_PTES_PER_PAGE; 219 + unsigned first_pte = first_entry % GEN8_PTES_PER_PAGE; 220 + unsigned last_pte, i; 221 + 222 + scratch_pte = gen8_pte_encode(ppgtt->base.scratch.addr, 223 + I915_CACHE_LLC, use_scratch); 224 + 225 + while (num_entries) { 226 + struct page *page_table = &ppgtt->gen8_pt_pages[act_pt]; 227 + 228 + last_pte = first_pte + num_entries; 229 + if (last_pte > GEN8_PTES_PER_PAGE) 230 + last_pte = GEN8_PTES_PER_PAGE; 231 + 232 + pt_vaddr = kmap_atomic(page_table); 233 + 234 + for (i = first_pte; i < last_pte; i++) 235 + pt_vaddr[i] = scratch_pte; 236 + 237 + kunmap_atomic(pt_vaddr); 238 + 239 + num_entries -= last_pte - first_pte; 240 + first_pte = 0; 241 + act_pt++; 242 + } 243 + } 244 + 245 + static void gen8_ppgtt_insert_entries(struct i915_address_space *vm, 246 + struct sg_table *pages, 247 + unsigned first_entry, 248 + enum i915_cache_level cache_level) 249 + { 250 + struct i915_hw_ppgtt *ppgtt = 251 + container_of(vm, struct i915_hw_ppgtt, base); 252 + gen8_gtt_pte_t *pt_vaddr; 253 + unsigned act_pt = first_entry / GEN8_PTES_PER_PAGE; 254 + unsigned act_pte = first_entry % GEN8_PTES_PER_PAGE; 255 + struct sg_page_iter sg_iter; 256 + 257 + pt_vaddr = kmap_atomic(&ppgtt->gen8_pt_pages[act_pt]); 258 + for_each_sg_page(pages->sgl, &sg_iter, pages->nents, 0) { 259 + dma_addr_t page_addr; 260 + 261 + page_addr = sg_dma_address(sg_iter.sg) + 262 + (sg_iter.sg_pgoffset << PAGE_SHIFT); 263 + pt_vaddr[act_pte] = gen8_pte_encode(page_addr, cache_level, 264 + true); 265 + if (++act_pte == GEN8_PTES_PER_PAGE) { 266 + kunmap_atomic(pt_vaddr); 267 + act_pt++; 268 + pt_vaddr = kmap_atomic(&ppgtt->gen8_pt_pages[act_pt]); 269 + act_pte = 0; 270 + 271 + } 272 + } 273 + kunmap_atomic(pt_vaddr); 274 + } 275 + 276 + static void gen8_ppgtt_cleanup(struct i915_address_space *vm) 277 + { 278 + struct i915_hw_ppgtt *ppgtt = 279 + container_of(vm, struct i915_hw_ppgtt, base); 280 + int i, j; 281 + 282 + for (i = 0; i < ppgtt->num_pd_pages ; i++) { 283 + if (ppgtt->pd_dma_addr[i]) { 284 + pci_unmap_page(ppgtt->base.dev->pdev, 285 + ppgtt->pd_dma_addr[i], 286 + PAGE_SIZE, PCI_DMA_BIDIRECTIONAL); 287 + 288 + for (j = 0; j < GEN8_PDES_PER_PAGE; j++) { 289 + dma_addr_t addr = ppgtt->gen8_pt_dma_addr[i][j]; 290 + if (addr) 291 + pci_unmap_page(ppgtt->base.dev->pdev, 292 + addr, 293 + PAGE_SIZE, 294 + PCI_DMA_BIDIRECTIONAL); 295 + 296 + } 297 + } 298 + kfree(ppgtt->gen8_pt_dma_addr[i]); 299 + } 300 + 301 + __free_pages(ppgtt->gen8_pt_pages, ppgtt->num_pt_pages << PAGE_SHIFT); 302 + __free_pages(ppgtt->pd_pages, ppgtt->num_pd_pages << PAGE_SHIFT); 303 + } 304 + 305 + /** 306 + * GEN8 legacy ppgtt programming is accomplished through 4 PDP registers with a 307 + * net effect resembling a 2-level page table in normal x86 terms. Each PDP 308 + * represents 1GB of memory 309 + * 4 * 512 * 512 * 4096 = 4GB legacy 32b address space. 310 + * 311 + * TODO: Do something with the size parameter 312 + **/ 313 + static int gen8_ppgtt_init(struct i915_hw_ppgtt *ppgtt, uint64_t size) 314 + { 315 + struct page *pt_pages; 316 + int i, j, ret = -ENOMEM; 317 + const int max_pdp = DIV_ROUND_UP(size, 1 << 30); 318 + const int num_pt_pages = GEN8_PDES_PER_PAGE * max_pdp; 319 + 320 + if (size % (1<<30)) 321 + DRM_INFO("Pages will be wasted unless GTT size (%llu) is divisible by 1GB\n", size); 322 + 323 + /* FIXME: split allocation into smaller pieces. For now we only ever do 324 + * this once, but with full PPGTT, the multiple contiguous allocations 325 + * will be bad. 326 + */ 327 + ppgtt->pd_pages = alloc_pages(GFP_KERNEL, get_order(max_pdp << PAGE_SHIFT)); 328 + if (!ppgtt->pd_pages) 329 + return -ENOMEM; 330 + 331 + pt_pages = alloc_pages(GFP_KERNEL, get_order(num_pt_pages << PAGE_SHIFT)); 332 + if (!pt_pages) { 333 + __free_pages(ppgtt->pd_pages, get_order(max_pdp << PAGE_SHIFT)); 334 + return -ENOMEM; 335 + } 336 + 337 + ppgtt->gen8_pt_pages = pt_pages; 338 + ppgtt->num_pd_pages = 1 << get_order(max_pdp << PAGE_SHIFT); 339 + ppgtt->num_pt_pages = 1 << get_order(num_pt_pages << PAGE_SHIFT); 340 + ppgtt->num_pd_entries = max_pdp * GEN8_PDES_PER_PAGE; 341 + ppgtt->enable = gen8_ppgtt_enable; 342 + ppgtt->base.clear_range = gen8_ppgtt_clear_range; 343 + ppgtt->base.insert_entries = gen8_ppgtt_insert_entries; 344 + ppgtt->base.cleanup = gen8_ppgtt_cleanup; 345 + 346 + BUG_ON(ppgtt->num_pd_pages > GEN8_LEGACY_PDPS); 347 + 348 + /* 349 + * - Create a mapping for the page directories. 350 + * - For each page directory: 351 + * allocate space for page table mappings. 352 + * map each page table 353 + */ 354 + for (i = 0; i < max_pdp; i++) { 355 + dma_addr_t temp; 356 + temp = pci_map_page(ppgtt->base.dev->pdev, 357 + &ppgtt->pd_pages[i], 0, 358 + PAGE_SIZE, PCI_DMA_BIDIRECTIONAL); 359 + if (pci_dma_mapping_error(ppgtt->base.dev->pdev, temp)) 360 + goto err_out; 361 + 362 + ppgtt->pd_dma_addr[i] = temp; 363 + 364 + ppgtt->gen8_pt_dma_addr[i] = kmalloc(sizeof(dma_addr_t) * GEN8_PDES_PER_PAGE, GFP_KERNEL); 365 + if (!ppgtt->gen8_pt_dma_addr[i]) 366 + goto err_out; 367 + 368 + for (j = 0; j < GEN8_PDES_PER_PAGE; j++) { 369 + struct page *p = &pt_pages[i * GEN8_PDES_PER_PAGE + j]; 370 + temp = pci_map_page(ppgtt->base.dev->pdev, 371 + p, 0, PAGE_SIZE, 372 + PCI_DMA_BIDIRECTIONAL); 373 + 374 + if (pci_dma_mapping_error(ppgtt->base.dev->pdev, temp)) 375 + goto err_out; 376 + 377 + ppgtt->gen8_pt_dma_addr[i][j] = temp; 378 + } 379 + } 380 + 381 + /* For now, the PPGTT helper functions all require that the PDEs are 382 + * plugged in correctly. So we do that now/here. For aliasing PPGTT, we 383 + * will never need to touch the PDEs again */ 384 + for (i = 0; i < max_pdp; i++) { 385 + gen8_ppgtt_pde_t *pd_vaddr; 386 + pd_vaddr = kmap_atomic(&ppgtt->pd_pages[i]); 387 + for (j = 0; j < GEN8_PDES_PER_PAGE; j++) { 388 + dma_addr_t addr = ppgtt->gen8_pt_dma_addr[i][j]; 389 + pd_vaddr[j] = gen8_pde_encode(ppgtt->base.dev, addr, 390 + I915_CACHE_LLC); 391 + } 392 + kunmap_atomic(pd_vaddr); 393 + } 394 + 395 + ppgtt->base.clear_range(&ppgtt->base, 0, 396 + ppgtt->num_pd_entries * GEN8_PTES_PER_PAGE, 397 + true); 398 + 399 + DRM_DEBUG_DRIVER("Allocated %d pages for page directories (%d wasted)\n", 400 + ppgtt->num_pd_pages, ppgtt->num_pd_pages - max_pdp); 401 + DRM_DEBUG_DRIVER("Allocated %d pages for page tables (%lld wasted)\n", 402 + ppgtt->num_pt_pages, 403 + (ppgtt->num_pt_pages - num_pt_pages) + 404 + size % (1<<30)); 405 + return 0; 406 + 407 + err_out: 408 + ppgtt->base.cleanup(&ppgtt->base); 409 + return ret; 196 410 } 197 411 198 412 static void gen6_write_pdes(struct i915_hw_ppgtt *ppgtt) ··· 698 410 699 411 if (INTEL_INFO(dev)->gen < 8) 700 412 ret = gen6_ppgtt_init(ppgtt); 413 + else if (IS_GEN8(dev)) 414 + ret = gen8_ppgtt_init(ppgtt, dev_priv->gtt.base.total); 701 415 else 702 416 BUG(); 703 417 ··· 863 573 return 0; 864 574 } 865 575 576 + static inline void gen8_set_pte(void __iomem *addr, gen8_gtt_pte_t pte) 577 + { 578 + #ifdef writeq 579 + writeq(pte, addr); 580 + #else 581 + iowrite32((u32)pte, addr); 582 + iowrite32(pte >> 32, addr + 4); 583 + #endif 584 + } 585 + 586 + static void gen8_ggtt_insert_entries(struct i915_address_space *vm, 587 + struct sg_table *st, 588 + unsigned int first_entry, 589 + enum i915_cache_level level) 590 + { 591 + struct drm_i915_private *dev_priv = vm->dev->dev_private; 592 + gen8_gtt_pte_t __iomem *gtt_entries = 593 + (gen8_gtt_pte_t __iomem *)dev_priv->gtt.gsm + first_entry; 594 + int i = 0; 595 + struct sg_page_iter sg_iter; 596 + dma_addr_t addr; 597 + 598 + for_each_sg_page(st->sgl, &sg_iter, st->nents, 0) { 599 + addr = sg_dma_address(sg_iter.sg) + 600 + (sg_iter.sg_pgoffset << PAGE_SHIFT); 601 + gen8_set_pte(&gtt_entries[i], 602 + gen8_pte_encode(addr, level, true)); 603 + i++; 604 + } 605 + 606 + /* 607 + * XXX: This serves as a posting read to make sure that the PTE has 608 + * actually been updated. There is some concern that even though 609 + * registers and PTEs are within the same BAR that they are potentially 610 + * of NUMA access patterns. Therefore, even with the way we assume 611 + * hardware should work, we must keep this posting read for paranoia. 612 + */ 613 + if (i != 0) 614 + WARN_ON(readq(&gtt_entries[i-1]) 615 + != gen8_pte_encode(addr, level, true)); 616 + 617 + #if 0 /* TODO: Still needed on GEN8? */ 618 + /* This next bit makes the above posting read even more important. We 619 + * want to flush the TLBs only after we're certain all the PTE updates 620 + * have finished. 621 + */ 622 + I915_WRITE(GFX_FLSH_CNTL_GEN6, GFX_FLSH_CNTL_EN); 623 + POSTING_READ(GFX_FLSH_CNTL_GEN6); 624 + #endif 625 + } 626 + 866 627 /* 867 628 * Binds an object into the global gtt with the specified cache level. The object 868 629 * will be accessible to the GPU via commands whose operands reference offsets ··· 956 615 POSTING_READ(GFX_FLSH_CNTL_GEN6); 957 616 } 958 617 618 + static void gen8_ggtt_clear_range(struct i915_address_space *vm, 619 + unsigned int first_entry, 620 + unsigned int num_entries, 621 + bool use_scratch) 622 + { 623 + struct drm_i915_private *dev_priv = vm->dev->dev_private; 624 + gen8_gtt_pte_t scratch_pte, __iomem *gtt_base = 625 + (gen8_gtt_pte_t __iomem *) dev_priv->gtt.gsm + first_entry; 626 + const int max_entries = gtt_total_entries(dev_priv->gtt) - first_entry; 627 + int i; 628 + 629 + if (WARN(num_entries > max_entries, 630 + "First entry = %d; Num entries = %d (max=%d)\n", 631 + first_entry, num_entries, max_entries)) 632 + num_entries = max_entries; 633 + 634 + scratch_pte = gen8_pte_encode(vm->scratch.addr, 635 + I915_CACHE_LLC, 636 + use_scratch); 637 + for (i = 0; i < num_entries; i++) 638 + gen8_set_pte(&gtt_base[i], scratch_pte); 639 + readl(gtt_base); 640 + } 641 + 959 642 static void gen6_ggtt_clear_range(struct i915_address_space *vm, 960 643 unsigned int first_entry, 961 644 unsigned int num_entries, ··· 1002 637 iowrite32(scratch_pte, &gtt_base[i]); 1003 638 readl(gtt_base); 1004 639 } 1005 - 1006 640 1007 641 static void i915_ggtt_insert_entries(struct i915_address_space *vm, 1008 642 struct sg_table *st, ··· 1084 720 *end -= 4096; 1085 721 } 1086 722 } 723 + 1087 724 void i915_gem_setup_global_gtt(struct drm_device *dev, 1088 725 unsigned long start, 1089 726 unsigned long mappable_end, ··· 1182 817 1183 818 DRM_ERROR("Aliased PPGTT setup failed %d\n", ret); 1184 819 drm_mm_takedown(&dev_priv->gtt.base.mm); 1185 - gtt_size += GEN6_PPGTT_PD_ENTRIES * PAGE_SIZE; 820 + if (INTEL_INFO(dev)->gen < 8) 821 + gtt_size += GEN6_PPGTT_PD_ENTRIES*PAGE_SIZE; 1186 822 } 1187 823 i915_gem_setup_global_gtt(dev, 0, mappable_size, gtt_size); 1188 824 } ··· 1233 867 return snb_gmch_ctl << 20; 1234 868 } 1235 869 870 + static inline unsigned int gen8_get_total_gtt_size(u16 bdw_gmch_ctl) 871 + { 872 + bdw_gmch_ctl >>= BDW_GMCH_GGMS_SHIFT; 873 + bdw_gmch_ctl &= BDW_GMCH_GGMS_MASK; 874 + if (bdw_gmch_ctl) 875 + bdw_gmch_ctl = 1 << bdw_gmch_ctl; 876 + return bdw_gmch_ctl << 20; 877 + } 878 + 1236 879 static inline size_t gen6_get_stolen_size(u16 snb_gmch_ctl) 1237 880 { 1238 881 snb_gmch_ctl >>= SNB_GMCH_GMS_SHIFT; 1239 882 snb_gmch_ctl &= SNB_GMCH_GMS_MASK; 1240 883 return snb_gmch_ctl << 25; /* 32 MB units */ 884 + } 885 + 886 + static inline size_t gen8_get_stolen_size(u16 bdw_gmch_ctl) 887 + { 888 + bdw_gmch_ctl >>= BDW_GMCH_GMS_SHIFT; 889 + bdw_gmch_ctl &= BDW_GMCH_GMS_MASK; 890 + return bdw_gmch_ctl << 25; /* 32 MB units */ 891 + } 892 + 893 + static int ggtt_probe_common(struct drm_device *dev, 894 + size_t gtt_size) 895 + { 896 + struct drm_i915_private *dev_priv = dev->dev_private; 897 + phys_addr_t gtt_bus_addr; 898 + int ret; 899 + 900 + /* For Modern GENs the PTEs and register space are split in the BAR */ 901 + gtt_bus_addr = pci_resource_start(dev->pdev, 0) + 902 + (pci_resource_len(dev->pdev, 0) / 2); 903 + 904 + dev_priv->gtt.gsm = ioremap_wc(gtt_bus_addr, gtt_size); 905 + if (!dev_priv->gtt.gsm) { 906 + DRM_ERROR("Failed to map the gtt page table\n"); 907 + return -ENOMEM; 908 + } 909 + 910 + ret = setup_scratch_page(dev); 911 + if (ret) { 912 + DRM_ERROR("Scratch setup failed\n"); 913 + /* iounmap will also get called at remove, but meh */ 914 + iounmap(dev_priv->gtt.gsm); 915 + } 916 + 917 + return ret; 918 + } 919 + 920 + /* The GGTT and PPGTT need a private PPAT setup in order to handle cacheability 921 + * bits. When using advanced contexts each context stores its own PAT, but 922 + * writing this data shouldn't be harmful even in those cases. */ 923 + static void gen8_setup_private_ppat(struct drm_i915_private *dev_priv) 924 + { 925 + #define GEN8_PPAT_UC (0<<0) 926 + #define GEN8_PPAT_WC (1<<0) 927 + #define GEN8_PPAT_WT (2<<0) 928 + #define GEN8_PPAT_WB (3<<0) 929 + #define GEN8_PPAT_ELLC_OVERRIDE (0<<2) 930 + /* FIXME(BDW): Bspec is completely confused about cache control bits. */ 931 + #define GEN8_PPAT_LLC (1<<2) 932 + #define GEN8_PPAT_LLCELLC (2<<2) 933 + #define GEN8_PPAT_LLCeLLC (3<<2) 934 + #define GEN8_PPAT_AGE(x) (x<<4) 935 + #define GEN8_PPAT(i, x) ((uint64_t) (x) << ((i) * 8)) 936 + uint64_t pat; 937 + 938 + pat = GEN8_PPAT(0, GEN8_PPAT_WB | GEN8_PPAT_LLC) | /* for normal objects, no eLLC */ 939 + GEN8_PPAT(1, GEN8_PPAT_WC | GEN8_PPAT_LLCELLC) | /* for something pointing to ptes? */ 940 + GEN8_PPAT(2, GEN8_PPAT_WT | GEN8_PPAT_LLCELLC) | /* for scanout with eLLC */ 941 + GEN8_PPAT(3, GEN8_PPAT_UC) | /* Uncached objects, mostly for scanout */ 942 + GEN8_PPAT(4, GEN8_PPAT_WB | GEN8_PPAT_LLCELLC | GEN8_PPAT_AGE(0)) | 943 + GEN8_PPAT(5, GEN8_PPAT_WB | GEN8_PPAT_LLCELLC | GEN8_PPAT_AGE(1)) | 944 + GEN8_PPAT(6, GEN8_PPAT_WB | GEN8_PPAT_LLCELLC | GEN8_PPAT_AGE(2)) | 945 + GEN8_PPAT(7, GEN8_PPAT_WB | GEN8_PPAT_LLCELLC | GEN8_PPAT_AGE(3)); 946 + 947 + /* XXX: spec defines this as 2 distinct registers. It's unclear if a 64b 948 + * write would work. */ 949 + I915_WRITE(GEN8_PRIVATE_PAT, pat); 950 + I915_WRITE(GEN8_PRIVATE_PAT + 4, pat >> 32); 951 + } 952 + 953 + static int gen8_gmch_probe(struct drm_device *dev, 954 + size_t *gtt_total, 955 + size_t *stolen, 956 + phys_addr_t *mappable_base, 957 + unsigned long *mappable_end) 958 + { 959 + struct drm_i915_private *dev_priv = dev->dev_private; 960 + unsigned int gtt_size; 961 + u16 snb_gmch_ctl; 962 + int ret; 963 + 964 + /* TODO: We're not aware of mappable constraints on gen8 yet */ 965 + *mappable_base = pci_resource_start(dev->pdev, 2); 966 + *mappable_end = pci_resource_len(dev->pdev, 2); 967 + 968 + if (!pci_set_dma_mask(dev->pdev, DMA_BIT_MASK(39))) 969 + pci_set_consistent_dma_mask(dev->pdev, DMA_BIT_MASK(39)); 970 + 971 + pci_read_config_word(dev->pdev, SNB_GMCH_CTRL, &snb_gmch_ctl); 972 + 973 + *stolen = gen8_get_stolen_size(snb_gmch_ctl); 974 + 975 + gtt_size = gen8_get_total_gtt_size(snb_gmch_ctl); 976 + *gtt_total = (gtt_size / sizeof(gen8_gtt_pte_t)) << PAGE_SHIFT; 977 + 978 + gen8_setup_private_ppat(dev_priv); 979 + 980 + ret = ggtt_probe_common(dev, gtt_size); 981 + 982 + dev_priv->gtt.base.clear_range = gen8_ggtt_clear_range; 983 + dev_priv->gtt.base.insert_entries = gen8_ggtt_insert_entries; 984 + 985 + return ret; 1241 986 } 1242 987 1243 988 static int gen6_gmch_probe(struct drm_device *dev, ··· 1358 881 unsigned long *mappable_end) 1359 882 { 1360 883 struct drm_i915_private *dev_priv = dev->dev_private; 1361 - phys_addr_t gtt_bus_addr; 1362 884 unsigned int gtt_size; 1363 885 u16 snb_gmch_ctl; 1364 886 int ret; ··· 1377 901 if (!pci_set_dma_mask(dev->pdev, DMA_BIT_MASK(40))) 1378 902 pci_set_consistent_dma_mask(dev->pdev, DMA_BIT_MASK(40)); 1379 903 pci_read_config_word(dev->pdev, SNB_GMCH_CTRL, &snb_gmch_ctl); 1380 - gtt_size = gen6_get_total_gtt_size(snb_gmch_ctl); 1381 904 1382 905 *stolen = gen6_get_stolen_size(snb_gmch_ctl); 906 + 907 + gtt_size = gen6_get_total_gtt_size(snb_gmch_ctl); 1383 908 *gtt_total = (gtt_size / sizeof(gen6_gtt_pte_t)) << PAGE_SHIFT; 1384 909 1385 - /* For Modern GENs the PTEs and register space are split in the BAR */ 1386 - gtt_bus_addr = pci_resource_start(dev->pdev, 0) + 1387 - (pci_resource_len(dev->pdev, 0) / 2); 1388 - 1389 - dev_priv->gtt.gsm = ioremap_wc(gtt_bus_addr, gtt_size); 1390 - if (!dev_priv->gtt.gsm) { 1391 - DRM_ERROR("Failed to map the gtt page table\n"); 1392 - return -ENOMEM; 1393 - } 1394 - 1395 - ret = setup_scratch_page(dev); 1396 - if (ret) 1397 - DRM_ERROR("Scratch setup failed\n"); 910 + ret = ggtt_probe_common(dev, gtt_size); 1398 911 1399 912 dev_priv->gtt.base.clear_range = gen6_ggtt_clear_range; 1400 913 dev_priv->gtt.base.insert_entries = gen6_ggtt_insert_entries; ··· 1437 972 if (INTEL_INFO(dev)->gen <= 5) { 1438 973 gtt->gtt_probe = i915_gmch_probe; 1439 974 gtt->base.cleanup = i915_gmch_remove; 1440 - } else { 975 + } else if (INTEL_INFO(dev)->gen < 8) { 1441 976 gtt->gtt_probe = gen6_gmch_probe; 1442 977 gtt->base.cleanup = gen6_gmch_remove; 1443 978 if (IS_HASWELL(dev) && dev_priv->ellc_size) ··· 1450 985 gtt->base.pte_encode = ivb_pte_encode; 1451 986 else 1452 987 gtt->base.pte_encode = snb_pte_encode; 988 + } else { 989 + dev_priv->gtt.gtt_probe = gen8_gmch_probe; 990 + dev_priv->gtt.base.cleanup = gen6_gmch_remove; 1453 991 } 1454 992 1455 993 ret = gtt->gtt_probe(dev, &gtt->base.total, &gtt->stolen_size,
+2
drivers/gpu/drm/i915/i915_gpu_error.c
··· 624 624 625 625 /* Fences */ 626 626 switch (INTEL_INFO(dev)->gen) { 627 + case 8: 627 628 case 7: 628 629 case 6: 629 630 for (i = 0; i < dev_priv->num_fence_regs; i++) ··· 1045 1044 default: 1046 1045 WARN_ONCE(1, "Unsupported platform\n"); 1047 1046 case 7: 1047 + case 8: 1048 1048 instdone[0] = I915_READ(GEN7_INSTDONE_1); 1049 1049 instdone[1] = I915_READ(GEN7_SC_INSTDONE); 1050 1050 instdone[2] = I915_READ(GEN7_SAMPLER_INSTDONE);
+375
drivers/gpu/drm/i915/i915_irq.c
··· 270 270 } 271 271 } 272 272 273 + static void broadwell_set_fifo_underrun_reporting(struct drm_device *dev, 274 + enum pipe pipe, bool enable) 275 + { 276 + struct drm_i915_private *dev_priv = dev->dev_private; 277 + 278 + assert_spin_locked(&dev_priv->irq_lock); 279 + 280 + if (enable) 281 + dev_priv->de_irq_mask[pipe] &= ~GEN8_PIPE_FIFO_UNDERRUN; 282 + else 283 + dev_priv->de_irq_mask[pipe] |= GEN8_PIPE_FIFO_UNDERRUN; 284 + I915_WRITE(GEN8_DE_PIPE_IMR(pipe), dev_priv->de_irq_mask[pipe]); 285 + POSTING_READ(GEN8_DE_PIPE_IMR(pipe)); 286 + } 287 + 273 288 /** 274 289 * ibx_display_interrupt_update - update SDEIMR 275 290 * @dev_priv: driver private ··· 397 382 ironlake_set_fifo_underrun_reporting(dev, pipe, enable); 398 383 else if (IS_GEN7(dev)) 399 384 ivybridge_set_fifo_underrun_reporting(dev, pipe, enable); 385 + else if (IS_GEN8(dev)) 386 + broadwell_set_fifo_underrun_reporting(dev, pipe, enable); 400 387 401 388 done: 402 389 spin_unlock_irqrestore(&dev_priv->irq_lock, flags); ··· 1168 1151 ivybridge_parity_error_irq_handler(dev, gt_iir); 1169 1152 } 1170 1153 1154 + static irqreturn_t gen8_gt_irq_handler(struct drm_device *dev, 1155 + struct drm_i915_private *dev_priv, 1156 + u32 master_ctl) 1157 + { 1158 + u32 rcs, bcs, vcs; 1159 + uint32_t tmp = 0; 1160 + irqreturn_t ret = IRQ_NONE; 1161 + 1162 + if (master_ctl & (GEN8_GT_RCS_IRQ | GEN8_GT_BCS_IRQ)) { 1163 + tmp = I915_READ(GEN8_GT_IIR(0)); 1164 + if (tmp) { 1165 + ret = IRQ_HANDLED; 1166 + rcs = tmp >> GEN8_RCS_IRQ_SHIFT; 1167 + bcs = tmp >> GEN8_BCS_IRQ_SHIFT; 1168 + if (rcs & GT_RENDER_USER_INTERRUPT) 1169 + notify_ring(dev, &dev_priv->ring[RCS]); 1170 + if (bcs & GT_RENDER_USER_INTERRUPT) 1171 + notify_ring(dev, &dev_priv->ring[BCS]); 1172 + I915_WRITE(GEN8_GT_IIR(0), tmp); 1173 + } else 1174 + DRM_ERROR("The master control interrupt lied (GT0)!\n"); 1175 + } 1176 + 1177 + if (master_ctl & GEN8_GT_VCS1_IRQ) { 1178 + tmp = I915_READ(GEN8_GT_IIR(1)); 1179 + if (tmp) { 1180 + ret = IRQ_HANDLED; 1181 + vcs = tmp >> GEN8_VCS1_IRQ_SHIFT; 1182 + if (vcs & GT_RENDER_USER_INTERRUPT) 1183 + notify_ring(dev, &dev_priv->ring[VCS]); 1184 + I915_WRITE(GEN8_GT_IIR(1), tmp); 1185 + } else 1186 + DRM_ERROR("The master control interrupt lied (GT1)!\n"); 1187 + } 1188 + 1189 + if (master_ctl & GEN8_GT_VECS_IRQ) { 1190 + tmp = I915_READ(GEN8_GT_IIR(3)); 1191 + if (tmp) { 1192 + ret = IRQ_HANDLED; 1193 + vcs = tmp >> GEN8_VECS_IRQ_SHIFT; 1194 + if (vcs & GT_RENDER_USER_INTERRUPT) 1195 + notify_ring(dev, &dev_priv->ring[VECS]); 1196 + I915_WRITE(GEN8_GT_IIR(3), tmp); 1197 + } else 1198 + DRM_ERROR("The master control interrupt lied (GT3)!\n"); 1199 + } 1200 + 1201 + return ret; 1202 + } 1203 + 1171 1204 #define HPD_STORM_DETECT_PERIOD 1000 1172 1205 #define HPD_STORM_THRESHOLD 5 1173 1206 ··· 1791 1724 return ret; 1792 1725 } 1793 1726 1727 + static irqreturn_t gen8_irq_handler(int irq, void *arg) 1728 + { 1729 + struct drm_device *dev = arg; 1730 + struct drm_i915_private *dev_priv = dev->dev_private; 1731 + u32 master_ctl; 1732 + irqreturn_t ret = IRQ_NONE; 1733 + uint32_t tmp = 0; 1734 + enum pipe pipe; 1735 + 1736 + atomic_inc(&dev_priv->irq_received); 1737 + 1738 + master_ctl = I915_READ(GEN8_MASTER_IRQ); 1739 + master_ctl &= ~GEN8_MASTER_IRQ_CONTROL; 1740 + if (!master_ctl) 1741 + return IRQ_NONE; 1742 + 1743 + I915_WRITE(GEN8_MASTER_IRQ, 0); 1744 + POSTING_READ(GEN8_MASTER_IRQ); 1745 + 1746 + ret = gen8_gt_irq_handler(dev, dev_priv, master_ctl); 1747 + 1748 + if (master_ctl & GEN8_DE_MISC_IRQ) { 1749 + tmp = I915_READ(GEN8_DE_MISC_IIR); 1750 + if (tmp & GEN8_DE_MISC_GSE) 1751 + intel_opregion_asle_intr(dev); 1752 + else if (tmp) 1753 + DRM_ERROR("Unexpected DE Misc interrupt\n"); 1754 + else 1755 + DRM_ERROR("The master control interrupt lied (DE MISC)!\n"); 1756 + 1757 + if (tmp) { 1758 + I915_WRITE(GEN8_DE_MISC_IIR, tmp); 1759 + ret = IRQ_HANDLED; 1760 + } 1761 + } 1762 + 1763 + if (master_ctl & GEN8_DE_PORT_IRQ) { 1764 + tmp = I915_READ(GEN8_DE_PORT_IIR); 1765 + if (tmp & GEN8_AUX_CHANNEL_A) 1766 + dp_aux_irq_handler(dev); 1767 + else if (tmp) 1768 + DRM_ERROR("Unexpected DE Port interrupt\n"); 1769 + else 1770 + DRM_ERROR("The master control interrupt lied (DE PORT)!\n"); 1771 + 1772 + if (tmp) { 1773 + I915_WRITE(GEN8_DE_PORT_IIR, tmp); 1774 + ret = IRQ_HANDLED; 1775 + } 1776 + } 1777 + 1778 + for_each_pipe(pipe) { 1779 + uint32_t pipe_iir; 1780 + 1781 + if (!(master_ctl & GEN8_DE_PIPE_IRQ(pipe))) 1782 + continue; 1783 + 1784 + pipe_iir = I915_READ(GEN8_DE_PIPE_IIR(pipe)); 1785 + if (pipe_iir & GEN8_PIPE_VBLANK) 1786 + drm_handle_vblank(dev, pipe); 1787 + 1788 + if (pipe_iir & GEN8_PIPE_FLIP_DONE) { 1789 + intel_prepare_page_flip(dev, pipe); 1790 + intel_finish_page_flip_plane(dev, pipe); 1791 + } 1792 + 1793 + if (pipe_iir & GEN8_PIPE_CDCLK_CRC_DONE) 1794 + hsw_pipe_crc_irq_handler(dev, pipe); 1795 + 1796 + if (pipe_iir & GEN8_PIPE_FIFO_UNDERRUN) { 1797 + if (intel_set_cpu_fifo_underrun_reporting(dev, pipe, 1798 + false)) 1799 + DRM_DEBUG_DRIVER("Pipe %c FIFO underrun\n", 1800 + pipe_name(pipe)); 1801 + } 1802 + 1803 + if (pipe_iir & GEN8_DE_PIPE_IRQ_FAULT_ERRORS) { 1804 + DRM_ERROR("Fault errors on pipe %c\n: 0x%08x", 1805 + pipe_name(pipe), 1806 + pipe_iir & GEN8_DE_PIPE_IRQ_FAULT_ERRORS); 1807 + } 1808 + 1809 + if (pipe_iir) { 1810 + ret = IRQ_HANDLED; 1811 + I915_WRITE(GEN8_DE_PIPE_IIR(pipe), pipe_iir); 1812 + } else 1813 + DRM_ERROR("The master control interrupt lied (DE PIPE)!\n"); 1814 + } 1815 + 1816 + if (!HAS_PCH_NOP(dev) && master_ctl & GEN8_DE_PCH_IRQ) { 1817 + /* 1818 + * FIXME(BDW): Assume for now that the new interrupt handling 1819 + * scheme also closed the SDE interrupt handling race we've seen 1820 + * on older pch-split platforms. But this needs testing. 1821 + */ 1822 + u32 pch_iir = I915_READ(SDEIIR); 1823 + 1824 + cpt_irq_handler(dev, pch_iir); 1825 + 1826 + if (pch_iir) { 1827 + I915_WRITE(SDEIIR, pch_iir); 1828 + ret = IRQ_HANDLED; 1829 + } 1830 + } 1831 + 1832 + I915_WRITE(GEN8_MASTER_IRQ, GEN8_MASTER_IRQ_CONTROL); 1833 + POSTING_READ(GEN8_MASTER_IRQ); 1834 + 1835 + return ret; 1836 + } 1837 + 1794 1838 static void i915_error_wake_up(struct drm_i915_private *dev_priv, 1795 1839 bool reset_completed) 1796 1840 { ··· 2255 2077 return 0; 2256 2078 } 2257 2079 2080 + static int gen8_enable_vblank(struct drm_device *dev, int pipe) 2081 + { 2082 + struct drm_i915_private *dev_priv = dev->dev_private; 2083 + unsigned long irqflags; 2084 + 2085 + if (!i915_pipe_enabled(dev, pipe)) 2086 + return -EINVAL; 2087 + 2088 + spin_lock_irqsave(&dev_priv->irq_lock, irqflags); 2089 + dev_priv->de_irq_mask[pipe] &= ~GEN8_PIPE_VBLANK; 2090 + I915_WRITE(GEN8_DE_PIPE_IMR(pipe), dev_priv->de_irq_mask[pipe]); 2091 + POSTING_READ(GEN8_DE_PIPE_IMR(pipe)); 2092 + spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); 2093 + return 0; 2094 + } 2095 + 2258 2096 /* Called from drm generic code, passed 'crtc' which 2259 2097 * we use as a pipe index 2260 2098 */ ··· 2316 2122 else 2317 2123 imr |= I915_DISPLAY_PIPE_B_VBLANK_INTERRUPT; 2318 2124 I915_WRITE(VLV_IMR, imr); 2125 + spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); 2126 + } 2127 + 2128 + static void gen8_disable_vblank(struct drm_device *dev, int pipe) 2129 + { 2130 + struct drm_i915_private *dev_priv = dev->dev_private; 2131 + unsigned long irqflags; 2132 + 2133 + if (!i915_pipe_enabled(dev, pipe)) 2134 + return; 2135 + 2136 + spin_lock_irqsave(&dev_priv->irq_lock, irqflags); 2137 + dev_priv->de_irq_mask[pipe] |= GEN8_PIPE_VBLANK; 2138 + I915_WRITE(GEN8_DE_PIPE_IMR(pipe), dev_priv->de_irq_mask[pipe]); 2139 + POSTING_READ(GEN8_DE_PIPE_IMR(pipe)); 2319 2140 spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); 2320 2141 } 2321 2142 ··· 2668 2459 POSTING_READ(VLV_IER); 2669 2460 } 2670 2461 2462 + static void gen8_irq_preinstall(struct drm_device *dev) 2463 + { 2464 + struct drm_i915_private *dev_priv = dev->dev_private; 2465 + int pipe; 2466 + 2467 + atomic_set(&dev_priv->irq_received, 0); 2468 + 2469 + I915_WRITE(GEN8_MASTER_IRQ, 0); 2470 + POSTING_READ(GEN8_MASTER_IRQ); 2471 + 2472 + /* IIR can theoretically queue up two events. Be paranoid */ 2473 + #define GEN8_IRQ_INIT_NDX(type, which) do { \ 2474 + I915_WRITE(GEN8_##type##_IMR(which), 0xffffffff); \ 2475 + POSTING_READ(GEN8_##type##_IMR(which)); \ 2476 + I915_WRITE(GEN8_##type##_IER(which), 0); \ 2477 + I915_WRITE(GEN8_##type##_IIR(which), 0xffffffff); \ 2478 + POSTING_READ(GEN8_##type##_IIR(which)); \ 2479 + I915_WRITE(GEN8_##type##_IIR(which), 0xffffffff); \ 2480 + } while (0) 2481 + 2482 + #define GEN8_IRQ_INIT(type) do { \ 2483 + I915_WRITE(GEN8_##type##_IMR, 0xffffffff); \ 2484 + POSTING_READ(GEN8_##type##_IMR); \ 2485 + I915_WRITE(GEN8_##type##_IER, 0); \ 2486 + I915_WRITE(GEN8_##type##_IIR, 0xffffffff); \ 2487 + POSTING_READ(GEN8_##type##_IIR); \ 2488 + I915_WRITE(GEN8_##type##_IIR, 0xffffffff); \ 2489 + } while (0) 2490 + 2491 + GEN8_IRQ_INIT_NDX(GT, 0); 2492 + GEN8_IRQ_INIT_NDX(GT, 1); 2493 + GEN8_IRQ_INIT_NDX(GT, 2); 2494 + GEN8_IRQ_INIT_NDX(GT, 3); 2495 + 2496 + for_each_pipe(pipe) { 2497 + GEN8_IRQ_INIT_NDX(DE_PIPE, pipe); 2498 + } 2499 + 2500 + GEN8_IRQ_INIT(DE_PORT); 2501 + GEN8_IRQ_INIT(DE_MISC); 2502 + GEN8_IRQ_INIT(PCU); 2503 + #undef GEN8_IRQ_INIT 2504 + #undef GEN8_IRQ_INIT_NDX 2505 + 2506 + POSTING_READ(GEN8_PCU_IIR); 2507 + } 2508 + 2671 2509 static void ibx_hpd_irq_setup(struct drm_device *dev) 2672 2510 { 2673 2511 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; ··· 2918 2662 I915_WRITE(VLV_MASTER_IER, MASTER_INTERRUPT_ENABLE); 2919 2663 2920 2664 return 0; 2665 + } 2666 + 2667 + static void gen8_gt_irq_postinstall(struct drm_i915_private *dev_priv) 2668 + { 2669 + int i; 2670 + 2671 + /* These are interrupts we'll toggle with the ring mask register */ 2672 + uint32_t gt_interrupts[] = { 2673 + GT_RENDER_USER_INTERRUPT << GEN8_RCS_IRQ_SHIFT | 2674 + GT_RENDER_L3_PARITY_ERROR_INTERRUPT | 2675 + GT_RENDER_USER_INTERRUPT << GEN8_BCS_IRQ_SHIFT, 2676 + GT_RENDER_USER_INTERRUPT << GEN8_VCS1_IRQ_SHIFT | 2677 + GT_RENDER_USER_INTERRUPT << GEN8_VCS2_IRQ_SHIFT, 2678 + 0, 2679 + GT_RENDER_USER_INTERRUPT << GEN8_VECS_IRQ_SHIFT 2680 + }; 2681 + 2682 + for (i = 0; i < ARRAY_SIZE(gt_interrupts); i++) { 2683 + u32 tmp = I915_READ(GEN8_GT_IIR(i)); 2684 + if (tmp) 2685 + DRM_ERROR("Interrupt (%d) should have been masked in pre-install 0x%08x\n", 2686 + i, tmp); 2687 + I915_WRITE(GEN8_GT_IMR(i), ~gt_interrupts[i]); 2688 + I915_WRITE(GEN8_GT_IER(i), gt_interrupts[i]); 2689 + } 2690 + POSTING_READ(GEN8_GT_IER(0)); 2691 + } 2692 + 2693 + static void gen8_de_irq_postinstall(struct drm_i915_private *dev_priv) 2694 + { 2695 + struct drm_device *dev = dev_priv->dev; 2696 + uint32_t de_pipe_masked = GEN8_PIPE_FLIP_DONE | 2697 + GEN8_PIPE_CDCLK_CRC_DONE | 2698 + GEN8_PIPE_FIFO_UNDERRUN | 2699 + GEN8_DE_PIPE_IRQ_FAULT_ERRORS; 2700 + uint32_t de_pipe_enables = de_pipe_masked | GEN8_PIPE_VBLANK; 2701 + int pipe; 2702 + dev_priv->de_irq_mask[PIPE_A] = ~de_pipe_masked; 2703 + dev_priv->de_irq_mask[PIPE_B] = ~de_pipe_masked; 2704 + dev_priv->de_irq_mask[PIPE_C] = ~de_pipe_masked; 2705 + 2706 + for_each_pipe(pipe) { 2707 + u32 tmp = I915_READ(GEN8_DE_PIPE_IIR(pipe)); 2708 + if (tmp) 2709 + DRM_ERROR("Interrupt (%d) should have been masked in pre-install 0x%08x\n", 2710 + pipe, tmp); 2711 + I915_WRITE(GEN8_DE_PIPE_IMR(pipe), dev_priv->de_irq_mask[pipe]); 2712 + I915_WRITE(GEN8_DE_PIPE_IER(pipe), de_pipe_enables); 2713 + } 2714 + POSTING_READ(GEN8_DE_PIPE_ISR(0)); 2715 + 2716 + I915_WRITE(GEN8_DE_PORT_IMR, ~GEN8_AUX_CHANNEL_A); 2717 + I915_WRITE(GEN8_DE_PORT_IER, GEN8_AUX_CHANNEL_A); 2718 + POSTING_READ(GEN8_DE_PORT_IER); 2719 + } 2720 + 2721 + static int gen8_irq_postinstall(struct drm_device *dev) 2722 + { 2723 + struct drm_i915_private *dev_priv = dev->dev_private; 2724 + 2725 + gen8_gt_irq_postinstall(dev_priv); 2726 + gen8_de_irq_postinstall(dev_priv); 2727 + 2728 + ibx_irq_postinstall(dev); 2729 + 2730 + I915_WRITE(GEN8_MASTER_IRQ, DE_MASTER_IRQ_CONTROL); 2731 + POSTING_READ(GEN8_MASTER_IRQ); 2732 + 2733 + return 0; 2734 + } 2735 + 2736 + static void gen8_irq_uninstall(struct drm_device *dev) 2737 + { 2738 + struct drm_i915_private *dev_priv = dev->dev_private; 2739 + int pipe; 2740 + 2741 + if (!dev_priv) 2742 + return; 2743 + 2744 + atomic_set(&dev_priv->irq_received, 0); 2745 + 2746 + I915_WRITE(GEN8_MASTER_IRQ, 0); 2747 + 2748 + #define GEN8_IRQ_FINI_NDX(type, which) do { \ 2749 + I915_WRITE(GEN8_##type##_IMR(which), 0xffffffff); \ 2750 + I915_WRITE(GEN8_##type##_IER(which), 0); \ 2751 + I915_WRITE(GEN8_##type##_IIR(which), 0xffffffff); \ 2752 + } while (0) 2753 + 2754 + #define GEN8_IRQ_FINI(type) do { \ 2755 + I915_WRITE(GEN8_##type##_IMR, 0xffffffff); \ 2756 + I915_WRITE(GEN8_##type##_IER, 0); \ 2757 + I915_WRITE(GEN8_##type##_IIR, 0xffffffff); \ 2758 + } while (0) 2759 + 2760 + GEN8_IRQ_FINI_NDX(GT, 0); 2761 + GEN8_IRQ_FINI_NDX(GT, 1); 2762 + GEN8_IRQ_FINI_NDX(GT, 2); 2763 + GEN8_IRQ_FINI_NDX(GT, 3); 2764 + 2765 + for_each_pipe(pipe) { 2766 + GEN8_IRQ_FINI_NDX(DE_PIPE, pipe); 2767 + } 2768 + 2769 + GEN8_IRQ_FINI(DE_PORT); 2770 + GEN8_IRQ_FINI(DE_MISC); 2771 + GEN8_IRQ_FINI(PCU); 2772 + #undef GEN8_IRQ_FINI 2773 + #undef GEN8_IRQ_FINI_NDX 2774 + 2775 + POSTING_READ(GEN8_PCU_IIR); 2921 2776 } 2922 2777 2923 2778 static void valleyview_irq_uninstall(struct drm_device *dev) ··· 3810 3443 dev->driver->enable_vblank = valleyview_enable_vblank; 3811 3444 dev->driver->disable_vblank = valleyview_disable_vblank; 3812 3445 dev_priv->display.hpd_irq_setup = i915_hpd_irq_setup; 3446 + } else if (IS_GEN8(dev)) { 3447 + dev->driver->irq_handler = gen8_irq_handler; 3448 + dev->driver->irq_preinstall = gen8_irq_preinstall; 3449 + dev->driver->irq_postinstall = gen8_irq_postinstall; 3450 + dev->driver->irq_uninstall = gen8_irq_uninstall; 3451 + dev->driver->enable_vblank = gen8_enable_vblank; 3452 + dev->driver->disable_vblank = gen8_disable_vblank; 3453 + dev_priv->display.hpd_irq_setup = ibx_hpd_irq_setup; 3813 3454 } else if (HAS_PCH_SPLIT(dev)) { 3814 3455 dev->driver->irq_handler = ironlake_irq_handler; 3815 3456 dev->driver->irq_preinstall = ironlake_irq_preinstall;
+121 -2
drivers/gpu/drm/i915/i915_reg.h
··· 110 110 #define RING_PP_DIR_DCLV(ring) ((ring)->mmio_base+0x220) 111 111 #define PP_DIR_DCLV_2G 0xffffffff 112 112 113 + #define GEN8_RING_PDP_UDW(ring, n) ((ring)->mmio_base+0x270 + ((n) * 8 + 4)) 114 + #define GEN8_RING_PDP_LDW(ring, n) ((ring)->mmio_base+0x270 + (n) * 8) 115 + 113 116 #define GAM_ECOCHK 0x4090 114 117 #define ECOCHK_SNB_BIT (1<<10) 115 118 #define HSW_ECOCHK_ARB_PRIO_SOL (1<<6) ··· 250 247 #define MI_BATCH_NON_SECURE_HSW (1<<13) 251 248 #define MI_BATCH_BUFFER_START MI_INSTR(0x31, 0) 252 249 #define MI_BATCH_GTT (2<<6) /* aliased with (1<<7) on gen4 */ 250 + #define MI_BATCH_BUFFER_START_GEN8 MI_INSTR(0x31, 1) 253 251 #define MI_SEMAPHORE_MBOX MI_INSTR(0x16, 1) /* gen6+ */ 254 252 #define MI_SEMAPHORE_GLOBAL_GTT (1<<22) 255 253 #define MI_SEMAPHORE_UPDATE (1<<21) ··· 659 655 #define ARB_MODE 0x04030 660 656 #define ARB_MODE_SWIZZLE_SNB (1<<4) 661 657 #define ARB_MODE_SWIZZLE_IVB (1<<5) 658 + #define GAMTARBMODE 0x04a08 659 + #define ARB_MODE_BWGTLB_DISABLE (1<<9) 660 + #define ARB_MODE_SWIZZLE_BDW (1<<1) 662 661 #define RENDER_HWS_PGA_GEN7 (0x04080) 663 662 #define RING_FAULT_REG(ring) (0x4094 + 0x100*(ring)->id) 664 663 #define RING_FAULT_GTTSEL_MASK (1<<11) ··· 669 662 #define RING_FAULT_FAULT_TYPE(x) ((x >> 1) & 0x3) 670 663 #define RING_FAULT_VALID (1<<0) 671 664 #define DONE_REG 0x40b0 665 + #define GEN8_PRIVATE_PAT 0x40e0 672 666 #define BSD_HWS_PGA_GEN7 (0x04180) 673 667 #define BLT_HWS_PGA_GEN7 (0x04280) 674 668 #define VEBOX_HWS_PGA_GEN7 (0x04380) ··· 749 741 #define FPGA_DBG_RM_NOCLAIM (1<<31) 750 742 751 743 #define DERRMR 0x44050 744 + /* Note that HBLANK events are reserved on bdw+ */ 752 745 #define DERRMR_PIPEA_SCANLINE (1<<0) 753 746 #define DERRMR_PIPEA_PRI_FLIP_DONE (1<<1) 754 747 #define DERRMR_PIPEA_SPR_FLIP_DONE (1<<2) ··· 783 774 #define _3D_CHICKEN3 0x02090 784 775 #define _3D_CHICKEN_SF_DISABLE_OBJEND_CULL (1 << 10) 785 776 #define _3D_CHICKEN3_SF_DISABLE_FASTCLIP_CULL (1 << 5) 777 + #define _3D_CHICKEN_SDE_LIMIT_FIFO_POLY_DEPTH(x) ((x)<<1) 786 778 787 779 #define MI_MODE 0x0209c 788 780 # define VS_TIMER_DISPATCH (1 << 6) ··· 1830 1820 * on HSW) - so the final size is 66944 bytes, which rounds to 17 pages. 1831 1821 */ 1832 1822 #define HSW_CXT_TOTAL_SIZE (17 * PAGE_SIZE) 1823 + /* Same as Haswell, but 72064 bytes now. */ 1824 + #define GEN8_CXT_TOTAL_SIZE (18 * PAGE_SIZE) 1825 + 1833 1826 1834 1827 #define VLV_CLK_CTL2 0x101104 1835 1828 #define CLK_CTL2_CZCOUNT_30NS_SHIFT 28 ··· 1963 1950 #define BCLRPAT(pipe) _PIPE(pipe, _BCLRPAT_A, _BCLRPAT_B) 1964 1951 #define VSYNCSHIFT(trans) _TRANSCODER(trans, _VSYNCSHIFT_A, _VSYNCSHIFT_B) 1965 1952 1966 - /* HSW eDP PSR registers */ 1967 - #define EDP_PSR_BASE(dev) 0x64800 1953 + /* HSW+ eDP PSR registers */ 1954 + #define EDP_PSR_BASE(dev) (IS_HASWELL(dev) ? 0x64800 : 0x6f800) 1968 1955 #define EDP_PSR_CTL(dev) (EDP_PSR_BASE(dev) + 0) 1969 1956 #define EDP_PSR_ENABLE (1<<31) 1970 1957 #define EDP_PSR_LINK_DISABLE (0<<27) ··· 3254 3241 #define PIPEFRAMEPIXEL(pipe) _PIPE(pipe, _PIPEAFRAMEPIXEL, _PIPEBFRAMEPIXEL) 3255 3242 #define PIPESTAT(pipe) _PIPE(pipe, _PIPEASTAT, _PIPEBSTAT) 3256 3243 3244 + #define _PIPE_MISC_A 0x70030 3245 + #define _PIPE_MISC_B 0x71030 3246 + #define PIPEMISC_DITHER_BPC_MASK (7<<5) 3247 + #define PIPEMISC_DITHER_8_BPC (0<<5) 3248 + #define PIPEMISC_DITHER_10_BPC (1<<5) 3249 + #define PIPEMISC_DITHER_6_BPC (2<<5) 3250 + #define PIPEMISC_DITHER_12_BPC (3<<5) 3251 + #define PIPEMISC_DITHER_ENABLE (1<<4) 3252 + #define PIPEMISC_DITHER_TYPE_MASK (3<<2) 3253 + #define PIPEMISC_DITHER_TYPE_SP (0<<2) 3254 + #define PIPEMISC(pipe) _PIPE(pipe, _PIPE_MISC_A, _PIPE_MISC_B) 3255 + 3257 3256 #define VLV_DPFLIPSTAT (VLV_DISPLAY_BASE + 0x70028) 3258 3257 #define PIPEB_LINE_COMPARE_INT_EN (1<<29) 3259 3258 #define PIPEB_HLINE_INT_EN (1<<28) ··· 3396 3371 #define WM1_LP_LATENCY_MASK (0x7f<<24) 3397 3372 #define WM1_LP_FBC_MASK (0xf<<20) 3398 3373 #define WM1_LP_FBC_SHIFT 20 3374 + #define WM1_LP_FBC_SHIFT_BDW 19 3399 3375 #define WM1_LP_SR_MASK (0x7ff<<8) 3400 3376 #define WM1_LP_SR_SHIFT 8 3401 3377 #define WM1_LP_CURSOR_MASK (0xff) ··· 4037 4011 #define GTIIR 0x44018 4038 4012 #define GTIER 0x4401c 4039 4013 4014 + #define GEN8_MASTER_IRQ 0x44200 4015 + #define GEN8_MASTER_IRQ_CONTROL (1<<31) 4016 + #define GEN8_PCU_IRQ (1<<30) 4017 + #define GEN8_DE_PCH_IRQ (1<<23) 4018 + #define GEN8_DE_MISC_IRQ (1<<22) 4019 + #define GEN8_DE_PORT_IRQ (1<<20) 4020 + #define GEN8_DE_PIPE_C_IRQ (1<<18) 4021 + #define GEN8_DE_PIPE_B_IRQ (1<<17) 4022 + #define GEN8_DE_PIPE_A_IRQ (1<<16) 4023 + #define GEN8_DE_PIPE_IRQ(pipe) (1<<(16+pipe)) 4024 + #define GEN8_GT_VECS_IRQ (1<<6) 4025 + #define GEN8_GT_VCS2_IRQ (1<<3) 4026 + #define GEN8_GT_VCS1_IRQ (1<<2) 4027 + #define GEN8_GT_BCS_IRQ (1<<1) 4028 + #define GEN8_GT_RCS_IRQ (1<<0) 4029 + 4030 + #define GEN8_GT_ISR(which) (0x44300 + (0x10 * (which))) 4031 + #define GEN8_GT_IMR(which) (0x44304 + (0x10 * (which))) 4032 + #define GEN8_GT_IIR(which) (0x44308 + (0x10 * (which))) 4033 + #define GEN8_GT_IER(which) (0x4430c + (0x10 * (which))) 4034 + 4035 + #define GEN8_BCS_IRQ_SHIFT 16 4036 + #define GEN8_RCS_IRQ_SHIFT 0 4037 + #define GEN8_VCS2_IRQ_SHIFT 16 4038 + #define GEN8_VCS1_IRQ_SHIFT 0 4039 + #define GEN8_VECS_IRQ_SHIFT 0 4040 + 4041 + #define GEN8_DE_PIPE_ISR(pipe) (0x44400 + (0x10 * (pipe))) 4042 + #define GEN8_DE_PIPE_IMR(pipe) (0x44404 + (0x10 * (pipe))) 4043 + #define GEN8_DE_PIPE_IIR(pipe) (0x44408 + (0x10 * (pipe))) 4044 + #define GEN8_DE_PIPE_IER(pipe) (0x4440c + (0x10 * (pipe))) 4045 + #define GEN8_PIPE_FIFO_UNDERRUN (1 << 31) 4046 + #define GEN8_PIPE_CDCLK_CRC_ERROR (1 << 29) 4047 + #define GEN8_PIPE_CDCLK_CRC_DONE (1 << 28) 4048 + #define GEN8_PIPE_CURSOR_FAULT (1 << 10) 4049 + #define GEN8_PIPE_SPRITE_FAULT (1 << 9) 4050 + #define GEN8_PIPE_PRIMARY_FAULT (1 << 8) 4051 + #define GEN8_PIPE_SPRITE_FLIP_DONE (1 << 5) 4052 + #define GEN8_PIPE_FLIP_DONE (1 << 4) 4053 + #define GEN8_PIPE_SCAN_LINE_EVENT (1 << 2) 4054 + #define GEN8_PIPE_VSYNC (1 << 1) 4055 + #define GEN8_PIPE_VBLANK (1 << 0) 4056 + #define GEN8_DE_PIPE_IRQ_FAULT_ERRORS \ 4057 + (GEN8_PIPE_CURSOR_FAULT | \ 4058 + GEN8_PIPE_SPRITE_FAULT | \ 4059 + GEN8_PIPE_PRIMARY_FAULT) 4060 + 4061 + #define GEN8_DE_PORT_ISR 0x44440 4062 + #define GEN8_DE_PORT_IMR 0x44444 4063 + #define GEN8_DE_PORT_IIR 0x44448 4064 + #define GEN8_DE_PORT_IER 0x4444c 4065 + #define GEN8_PORT_DP_A_HOTPLUG (1 << 3) 4066 + #define GEN8_AUX_CHANNEL_A (1 << 0) 4067 + 4068 + #define GEN8_DE_MISC_ISR 0x44460 4069 + #define GEN8_DE_MISC_IMR 0x44464 4070 + #define GEN8_DE_MISC_IIR 0x44468 4071 + #define GEN8_DE_MISC_IER 0x4446c 4072 + #define GEN8_DE_MISC_GSE (1 << 27) 4073 + 4074 + #define GEN8_PCU_ISR 0x444e0 4075 + #define GEN8_PCU_IMR 0x444e4 4076 + #define GEN8_PCU_IIR 0x444e8 4077 + #define GEN8_PCU_IER 0x444ec 4078 + 4040 4079 #define ILK_DISPLAY_CHICKEN2 0x42004 4041 4080 /* Required on all Ironlake and Sandybridge according to the B-Spec. */ 4042 4081 #define ILK_ELPIN_409_SELECT (1 << 25) ··· 4127 4036 # define CHICKEN3_DGMG_DONE_FIX_DISABLE (1 << 2) 4128 4037 4129 4038 #define CHICKEN_PAR1_1 0x42080 4039 + #define DPA_MASK_VBLANK_SRD (1 << 15) 4130 4040 #define FORCE_ARB_IDLE_PLANES (1 << 14) 4041 + 4042 + #define _CHICKEN_PIPESL_1_A 0x420b0 4043 + #define _CHICKEN_PIPESL_1_B 0x420b4 4044 + #define DPRS_MASK_VBLANK_SRD (1 << 0) 4045 + #define CHICKEN_PIPESL_1(pipe) _PIPE(pipe, _CHICKEN_PIPESL_1_A, _CHICKEN_PIPESL_1_B) 4131 4046 4132 4047 #define DISP_ARB_CTL 0x45000 4133 4048 #define DISP_TILE_SURFACE_SWIZZLING (1<<13) ··· 4145 4048 /* GEN7 chicken */ 4146 4049 #define GEN7_COMMON_SLICE_CHICKEN1 0x7010 4147 4050 # define GEN7_CSC1_RHWO_OPT_DISABLE_IN_RCC ((1<<10) | (1<<26)) 4051 + #define COMMON_SLICE_CHICKEN2 0x7014 4052 + # define GEN8_CSC2_SBE_VUE_CACHE_CONSERVATIVE (1<<0) 4148 4053 4149 4054 #define GEN7_L3CNTLREG1 0xB01C 4150 4055 #define GEN7_WA_FOR_GEN7_L3_CONTROL 0x3C4FFF8C ··· 4975 4876 #define GEN6_PCODE_WRITE_D_COMP 0x11 4976 4877 #define GEN6_ENCODE_RC6_VID(mv) (((mv) - 245) / 5) 4977 4878 #define GEN6_DECODE_RC6_VID(vids) (((vids) * 5) + 245) 4879 + #define DISPLAY_IPS_CONTROL 0x19 4978 4880 #define GEN6_PCODE_DATA 0x138128 4979 4881 #define GEN6_PCODE_FREQ_IA_RATIO_SHIFT 8 4980 4882 #define GEN6_PCODE_FREQ_RING_RATIO_SHIFT 16 ··· 5013 4913 #define GEN7_HALF_SLICE_CHICKEN1 0xe100 /* IVB GT1 + VLV */ 5014 4914 #define GEN7_HALF_SLICE_CHICKEN1_GT2 0xf100 5015 4915 #define GEN7_MAX_PS_THREAD_DEP (8<<12) 4916 + #define GEN7_SINGLE_SUBSCAN_DISPATCH_ENABLE (1<<10) 5016 4917 #define GEN7_PSD_SINGLE_PORT_DISPATCH_ENABLE (1<<3) 5017 4918 5018 4919 #define GEN7_ROW_CHICKEN2 0xe4f4 ··· 5022 4921 5023 4922 #define HSW_ROW_CHICKEN3 0xe49c 5024 4923 #define HSW_ROW_CHICKEN3_L3_GLOBAL_ATOMICS_DISABLE (1 << 6) 4924 + 4925 + #define HALF_SLICE_CHICKEN3 0xe184 4926 + #define GEN8_CENTROID_PIXEL_OPT_DIS (1<<8) 4927 + #define GEN8_SAMPLER_POWER_BYPASS_DIS (1<<1) 5025 4928 5026 4929 #define G4X_AUD_VID_DID (dev_priv->info->display_mmio_offset + 0x62020) 5027 4930 #define INTEL_AUDIO_DEVCL 0x808629FB ··· 5244 5139 #define DDI_BUF_CTL_B 0x64100 5245 5140 #define DDI_BUF_CTL(port) _PORT(port, DDI_BUF_CTL_A, DDI_BUF_CTL_B) 5246 5141 #define DDI_BUF_CTL_ENABLE (1<<31) 5142 + /* Haswell */ 5247 5143 #define DDI_BUF_EMP_400MV_0DB_HSW (0<<24) /* Sel0 */ 5248 5144 #define DDI_BUF_EMP_400MV_3_5DB_HSW (1<<24) /* Sel1 */ 5249 5145 #define DDI_BUF_EMP_400MV_6DB_HSW (2<<24) /* Sel2 */ ··· 5254 5148 #define DDI_BUF_EMP_600MV_6DB_HSW (6<<24) /* Sel6 */ 5255 5149 #define DDI_BUF_EMP_800MV_0DB_HSW (7<<24) /* Sel7 */ 5256 5150 #define DDI_BUF_EMP_800MV_3_5DB_HSW (8<<24) /* Sel8 */ 5151 + /* Broadwell */ 5152 + #define DDI_BUF_EMP_400MV_0DB_BDW (0<<24) /* Sel0 */ 5153 + #define DDI_BUF_EMP_400MV_3_5DB_BDW (1<<24) /* Sel1 */ 5154 + #define DDI_BUF_EMP_400MV_6DB_BDW (2<<24) /* Sel2 */ 5155 + #define DDI_BUF_EMP_600MV_0DB_BDW (3<<24) /* Sel3 */ 5156 + #define DDI_BUF_EMP_600MV_3_5DB_BDW (4<<24) /* Sel4 */ 5157 + #define DDI_BUF_EMP_600MV_6DB_BDW (5<<24) /* Sel5 */ 5158 + #define DDI_BUF_EMP_800MV_0DB_BDW (6<<24) /* Sel6 */ 5159 + #define DDI_BUF_EMP_800MV_3_5DB_BDW (7<<24) /* Sel7 */ 5160 + #define DDI_BUF_EMP_1200MV_0DB_BDW (8<<24) /* Sel8 */ 5257 5161 #define DDI_BUF_EMP_MASK (0xf<<24) 5258 5162 #define DDI_BUF_PORT_REVERSAL (1<<16) 5259 5163 #define DDI_BUF_IS_IDLE (1<<7) ··· 5373 5257 #define LCPLL_PLL_LOCK (1<<30) 5374 5258 #define LCPLL_CLK_FREQ_MASK (3<<26) 5375 5259 #define LCPLL_CLK_FREQ_450 (0<<26) 5260 + #define LCPLL_CLK_FREQ_54O_BDW (1<<26) 5261 + #define LCPLL_CLK_FREQ_337_5_BDW (2<<26) 5262 + #define LCPLL_CLK_FREQ_675_BDW (3<<26) 5376 5263 #define LCPLL_CD_CLOCK_DISABLE (1<<25) 5377 5264 #define LCPLL_CD2X_CLOCK_DISABLE (1<<23) 5378 5265 #define LCPLL_POWER_DOWN_ALLOW (1<<22)
+5 -6
drivers/gpu/drm/i915/intel_crt.c
··· 822 822 crt->base.mode_set = intel_crt_mode_set; 823 823 crt->base.disable = intel_disable_crt; 824 824 crt->base.enable = intel_enable_crt; 825 - if (IS_HASWELL(dev)) 826 - crt->base.get_config = hsw_crt_get_config; 827 - else 828 - crt->base.get_config = intel_crt_get_config; 829 825 if (I915_HAS_HOTPLUG(dev)) 830 826 crt->base.hpd_pin = HPD_CRT; 831 - if (HAS_DDI(dev)) 827 + if (HAS_DDI(dev)) { 828 + crt->base.get_config = hsw_crt_get_config; 832 829 crt->base.get_hw_state = intel_ddi_get_hw_state; 833 - else 830 + } else { 831 + crt->base.get_config = intel_crt_get_config; 834 832 crt->base.get_hw_state = intel_crt_get_hw_state; 833 + } 835 834 intel_connector->get_hw_state = intel_connector_get_hw_state; 836 835 837 836 drm_connector_helper_add(connector, &intel_crt_connector_helper_funcs);
+107 -17
drivers/gpu/drm/i915/intel_ddi.c
··· 72 72 0x80FFFFFF, 0x00030002, /* 11: 1000 1000 0 */ 73 73 }; 74 74 75 + static const u32 bdw_ddi_translations_edp[] = { 76 + 0x00FFFFFF, 0x00000012, /* DP parameters */ 77 + 0x00EBAFFF, 0x00020011, 78 + 0x00C71FFF, 0x0006000F, 79 + 0x00FFFFFF, 0x00020011, 80 + 0x00DB6FFF, 0x0005000F, 81 + 0x00BEEFFF, 0x000A000C, 82 + 0x00FFFFFF, 0x0005000F, 83 + 0x00DB6FFF, 0x000A000C, 84 + 0x00FFFFFF, 0x000A000C, 85 + 0x00FFFFFF, 0x00140006 /* HDMI parameters 800mV 0dB*/ 86 + }; 87 + 88 + static const u32 bdw_ddi_translations_dp[] = { 89 + 0x00FFFFFF, 0x0007000E, /* DP parameters */ 90 + 0x00D75FFF, 0x000E000A, 91 + 0x00BEFFFF, 0x00140006, 92 + 0x00FFFFFF, 0x000E000A, 93 + 0x00D75FFF, 0x00180004, 94 + 0x80CB2FFF, 0x001B0002, 95 + 0x00F7DFFF, 0x00180004, 96 + 0x80D75FFF, 0x001B0002, 97 + 0x80FFFFFF, 0x001B0002, 98 + 0x00FFFFFF, 0x00140006 /* HDMI parameters 800mV 0dB*/ 99 + }; 100 + 101 + static const u32 bdw_ddi_translations_fdi[] = { 102 + 0x00FFFFFF, 0x0001000E, /* FDI parameters */ 103 + 0x00D75FFF, 0x0004000A, 104 + 0x00C30FFF, 0x00070006, 105 + 0x00AAAFFF, 0x000C0000, 106 + 0x00FFFFFF, 0x0004000A, 107 + 0x00D75FFF, 0x00090004, 108 + 0x00C30FFF, 0x000C0000, 109 + 0x00FFFFFF, 0x00070006, 110 + 0x00D75FFF, 0x000C0000, 111 + 0x00FFFFFF, 0x00140006 /* HDMI parameters 800mV 0dB*/ 112 + }; 113 + 75 114 enum port intel_ddi_get_encoder_port(struct intel_encoder *intel_encoder) 76 115 { 77 116 struct drm_encoder *encoder = &intel_encoder->base; ··· 131 92 } 132 93 } 133 94 134 - /* On Haswell, DDI port buffers must be programmed with correct values 135 - * in advance. The buffer values are different for FDI and DP modes, 95 + /* 96 + * Starting with Haswell, DDI port buffers must be programmed with correct 97 + * values in advance. The buffer values are different for FDI and DP modes, 136 98 * but the HDMI/DVI fields are shared among those. So we program the DDI 137 99 * in either FDI or DP modes only, as HDMI connections will work with both 138 100 * of those ··· 143 103 struct drm_i915_private *dev_priv = dev->dev_private; 144 104 u32 reg; 145 105 int i; 146 - const u32 *ddi_translations = (port == PORT_E) ? 147 - hsw_ddi_translations_fdi : 148 - hsw_ddi_translations_dp; 149 106 int hdmi_level = dev_priv->vbt.ddi_port_info[port].hdmi_level_shift; 107 + const u32 *ddi_translations_fdi; 108 + const u32 *ddi_translations_dp; 109 + const u32 *ddi_translations_edp; 110 + const u32 *ddi_translations; 111 + 112 + if (IS_BROADWELL(dev)) { 113 + ddi_translations_fdi = bdw_ddi_translations_fdi; 114 + ddi_translations_dp = bdw_ddi_translations_dp; 115 + ddi_translations_edp = bdw_ddi_translations_edp; 116 + } else if (IS_HASWELL(dev)) { 117 + ddi_translations_fdi = hsw_ddi_translations_fdi; 118 + ddi_translations_dp = hsw_ddi_translations_dp; 119 + ddi_translations_edp = hsw_ddi_translations_dp; 120 + } else { 121 + WARN(1, "ddi translation table missing\n"); 122 + ddi_translations_edp = bdw_ddi_translations_dp; 123 + ddi_translations_fdi = bdw_ddi_translations_fdi; 124 + ddi_translations_dp = bdw_ddi_translations_dp; 125 + } 126 + 127 + switch (port) { 128 + case PORT_A: 129 + ddi_translations = ddi_translations_edp; 130 + break; 131 + case PORT_B: 132 + case PORT_C: 133 + ddi_translations = ddi_translations_dp; 134 + break; 135 + case PORT_D: 136 + if (intel_dpd_is_edp(dev)) 137 + ddi_translations = ddi_translations_edp; 138 + else 139 + ddi_translations = ddi_translations_dp; 140 + break; 141 + case PORT_E: 142 + ddi_translations = ddi_translations_fdi; 143 + break; 144 + default: 145 + BUG(); 146 + } 150 147 151 148 for (i = 0, reg = DDI_BUF_TRANS(port); 152 149 i < ARRAY_SIZE(hsw_ddi_translations_fdi); i++) { ··· 833 756 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 834 757 struct intel_encoder *intel_encoder = intel_ddi_get_crtc_encoder(crtc); 835 758 struct drm_encoder *encoder = &intel_encoder->base; 836 - struct drm_i915_private *dev_priv = crtc->dev->dev_private; 759 + struct drm_device *dev = crtc->dev; 760 + struct drm_i915_private *dev_priv = dev->dev_private; 837 761 enum pipe pipe = intel_crtc->pipe; 838 762 enum transcoder cpu_transcoder = intel_crtc->config.cpu_transcoder; 839 763 enum port port = intel_ddi_get_encoder_port(intel_encoder); ··· 870 792 if (cpu_transcoder == TRANSCODER_EDP) { 871 793 switch (pipe) { 872 794 case PIPE_A: 873 - /* Can only use the always-on power well for eDP when 874 - * not using the panel fitter, and when not using motion 875 - * blur mitigation (which we don't support). */ 876 - if (intel_crtc->config.pch_pfit.enabled) 795 + /* On Haswell, can only use the always-on power well for 796 + * eDP when not using the panel fitter, and when not 797 + * using motion blur mitigation (which we don't 798 + * support). */ 799 + if (IS_HASWELL(dev) && intel_crtc->config.pch_pfit.enabled) 877 800 temp |= TRANS_DDI_EDP_INPUT_A_ONOFF; 878 801 else 879 802 temp |= TRANS_DDI_EDP_INPUT_A_ON; ··· 1235 1156 1236 1157 int intel_ddi_get_cdclk_freq(struct drm_i915_private *dev_priv) 1237 1158 { 1159 + struct drm_device *dev = dev_priv->dev; 1238 1160 uint32_t lcpll = I915_READ(LCPLL_CTL); 1161 + uint32_t freq = lcpll & LCPLL_CLK_FREQ_MASK; 1239 1162 1240 - if (lcpll & LCPLL_CD_SOURCE_FCLK) 1163 + if (lcpll & LCPLL_CD_SOURCE_FCLK) { 1241 1164 return 800000; 1242 - else if (I915_READ(HSW_FUSE_STRAP) & HSW_CDCLK_LIMIT) 1165 + } else if (I915_READ(HSW_FUSE_STRAP) & HSW_CDCLK_LIMIT) { 1243 1166 return 450000; 1244 - else if ((lcpll & LCPLL_CLK_FREQ_MASK) == LCPLL_CLK_FREQ_450) 1167 + } else if (freq == LCPLL_CLK_FREQ_450) { 1245 1168 return 450000; 1246 - else if (IS_ULT(dev_priv->dev)) 1247 - return 337500; 1248 - else 1249 - return 540000; 1169 + } else if (IS_HASWELL(dev)) { 1170 + if (IS_ULT(dev)) 1171 + return 337500; 1172 + else 1173 + return 540000; 1174 + } else { 1175 + if (freq == LCPLL_CLK_FREQ_54O_BDW) 1176 + return 540000; 1177 + else if (freq == LCPLL_CLK_FREQ_337_5_BDW) 1178 + return 337500; 1179 + else 1180 + return 675000; 1181 + } 1250 1182 } 1251 1183 1252 1184 void intel_ddi_pll_init(struct drm_device *dev)
+64 -18
drivers/gpu/drm/i915/intel_display.c
··· 2156 2156 else 2157 2157 dspcntr &= ~DISPPLANE_TILED; 2158 2158 2159 - if (IS_HASWELL(dev)) 2159 + if (IS_HASWELL(dev) || IS_BROADWELL(dev)) 2160 2160 dspcntr &= ~DISPPLANE_TRICKLE_FEED_DISABLE; 2161 2161 else 2162 2162 dspcntr |= DISPPLANE_TRICKLE_FEED_DISABLE; ··· 2176 2176 I915_WRITE(DSPSTRIDE(plane), fb->pitches[0]); 2177 2177 I915_MODIFY_DISPBASE(DSPSURF(plane), 2178 2178 i915_gem_obj_ggtt_offset(obj) + intel_crtc->dspaddr_offset); 2179 - if (IS_HASWELL(dev)) { 2179 + if (IS_HASWELL(dev) || IS_BROADWELL(dev)) { 2180 2180 I915_WRITE(DSPOFFSET(plane), (y << 16) | x); 2181 2181 } else { 2182 2182 I915_WRITE(DSPTILEOFF(plane), (y << 16) | x); ··· 3393 3393 * only after intel_enable_plane. And intel_enable_plane already waits 3394 3394 * for a vblank, so all we need to do here is to enable the IPS bit. */ 3395 3395 assert_plane_enabled(dev_priv, crtc->plane); 3396 - I915_WRITE(IPS_CTL, IPS_ENABLE); 3397 - 3398 - /* The bit only becomes 1 in the next vblank, so this wait here is 3399 - * essentially intel_wait_for_vblank. If we don't have this and don't 3400 - * wait for vblanks until the end of crtc_enable, then the HW state 3401 - * readout code will complain that the expected IPS_CTL value is not the 3402 - * one we read. */ 3403 - if (wait_for(I915_READ_NOTRACE(IPS_CTL) & IPS_ENABLE, 50)) 3404 - DRM_ERROR("Timed out waiting for IPS enable\n"); 3396 + if (IS_BROADWELL(crtc->base.dev)) { 3397 + mutex_lock(&dev_priv->rps.hw_lock); 3398 + WARN_ON(sandybridge_pcode_write(dev_priv, DISPLAY_IPS_CONTROL, 0xc0000000)); 3399 + mutex_unlock(&dev_priv->rps.hw_lock); 3400 + /* Quoting Art Runyan: "its not safe to expect any particular 3401 + * value in IPS_CTL bit 31 after enabling IPS through the 3402 + * mailbox." Therefore we need to defer waiting on the state 3403 + * change. 3404 + * TODO: need to fix this for state checker 3405 + */ 3406 + } else { 3407 + I915_WRITE(IPS_CTL, IPS_ENABLE); 3408 + /* The bit only becomes 1 in the next vblank, so this wait here 3409 + * is essentially intel_wait_for_vblank. If we don't have this 3410 + * and don't wait for vblanks until the end of crtc_enable, then 3411 + * the HW state readout code will complain that the expected 3412 + * IPS_CTL value is not the one we read. */ 3413 + if (wait_for(I915_READ_NOTRACE(IPS_CTL) & IPS_ENABLE, 50)) 3414 + DRM_ERROR("Timed out waiting for IPS enable\n"); 3415 + } 3405 3416 } 3406 3417 3407 3418 void hsw_disable_ips(struct intel_crtc *crtc) ··· 3424 3413 return; 3425 3414 3426 3415 assert_plane_enabled(dev_priv, crtc->plane); 3427 - I915_WRITE(IPS_CTL, 0); 3416 + if (IS_BROADWELL(crtc->base.dev)) { 3417 + mutex_lock(&dev_priv->rps.hw_lock); 3418 + WARN_ON(sandybridge_pcode_write(dev_priv, DISPLAY_IPS_CONTROL, 0)); 3419 + mutex_unlock(&dev_priv->rps.hw_lock); 3420 + } else 3421 + I915_WRITE(IPS_CTL, 0); 3428 3422 POSTING_READ(IPS_CTL); 3429 3423 3430 3424 /* We need to wait for a vblank before we can disable the plane. */ ··· 4260 4244 return false; 4261 4245 } 4262 4246 4263 - if (IS_HASWELL(dev)) { 4247 + if (IS_HASWELL(dev) || IS_BROADWELL(dev)) { 4264 4248 if (pipe_config->fdi_lanes > 2) { 4265 4249 DRM_DEBUG_KMS("only 2 lanes on haswell, required: %i lanes\n", 4266 4250 pipe_config->fdi_lanes); ··· 5834 5818 5835 5819 static void haswell_set_pipeconf(struct drm_crtc *crtc) 5836 5820 { 5837 - struct drm_i915_private *dev_priv = crtc->dev->dev_private; 5821 + struct drm_device *dev = crtc->dev; 5822 + struct drm_i915_private *dev_priv = dev->dev_private; 5838 5823 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 5824 + enum pipe pipe = intel_crtc->pipe; 5839 5825 enum transcoder cpu_transcoder = intel_crtc->config.cpu_transcoder; 5840 5826 uint32_t val; 5841 5827 5842 5828 val = 0; 5843 5829 5844 - if (intel_crtc->config.dither) 5830 + if (IS_HASWELL(dev) && intel_crtc->config.dither) 5845 5831 val |= (PIPECONF_DITHER_EN | PIPECONF_DITHER_TYPE_SP); 5846 5832 5847 5833 if (intel_crtc->config.adjusted_mode.flags & DRM_MODE_FLAG_INTERLACE) ··· 5856 5838 5857 5839 I915_WRITE(GAMMA_MODE(intel_crtc->pipe), GAMMA_MODE_MODE_8BIT); 5858 5840 POSTING_READ(GAMMA_MODE(intel_crtc->pipe)); 5841 + 5842 + if (IS_BROADWELL(dev)) { 5843 + val = 0; 5844 + 5845 + switch (intel_crtc->config.pipe_bpp) { 5846 + case 18: 5847 + val |= PIPEMISC_DITHER_6_BPC; 5848 + break; 5849 + case 24: 5850 + val |= PIPEMISC_DITHER_8_BPC; 5851 + break; 5852 + case 30: 5853 + val |= PIPEMISC_DITHER_10_BPC; 5854 + break; 5855 + case 36: 5856 + val |= PIPEMISC_DITHER_12_BPC; 5857 + break; 5858 + default: 5859 + /* Case prevented by pipe_config_set_bpp. */ 5860 + BUG(); 5861 + } 5862 + 5863 + if (intel_crtc->config.dither) 5864 + val |= PIPEMISC_DITHER_ENABLE | PIPEMISC_DITHER_TYPE_SP; 5865 + 5866 + I915_WRITE(PIPEMISC(pipe), val); 5867 + } 5859 5868 } 5860 5869 5861 5870 static bool ironlake_compute_clocks(struct drm_crtc *crtc, ··· 7204 7159 cntl &= ~(CURSOR_MODE | MCURSOR_GAMMA_ENABLE); 7205 7160 cntl |= CURSOR_MODE_DISABLE; 7206 7161 } 7207 - if (IS_HASWELL(dev)) { 7162 + if (IS_HASWELL(dev) || IS_BROADWELL(dev)) { 7208 7163 cntl |= CURSOR_PIPE_CSC_ENABLE; 7209 7164 cntl &= ~CURSOR_TRICKLE_FEED_DISABLE; 7210 7165 } ··· 7260 7215 if (!visible && !intel_crtc->cursor_visible) 7261 7216 return; 7262 7217 7263 - if (IS_IVYBRIDGE(dev) || IS_HASWELL(dev)) { 7218 + if (IS_IVYBRIDGE(dev) || IS_HASWELL(dev) || IS_BROADWELL(dev)) { 7264 7219 I915_WRITE(CURPOS_IVB(pipe), pos); 7265 7220 ivb_update_cursor(crtc, base); 7266 7221 } else { ··· 10382 10337 dev_priv->display.write_eld = ironlake_write_eld; 10383 10338 dev_priv->display.modeset_global_resources = 10384 10339 ivb_modeset_global_resources; 10385 - } else if (IS_HASWELL(dev)) { 10340 + } else if (IS_HASWELL(dev) || IS_GEN8(dev)) { 10386 10341 dev_priv->display.fdi_link_train = hsw_fdi_link_train; 10387 10342 dev_priv->display.write_eld = haswell_write_eld; 10388 10343 dev_priv->display.modeset_global_resources = ··· 10414 10369 dev_priv->display.queue_flip = intel_gen6_queue_flip; 10415 10370 break; 10416 10371 case 7: 10372 + case 8: /* FIXME(BDW): Check that the gen8 RCS flip works. */ 10417 10373 dev_priv->display.queue_flip = intel_gen7_queue_flip; 10418 10374 break; 10419 10375 }
+61 -5
drivers/gpu/drm/i915/intel_dp.c
··· 405 405 uint32_t status; 406 406 int try, precharge, clock = 0; 407 407 bool has_aux_irq = INTEL_INFO(dev)->gen >= 5 && !IS_VALLEYVIEW(dev); 408 + uint32_t timeout; 408 409 409 410 /* dp aux is extremely sensitive to irq latency, hence request the 410 411 * lowest possible wakeup latency and so prevent the cpu from going into ··· 419 418 precharge = 3; 420 419 else 421 420 precharge = 5; 421 + 422 + if (IS_BROADWELL(dev) && ch_ctl == DPA_AUX_CH_CTL) 423 + timeout = DP_AUX_CH_CTL_TIME_OUT_600us; 424 + else 425 + timeout = DP_AUX_CH_CTL_TIME_OUT_400us; 422 426 423 427 intel_aux_display_runtime_get(dev_priv); 424 428 ··· 460 454 I915_WRITE(ch_ctl, 461 455 DP_AUX_CH_CTL_SEND_BUSY | 462 456 (has_aux_irq ? DP_AUX_CH_CTL_INTERRUPT : 0) | 463 - DP_AUX_CH_CTL_TIME_OUT_400us | 457 + timeout | 464 458 (send_bytes << DP_AUX_CH_CTL_MESSAGE_SIZE_SHIFT) | 465 459 (precharge << DP_AUX_CH_CTL_PRECHARGE_2US_SHIFT) | 466 460 (aux_clock_divider << DP_AUX_CH_CTL_BIT_CLOCK_2X_SHIFT) | ··· 1616 1610 uint32_t max_sleep_time = 0x1f; 1617 1611 uint32_t idle_frames = 1; 1618 1612 uint32_t val = 0x0; 1613 + const uint32_t link_entry_time = EDP_PSR_MIN_LINK_ENTRY_TIME_8_LINES; 1619 1614 1620 1615 if (intel_dp->psr_dpcd[1] & DP_PSR_NO_TRAIN_ON_EXIT) { 1621 1616 val |= EDP_PSR_LINK_STANDBY; ··· 1627 1620 val |= EDP_PSR_LINK_DISABLE; 1628 1621 1629 1622 I915_WRITE(EDP_PSR_CTL(dev), val | 1630 - EDP_PSR_MIN_LINK_ENTRY_TIME_8_LINES | 1623 + IS_BROADWELL(dev) ? 0 : link_entry_time | 1631 1624 max_sleep_time << EDP_PSR_MAX_SLEEP_TIME_SHIFT | 1632 1625 idle_frames << EDP_PSR_IDLE_FRAME_SHIFT | 1633 1626 EDP_PSR_ENABLE); ··· 1964 1957 struct drm_device *dev = intel_dp_to_dev(intel_dp); 1965 1958 enum port port = dp_to_dig_port(intel_dp)->port; 1966 1959 1967 - if (IS_VALLEYVIEW(dev)) 1960 + if (IS_VALLEYVIEW(dev) || IS_BROADWELL(dev)) 1968 1961 return DP_TRAIN_VOLTAGE_SWING_1200; 1969 1962 else if (IS_GEN7(dev) && port == PORT_A) 1970 1963 return DP_TRAIN_VOLTAGE_SWING_800; ··· 1980 1973 struct drm_device *dev = intel_dp_to_dev(intel_dp); 1981 1974 enum port port = dp_to_dig_port(intel_dp)->port; 1982 1975 1983 - if (HAS_DDI(dev)) { 1976 + if (IS_BROADWELL(dev)) { 1977 + switch (voltage_swing & DP_TRAIN_VOLTAGE_SWING_MASK) { 1978 + case DP_TRAIN_VOLTAGE_SWING_400: 1979 + case DP_TRAIN_VOLTAGE_SWING_600: 1980 + return DP_TRAIN_PRE_EMPHASIS_6; 1981 + case DP_TRAIN_VOLTAGE_SWING_800: 1982 + return DP_TRAIN_PRE_EMPHASIS_3_5; 1983 + case DP_TRAIN_VOLTAGE_SWING_1200: 1984 + default: 1985 + return DP_TRAIN_PRE_EMPHASIS_0; 1986 + } 1987 + } else if (IS_HASWELL(dev)) { 1984 1988 switch (voltage_swing & DP_TRAIN_VOLTAGE_SWING_MASK) { 1985 1989 case DP_TRAIN_VOLTAGE_SWING_400: 1986 1990 return DP_TRAIN_PRE_EMPHASIS_9_5; ··· 2303 2285 } 2304 2286 } 2305 2287 2288 + static uint32_t 2289 + intel_bdw_signal_levels(uint8_t train_set) 2290 + { 2291 + int signal_levels = train_set & (DP_TRAIN_VOLTAGE_SWING_MASK | 2292 + DP_TRAIN_PRE_EMPHASIS_MASK); 2293 + switch (signal_levels) { 2294 + case DP_TRAIN_VOLTAGE_SWING_400 | DP_TRAIN_PRE_EMPHASIS_0: 2295 + return DDI_BUF_EMP_400MV_0DB_BDW; /* Sel0 */ 2296 + case DP_TRAIN_VOLTAGE_SWING_400 | DP_TRAIN_PRE_EMPHASIS_3_5: 2297 + return DDI_BUF_EMP_400MV_3_5DB_BDW; /* Sel1 */ 2298 + case DP_TRAIN_VOLTAGE_SWING_400 | DP_TRAIN_PRE_EMPHASIS_6: 2299 + return DDI_BUF_EMP_400MV_6DB_BDW; /* Sel2 */ 2300 + 2301 + case DP_TRAIN_VOLTAGE_SWING_600 | DP_TRAIN_PRE_EMPHASIS_0: 2302 + return DDI_BUF_EMP_600MV_0DB_BDW; /* Sel3 */ 2303 + case DP_TRAIN_VOLTAGE_SWING_600 | DP_TRAIN_PRE_EMPHASIS_3_5: 2304 + return DDI_BUF_EMP_600MV_3_5DB_BDW; /* Sel4 */ 2305 + case DP_TRAIN_VOLTAGE_SWING_600 | DP_TRAIN_PRE_EMPHASIS_6: 2306 + return DDI_BUF_EMP_600MV_6DB_BDW; /* Sel5 */ 2307 + 2308 + case DP_TRAIN_VOLTAGE_SWING_800 | DP_TRAIN_PRE_EMPHASIS_0: 2309 + return DDI_BUF_EMP_800MV_0DB_BDW; /* Sel6 */ 2310 + case DP_TRAIN_VOLTAGE_SWING_800 | DP_TRAIN_PRE_EMPHASIS_3_5: 2311 + return DDI_BUF_EMP_800MV_3_5DB_BDW; /* Sel7 */ 2312 + 2313 + case DP_TRAIN_VOLTAGE_SWING_1200 | DP_TRAIN_PRE_EMPHASIS_0: 2314 + return DDI_BUF_EMP_1200MV_0DB_BDW; /* Sel8 */ 2315 + 2316 + default: 2317 + DRM_DEBUG_KMS("Unsupported voltage swing/pre-emphasis level:" 2318 + "0x%x\n", signal_levels); 2319 + return DDI_BUF_EMP_400MV_0DB_BDW; /* Sel0 */ 2320 + } 2321 + } 2322 + 2306 2323 /* Properly updates "DP" with the correct signal levels. */ 2307 2324 static void 2308 2325 intel_dp_set_signal_levels(struct intel_dp *intel_dp, uint32_t *DP) ··· 2348 2295 uint32_t signal_levels, mask; 2349 2296 uint8_t train_set = intel_dp->train_set[0]; 2350 2297 2351 - if (HAS_DDI(dev)) { 2298 + if (IS_BROADWELL(dev)) { 2299 + signal_levels = intel_bdw_signal_levels(train_set); 2300 + mask = DDI_BUF_EMP_MASK; 2301 + } else if (IS_HASWELL(dev)) { 2352 2302 signal_levels = intel_hsw_signal_levels(train_set); 2353 2303 mask = DDI_BUF_EMP_MASK; 2354 2304 } else if (IS_VALLEYVIEW(dev)) {
+1 -1
drivers/gpu/drm/i915/intel_hdmi.c
··· 847 847 848 848 if (IS_G4X(dev)) 849 849 return 165000; 850 - else if (IS_HASWELL(dev)) 850 + else if (IS_HASWELL(dev) || INTEL_INFO(dev)->gen >= 8) 851 851 return 300000; 852 852 else 853 853 return 225000;
+152 -12
drivers/gpu/drm/i915/intel_pm.c
··· 2291 2291 2292 2292 static unsigned int ilk_display_fifo_size(const struct drm_device *dev) 2293 2293 { 2294 - if (INTEL_INFO(dev)->gen >= 7) 2294 + if (INTEL_INFO(dev)->gen >= 8) 2295 + return 3072; 2296 + else if (INTEL_INFO(dev)->gen >= 7) 2295 2297 return 768; 2296 2298 else 2297 2299 return 512; ··· 2338 2336 } 2339 2337 2340 2338 /* clamp to max that the registers can hold */ 2341 - if (INTEL_INFO(dev)->gen >= 7) 2339 + if (INTEL_INFO(dev)->gen >= 8) 2340 + max = level == 0 ? 255 : 2047; 2341 + else if (INTEL_INFO(dev)->gen >= 7) 2342 2342 /* IVB/HSW primary/sprite plane watermarks */ 2343 2343 max = level == 0 ? 127 : 1023; 2344 2344 else if (!is_sprite) ··· 2370 2366 } 2371 2367 2372 2368 /* Calculate the maximum FBC watermark */ 2373 - static unsigned int ilk_fbc_wm_max(void) 2369 + static unsigned int ilk_fbc_wm_max(struct drm_device *dev) 2374 2370 { 2375 2371 /* max that registers can hold */ 2376 - return 15; 2372 + if (INTEL_INFO(dev)->gen >= 8) 2373 + return 31; 2374 + else 2375 + return 15; 2377 2376 } 2378 2377 2379 2378 static void ilk_compute_wm_maximums(struct drm_device *dev, ··· 2388 2381 max->pri = ilk_plane_wm_max(dev, level, config, ddb_partitioning, false); 2389 2382 max->spr = ilk_plane_wm_max(dev, level, config, ddb_partitioning, true); 2390 2383 max->cur = ilk_cursor_wm_max(dev, level, config); 2391 - max->fbc = ilk_fbc_wm_max(); 2384 + max->fbc = ilk_fbc_wm_max(dev); 2392 2385 } 2393 2386 2394 2387 static bool ilk_validate_wm_level(int level, ··· 2729 2722 if (!r->enable) 2730 2723 break; 2731 2724 2732 - results->wm_lp[wm_lp - 1] = HSW_WM_LP_VAL(level * 2, 2733 - r->fbc_val, 2734 - r->pri_val, 2735 - r->cur_val); 2725 + results->wm_lp[wm_lp - 1] = WM3_LP_EN | 2726 + ((level * 2) << WM1_LP_LATENCY_SHIFT) | 2727 + (r->pri_val << WM1_LP_SR_SHIFT) | 2728 + r->cur_val; 2729 + 2730 + if (INTEL_INFO(dev)->gen >= 8) 2731 + results->wm_lp[wm_lp - 1] |= 2732 + r->fbc_val << WM1_LP_FBC_SHIFT_BDW; 2733 + else 2734 + results->wm_lp[wm_lp - 1] |= 2735 + r->fbc_val << WM1_LP_FBC_SHIFT; 2736 + 2736 2737 results->wm_lp_spr[wm_lp - 1] = r->spr_val; 2737 2738 } 2738 2739 ··· 3762 3747 I915_WRITE(GEN6_PMINTRMSK, ~enabled_intrs); 3763 3748 } 3764 3749 3750 + static void gen8_enable_rps(struct drm_device *dev) 3751 + { 3752 + struct drm_i915_private *dev_priv = dev->dev_private; 3753 + struct intel_ring_buffer *ring; 3754 + uint32_t rc6_mask = 0, rp_state_cap; 3755 + int unused; 3756 + 3757 + /* 1a: Software RC state - RC0 */ 3758 + I915_WRITE(GEN6_RC_STATE, 0); 3759 + 3760 + /* 1c & 1d: Get forcewake during program sequence. Although the driver 3761 + * hasn't enabled a state yet where we need forcewake, BIOS may have.*/ 3762 + gen6_gt_force_wake_get(dev_priv); 3763 + 3764 + /* 2a: Disable RC states. */ 3765 + I915_WRITE(GEN6_RC_CONTROL, 0); 3766 + 3767 + rp_state_cap = I915_READ(GEN6_RP_STATE_CAP); 3768 + 3769 + /* 2b: Program RC6 thresholds.*/ 3770 + I915_WRITE(GEN6_RC6_WAKE_RATE_LIMIT, 40 << 16); 3771 + I915_WRITE(GEN6_RC_EVALUATION_INTERVAL, 125000); /* 12500 * 1280ns */ 3772 + I915_WRITE(GEN6_RC_IDLE_HYSTERSIS, 25); /* 25 * 1280ns */ 3773 + for_each_ring(ring, dev_priv, unused) 3774 + I915_WRITE(RING_MAX_IDLE(ring->mmio_base), 10); 3775 + I915_WRITE(GEN6_RC_SLEEP, 0); 3776 + I915_WRITE(GEN6_RC6_THRESHOLD, 50000); /* 50/125ms per EI */ 3777 + 3778 + /* 3: Enable RC6 */ 3779 + if (intel_enable_rc6(dev) & INTEL_RC6_ENABLE) 3780 + rc6_mask = GEN6_RC_CTL_RC6_ENABLE; 3781 + DRM_INFO("RC6 %s\n", (rc6_mask & GEN6_RC_CTL_RC6_ENABLE) ? "on" : "off"); 3782 + I915_WRITE(GEN6_RC_CONTROL, GEN6_RC_CTL_HW_ENABLE | 3783 + GEN6_RC_CTL_EI_MODE(1) | 3784 + rc6_mask); 3785 + 3786 + /* 4 Program defaults and thresholds for RPS*/ 3787 + I915_WRITE(GEN6_RPNSWREQ, HSW_FREQUENCY(10)); /* Request 500 MHz */ 3788 + I915_WRITE(GEN6_RC_VIDEO_FREQ, HSW_FREQUENCY(12)); /* Request 600 MHz */ 3789 + /* NB: Docs say 1s, and 1000000 - which aren't equivalent */ 3790 + I915_WRITE(GEN6_RP_DOWN_TIMEOUT, 100000000 / 128); /* 1 second timeout */ 3791 + 3792 + /* Docs recommend 900MHz, and 300 MHz respectively */ 3793 + I915_WRITE(GEN6_RP_INTERRUPT_LIMITS, 3794 + dev_priv->rps.max_delay << 24 | 3795 + dev_priv->rps.min_delay << 16); 3796 + 3797 + I915_WRITE(GEN6_RP_UP_THRESHOLD, 7600000 / 128); /* 76ms busyness per EI, 90% */ 3798 + I915_WRITE(GEN6_RP_DOWN_THRESHOLD, 31300000 / 128); /* 313ms busyness per EI, 70%*/ 3799 + I915_WRITE(GEN6_RP_UP_EI, 66000); /* 84.48ms, XXX: random? */ 3800 + I915_WRITE(GEN6_RP_DOWN_EI, 350000); /* 448ms, XXX: random? */ 3801 + 3802 + I915_WRITE(GEN6_RP_IDLE_HYSTERSIS, 10); 3803 + 3804 + /* 5: Enable RPS */ 3805 + I915_WRITE(GEN6_RP_CONTROL, 3806 + GEN6_RP_MEDIA_TURBO | 3807 + GEN6_RP_MEDIA_HW_NORMAL_MODE | 3808 + GEN6_RP_MEDIA_IS_GFX | 3809 + GEN6_RP_ENABLE | 3810 + GEN6_RP_UP_BUSY_AVG | 3811 + GEN6_RP_DOWN_IDLE_AVG); 3812 + 3813 + /* 6: Ring frequency + overclocking (our driver does this later */ 3814 + 3815 + gen6_set_rps(dev, (I915_READ(GEN6_GT_PERF_STATUS) & 0xff00) >> 8); 3816 + 3817 + gen6_enable_rps_interrupts(dev); 3818 + 3819 + gen6_gt_force_wake_put(dev_priv); 3820 + } 3821 + 3765 3822 static void gen6_enable_rps(struct drm_device *dev) 3766 3823 { 3767 3824 struct drm_i915_private *dev_priv = dev->dev_private; ··· 3996 3909 int diff = dev_priv->rps.max_delay - gpu_freq; 3997 3910 unsigned int ia_freq = 0, ring_freq = 0; 3998 3911 3999 - if (IS_HASWELL(dev)) { 3912 + if (INTEL_INFO(dev)->gen >= 8) { 3913 + /* max(2 * GT, DDR). NB: GT is 50MHz units */ 3914 + ring_freq = max(min_ring_freq, gpu_freq); 3915 + } else if (IS_HASWELL(dev)) { 4000 3916 ring_freq = mult_frac(gpu_freq, 5, 4); 4001 3917 ring_freq = max(min_ring_freq, ring_freq); 4002 3918 /* leave ia_freq as the default, chosen by cpufreq */ ··· 4963 4873 4964 4874 if (IS_VALLEYVIEW(dev)) { 4965 4875 valleyview_enable_rps(dev); 4876 + } else if (IS_BROADWELL(dev)) { 4877 + gen8_enable_rps(dev); 4878 + gen6_update_ring_freq(dev); 4966 4879 } else { 4967 4880 gen6_enable_rps(dev); 4968 4881 gen6_update_ring_freq(dev); ··· 5271 5178 5272 5179 val &= ~PCH_LP_PARTITION_LEVEL_DISABLE; 5273 5180 I915_WRITE(SOUTH_DSPCLK_GATE_D, val); 5181 + } 5182 + } 5183 + 5184 + static void gen8_init_clock_gating(struct drm_device *dev) 5185 + { 5186 + struct drm_i915_private *dev_priv = dev->dev_private; 5187 + enum pipe i; 5188 + 5189 + I915_WRITE(WM3_LP_ILK, 0); 5190 + I915_WRITE(WM2_LP_ILK, 0); 5191 + I915_WRITE(WM1_LP_ILK, 0); 5192 + 5193 + /* FIXME(BDW): Check all the w/a, some might only apply to 5194 + * pre-production hw. */ 5195 + 5196 + WARN(!i915_preliminary_hw_support, 5197 + "GEN8_CENTROID_PIXEL_OPT_DIS not be needed for production\n"); 5198 + I915_WRITE(HALF_SLICE_CHICKEN3, 5199 + _MASKED_BIT_ENABLE(GEN8_CENTROID_PIXEL_OPT_DIS)); 5200 + I915_WRITE(HALF_SLICE_CHICKEN3, 5201 + _MASKED_BIT_ENABLE(GEN8_SAMPLER_POWER_BYPASS_DIS)); 5202 + I915_WRITE(GAMTARBMODE, _MASKED_BIT_ENABLE(ARB_MODE_BWGTLB_DISABLE)); 5203 + 5204 + I915_WRITE(_3D_CHICKEN3, 5205 + _3D_CHICKEN_SDE_LIMIT_FIFO_POLY_DEPTH(2)); 5206 + 5207 + I915_WRITE(COMMON_SLICE_CHICKEN2, 5208 + _MASKED_BIT_ENABLE(GEN8_CSC2_SBE_VUE_CACHE_CONSERVATIVE)); 5209 + 5210 + I915_WRITE(GEN7_HALF_SLICE_CHICKEN1, 5211 + _MASKED_BIT_ENABLE(GEN7_SINGLE_SUBSCAN_DISPATCH_ENABLE)); 5212 + 5213 + /* WaSwitchSolVfFArbitrationPriority */ 5214 + I915_WRITE(GAM_ECOCHK, I915_READ(GAM_ECOCHK) | HSW_ECOCHK_ARB_PRIO_SOL); 5215 + 5216 + /* WaPsrDPAMaskVBlankInSRD */ 5217 + I915_WRITE(CHICKEN_PAR1_1, 5218 + I915_READ(CHICKEN_PAR1_1) | DPA_MASK_VBLANK_SRD); 5219 + 5220 + /* WaPsrDPRSUnmaskVBlankInSRD */ 5221 + for_each_pipe(i) { 5222 + I915_WRITE(CHICKEN_PIPESL_1(i), 5223 + I915_READ(CHICKEN_PIPESL_1(i) | 5224 + DPRS_MASK_VBLANK_SRD)); 5274 5225 } 5275 5226 } 5276 5227 ··· 5648 5511 5649 5512 BUG_ON(BIT(domain) & ~POWER_DOMAIN_MASK); 5650 5513 5651 - if (IS_HASWELL(dev)) { 5514 + if (IS_BROADWELL(dev)) { 5515 + always_on_domains = BDW_ALWAYS_ON_POWER_DOMAINS; 5516 + } else if (IS_HASWELL(dev)) { 5652 5517 always_on_domains = HSW_ALWAYS_ON_POWER_DOMAINS; 5653 5518 } else { 5654 5519 WARN_ON(1); ··· 5972 5833 dev_priv->display.update_wm = NULL; 5973 5834 } 5974 5835 dev_priv->display.init_clock_gating = haswell_init_clock_gating; 5836 + } else if (INTEL_INFO(dev)->gen == 8) { 5837 + dev_priv->display.init_clock_gating = gen8_init_clock_gating; 5975 5838 } else 5976 5839 dev_priv->display.update_wm = NULL; 5977 5840 } else if (IS_VALLEYVIEW(dev)) { ··· 6136 5995 INIT_DELAYED_WORK(&dev_priv->rps.delayed_resume_work, 6137 5996 intel_gen6_powersave_work); 6138 5997 } 6139 -
+177 -17
drivers/gpu/drm/i915/intel_ringbuffer.c
··· 360 360 return 0; 361 361 } 362 362 363 + static int 364 + gen8_render_ring_flush(struct intel_ring_buffer *ring, 365 + u32 invalidate_domains, u32 flush_domains) 366 + { 367 + u32 flags = 0; 368 + u32 scratch_addr = ring->scratch.gtt_offset + 128; 369 + int ret; 370 + 371 + flags |= PIPE_CONTROL_CS_STALL; 372 + 373 + if (flush_domains) { 374 + flags |= PIPE_CONTROL_RENDER_TARGET_CACHE_FLUSH; 375 + flags |= PIPE_CONTROL_DEPTH_CACHE_FLUSH; 376 + } 377 + if (invalidate_domains) { 378 + flags |= PIPE_CONTROL_TLB_INVALIDATE; 379 + flags |= PIPE_CONTROL_INSTRUCTION_CACHE_INVALIDATE; 380 + flags |= PIPE_CONTROL_TEXTURE_CACHE_INVALIDATE; 381 + flags |= PIPE_CONTROL_VF_CACHE_INVALIDATE; 382 + flags |= PIPE_CONTROL_CONST_CACHE_INVALIDATE; 383 + flags |= PIPE_CONTROL_STATE_CACHE_INVALIDATE; 384 + flags |= PIPE_CONTROL_QW_WRITE; 385 + flags |= PIPE_CONTROL_GLOBAL_GTT_IVB; 386 + } 387 + 388 + ret = intel_ring_begin(ring, 6); 389 + if (ret) 390 + return ret; 391 + 392 + intel_ring_emit(ring, GFX_OP_PIPE_CONTROL(6)); 393 + intel_ring_emit(ring, flags); 394 + intel_ring_emit(ring, scratch_addr); 395 + intel_ring_emit(ring, 0); 396 + intel_ring_emit(ring, 0); 397 + intel_ring_emit(ring, 0); 398 + intel_ring_advance(ring); 399 + 400 + return 0; 401 + 402 + } 403 + 363 404 static void ring_write_tail(struct intel_ring_buffer *ring, 364 405 u32 value) 365 406 { ··· 1107 1066 spin_unlock_irqrestore(&dev_priv->irq_lock, flags); 1108 1067 } 1109 1068 1069 + static bool 1070 + gen8_ring_get_irq(struct intel_ring_buffer *ring) 1071 + { 1072 + struct drm_device *dev = ring->dev; 1073 + struct drm_i915_private *dev_priv = dev->dev_private; 1074 + unsigned long flags; 1075 + 1076 + if (!dev->irq_enabled) 1077 + return false; 1078 + 1079 + spin_lock_irqsave(&dev_priv->irq_lock, flags); 1080 + if (ring->irq_refcount++ == 0) { 1081 + if (HAS_L3_DPF(dev) && ring->id == RCS) { 1082 + I915_WRITE_IMR(ring, 1083 + ~(ring->irq_enable_mask | 1084 + GT_RENDER_L3_PARITY_ERROR_INTERRUPT)); 1085 + } else { 1086 + I915_WRITE_IMR(ring, ~ring->irq_enable_mask); 1087 + } 1088 + POSTING_READ(RING_IMR(ring->mmio_base)); 1089 + } 1090 + spin_unlock_irqrestore(&dev_priv->irq_lock, flags); 1091 + 1092 + return true; 1093 + } 1094 + 1095 + static void 1096 + gen8_ring_put_irq(struct intel_ring_buffer *ring) 1097 + { 1098 + struct drm_device *dev = ring->dev; 1099 + struct drm_i915_private *dev_priv = dev->dev_private; 1100 + unsigned long flags; 1101 + 1102 + spin_lock_irqsave(&dev_priv->irq_lock, flags); 1103 + if (--ring->irq_refcount == 0) { 1104 + if (HAS_L3_DPF(dev) && ring->id == RCS) { 1105 + I915_WRITE_IMR(ring, 1106 + ~GT_RENDER_L3_PARITY_ERROR_INTERRUPT); 1107 + } else { 1108 + I915_WRITE_IMR(ring, ~0); 1109 + } 1110 + POSTING_READ(RING_IMR(ring->mmio_base)); 1111 + } 1112 + spin_unlock_irqrestore(&dev_priv->irq_lock, flags); 1113 + } 1114 + 1110 1115 static int 1111 1116 i965_dispatch_execbuffer(struct intel_ring_buffer *ring, 1112 1117 u32 offset, u32 length, ··· 1711 1624 return ret; 1712 1625 1713 1626 cmd = MI_FLUSH_DW; 1627 + if (INTEL_INFO(ring->dev)->gen >= 8) 1628 + cmd += 1; 1714 1629 /* 1715 1630 * Bspec vol 1c.5 - video engine command streamer: 1716 1631 * "If ENABLED, all TLBs will be invalidated once the flush ··· 1724 1635 MI_FLUSH_DW_STORE_INDEX | MI_FLUSH_DW_OP_STOREDW; 1725 1636 intel_ring_emit(ring, cmd); 1726 1637 intel_ring_emit(ring, I915_GEM_HWS_SCRATCH_ADDR | MI_FLUSH_DW_USE_GTT); 1638 + if (INTEL_INFO(ring->dev)->gen >= 8) { 1639 + intel_ring_emit(ring, 0); /* upper addr */ 1640 + intel_ring_emit(ring, 0); /* value */ 1641 + } else { 1642 + intel_ring_emit(ring, 0); 1643 + intel_ring_emit(ring, MI_NOOP); 1644 + } 1645 + intel_ring_advance(ring); 1646 + return 0; 1647 + } 1648 + 1649 + static int 1650 + gen8_ring_dispatch_execbuffer(struct intel_ring_buffer *ring, 1651 + u32 offset, u32 len, 1652 + unsigned flags) 1653 + { 1654 + struct drm_i915_private *dev_priv = ring->dev->dev_private; 1655 + bool ppgtt = dev_priv->mm.aliasing_ppgtt != NULL && 1656 + !(flags & I915_DISPATCH_SECURE); 1657 + int ret; 1658 + 1659 + ret = intel_ring_begin(ring, 4); 1660 + if (ret) 1661 + return ret; 1662 + 1663 + /* FIXME(BDW): Address space and security selectors. */ 1664 + intel_ring_emit(ring, MI_BATCH_BUFFER_START_GEN8 | (ppgtt<<8)); 1665 + intel_ring_emit(ring, offset); 1727 1666 intel_ring_emit(ring, 0); 1728 1667 intel_ring_emit(ring, MI_NOOP); 1729 1668 intel_ring_advance(ring); 1669 + 1730 1670 return 0; 1731 1671 } 1732 1672 ··· 1815 1697 return ret; 1816 1698 1817 1699 cmd = MI_FLUSH_DW; 1700 + if (INTEL_INFO(ring->dev)->gen >= 8) 1701 + cmd += 1; 1818 1702 /* 1819 1703 * Bspec vol 1c.3 - blitter engine command streamer: 1820 1704 * "If ENABLED, all TLBs will be invalidated once the flush ··· 1828 1708 MI_FLUSH_DW_OP_STOREDW; 1829 1709 intel_ring_emit(ring, cmd); 1830 1710 intel_ring_emit(ring, I915_GEM_HWS_SCRATCH_ADDR | MI_FLUSH_DW_USE_GTT); 1831 - intel_ring_emit(ring, 0); 1832 - intel_ring_emit(ring, MI_NOOP); 1711 + if (INTEL_INFO(ring->dev)->gen >= 8) { 1712 + intel_ring_emit(ring, 0); /* upper addr */ 1713 + intel_ring_emit(ring, 0); /* value */ 1714 + } else { 1715 + intel_ring_emit(ring, 0); 1716 + intel_ring_emit(ring, MI_NOOP); 1717 + } 1833 1718 intel_ring_advance(ring); 1834 1719 1835 1720 if (IS_GEN7(dev) && flush) ··· 1857 1732 ring->flush = gen7_render_ring_flush; 1858 1733 if (INTEL_INFO(dev)->gen == 6) 1859 1734 ring->flush = gen6_render_ring_flush; 1860 - ring->irq_get = gen6_ring_get_irq; 1861 - ring->irq_put = gen6_ring_put_irq; 1735 + if (INTEL_INFO(dev)->gen >= 8) { 1736 + ring->flush = gen8_render_ring_flush; 1737 + ring->irq_get = gen8_ring_get_irq; 1738 + ring->irq_put = gen8_ring_put_irq; 1739 + } else { 1740 + ring->irq_get = gen6_ring_get_irq; 1741 + ring->irq_put = gen6_ring_put_irq; 1742 + } 1862 1743 ring->irq_enable_mask = GT_RENDER_USER_INTERRUPT; 1863 1744 ring->get_seqno = gen6_ring_get_seqno; 1864 1745 ring->set_seqno = ring_set_seqno; ··· 1906 1775 ring->write_tail = ring_write_tail; 1907 1776 if (IS_HASWELL(dev)) 1908 1777 ring->dispatch_execbuffer = hsw_ring_dispatch_execbuffer; 1778 + else if (IS_GEN8(dev)) 1779 + ring->dispatch_execbuffer = gen8_ring_dispatch_execbuffer; 1909 1780 else if (INTEL_INFO(dev)->gen >= 6) 1910 1781 ring->dispatch_execbuffer = gen6_ring_dispatch_execbuffer; 1911 1782 else if (INTEL_INFO(dev)->gen >= 4) ··· 2021 1888 ring->id = VCS; 2022 1889 2023 1890 ring->write_tail = ring_write_tail; 2024 - if (IS_GEN6(dev) || IS_GEN7(dev)) { 1891 + if (INTEL_INFO(dev)->gen >= 6) { 2025 1892 ring->mmio_base = GEN6_BSD_RING_BASE; 2026 1893 /* gen6 bsd needs a special wa for tail updates */ 2027 1894 if (IS_GEN6(dev)) ··· 2030 1897 ring->add_request = gen6_add_request; 2031 1898 ring->get_seqno = gen6_ring_get_seqno; 2032 1899 ring->set_seqno = ring_set_seqno; 2033 - ring->irq_enable_mask = GT_BSD_USER_INTERRUPT; 2034 - ring->irq_get = gen6_ring_get_irq; 2035 - ring->irq_put = gen6_ring_put_irq; 2036 - ring->dispatch_execbuffer = gen6_ring_dispatch_execbuffer; 1900 + if (INTEL_INFO(dev)->gen >= 8) { 1901 + ring->irq_enable_mask = 1902 + GT_RENDER_USER_INTERRUPT << GEN8_VCS1_IRQ_SHIFT; 1903 + ring->irq_get = gen8_ring_get_irq; 1904 + ring->irq_put = gen8_ring_put_irq; 1905 + ring->dispatch_execbuffer = 1906 + gen8_ring_dispatch_execbuffer; 1907 + } else { 1908 + ring->irq_enable_mask = GT_BSD_USER_INTERRUPT; 1909 + ring->irq_get = gen6_ring_get_irq; 1910 + ring->irq_put = gen6_ring_put_irq; 1911 + ring->dispatch_execbuffer = 1912 + gen6_ring_dispatch_execbuffer; 1913 + } 2037 1914 ring->sync_to = gen6_ring_sync; 2038 1915 ring->semaphore_register[RCS] = MI_SEMAPHORE_SYNC_VR; 2039 1916 ring->semaphore_register[VCS] = MI_SEMAPHORE_SYNC_INVALID; ··· 2089 1946 ring->add_request = gen6_add_request; 2090 1947 ring->get_seqno = gen6_ring_get_seqno; 2091 1948 ring->set_seqno = ring_set_seqno; 2092 - ring->irq_enable_mask = GT_BLT_USER_INTERRUPT; 2093 - ring->irq_get = gen6_ring_get_irq; 2094 - ring->irq_put = gen6_ring_put_irq; 2095 - ring->dispatch_execbuffer = gen6_ring_dispatch_execbuffer; 1949 + if (INTEL_INFO(dev)->gen >= 8) { 1950 + ring->irq_enable_mask = 1951 + GT_RENDER_USER_INTERRUPT << GEN8_BCS_IRQ_SHIFT; 1952 + ring->irq_get = gen8_ring_get_irq; 1953 + ring->irq_put = gen8_ring_put_irq; 1954 + ring->dispatch_execbuffer = gen8_ring_dispatch_execbuffer; 1955 + } else { 1956 + ring->irq_enable_mask = GT_BLT_USER_INTERRUPT; 1957 + ring->irq_get = gen6_ring_get_irq; 1958 + ring->irq_put = gen6_ring_put_irq; 1959 + ring->dispatch_execbuffer = gen6_ring_dispatch_execbuffer; 1960 + } 2096 1961 ring->sync_to = gen6_ring_sync; 2097 1962 ring->semaphore_register[RCS] = MI_SEMAPHORE_SYNC_BR; 2098 1963 ring->semaphore_register[VCS] = MI_SEMAPHORE_SYNC_BV; ··· 2129 1978 ring->add_request = gen6_add_request; 2130 1979 ring->get_seqno = gen6_ring_get_seqno; 2131 1980 ring->set_seqno = ring_set_seqno; 2132 - ring->irq_enable_mask = PM_VEBOX_USER_INTERRUPT; 2133 - ring->irq_get = hsw_vebox_get_irq; 2134 - ring->irq_put = hsw_vebox_put_irq; 2135 - ring->dispatch_execbuffer = gen6_ring_dispatch_execbuffer; 1981 + 1982 + if (INTEL_INFO(dev)->gen >= 8) { 1983 + ring->irq_enable_mask = 1984 + GT_RENDER_USER_INTERRUPT << GEN8_VECS_IRQ_SHIFT; 1985 + ring->irq_get = gen8_ring_get_irq; 1986 + ring->irq_put = gen8_ring_put_irq; 1987 + ring->dispatch_execbuffer = gen8_ring_dispatch_execbuffer; 1988 + } else { 1989 + ring->irq_enable_mask = PM_VEBOX_USER_INTERRUPT; 1990 + ring->irq_get = hsw_vebox_get_irq; 1991 + ring->irq_put = hsw_vebox_put_irq; 1992 + ring->dispatch_execbuffer = gen6_ring_dispatch_execbuffer; 1993 + } 2136 1994 ring->sync_to = gen6_ring_sync; 2137 1995 ring->semaphore_register[RCS] = MI_SEMAPHORE_SYNC_VER; 2138 1996 ring->semaphore_register[VCS] = MI_SEMAPHORE_SYNC_VEV;
+4 -3
drivers/gpu/drm/i915/intel_sprite.c
··· 260 260 if (obj->tiling_mode != I915_TILING_NONE) 261 261 sprctl |= SPRITE_TILED; 262 262 263 - if (IS_HASWELL(dev)) 263 + if (IS_HASWELL(dev) || IS_BROADWELL(dev)) 264 264 sprctl &= ~SPRITE_TRICKLE_FEED_DISABLE; 265 265 else 266 266 sprctl |= SPRITE_TRICKLE_FEED_DISABLE; 267 267 268 268 sprctl |= SPRITE_ENABLE; 269 269 270 - if (IS_HASWELL(dev)) 270 + if (IS_HASWELL(dev) || IS_BROADWELL(dev)) 271 271 sprctl |= SPRITE_PIPE_CSC_ENABLE; 272 272 273 273 intel_update_sprite_watermarks(plane, crtc, src_w, pixel_size, true, ··· 306 306 307 307 /* HSW consolidates SPRTILEOFF and SPRLINOFF into a single SPROFFSET 308 308 * register */ 309 - if (IS_HASWELL(dev)) 309 + if (IS_HASWELL(dev) || IS_BROADWELL(dev)) 310 310 I915_WRITE(SPROFFSET(pipe), (y << 16) | x); 311 311 else if (obj->tiling_mode != I915_TILING_NONE) 312 312 I915_WRITE(SPRTILEOFF(pipe), (y << 16) | x); ··· 1092 1092 break; 1093 1093 1094 1094 case 7: 1095 + case 8: 1095 1096 if (IS_IVYBRIDGE(dev)) { 1096 1097 intel_plane->can_scale = true; 1097 1098 intel_plane->max_downscale = 2;
+55 -3
drivers/gpu/drm/i915/intel_uncore.c
··· 93 93 { 94 94 u32 forcewake_ack; 95 95 96 - if (IS_HASWELL(dev_priv->dev)) 96 + if (IS_HASWELL(dev_priv->dev) || IS_GEN8(dev_priv->dev)) 97 97 forcewake_ack = FORCEWAKE_ACK_HSW; 98 98 else 99 99 forcewake_ack = FORCEWAKE_MT_ACK; ··· 112 112 DRM_ERROR("Timed out waiting for forcewake to ack request.\n"); 113 113 114 114 /* WaRsForcewakeWaitTC0:ivb,hsw */ 115 - __gen6_gt_wait_for_thread_c0(dev_priv); 115 + if (INTEL_INFO(dev_priv->dev)->gen < 8) 116 + __gen6_gt_wait_for_thread_c0(dev_priv); 116 117 } 117 118 118 119 static void gen6_gt_check_fifodbg(struct drm_i915_private *dev_priv) ··· 460 459 spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); \ 461 460 } 462 461 462 + static const u32 gen8_shadowed_regs[] = { 463 + FORCEWAKE_MT, 464 + GEN6_RPNSWREQ, 465 + GEN6_RC_VIDEO_FREQ, 466 + RING_TAIL(RENDER_RING_BASE), 467 + RING_TAIL(GEN6_BSD_RING_BASE), 468 + RING_TAIL(VEBOX_RING_BASE), 469 + RING_TAIL(BLT_RING_BASE), 470 + /* TODO: Other registers are not yet used */ 471 + }; 472 + 473 + static bool is_gen8_shadowed(struct drm_i915_private *dev_priv, u32 reg) 474 + { 475 + int i; 476 + for (i = 0; i < ARRAY_SIZE(gen8_shadowed_regs); i++) 477 + if (reg == gen8_shadowed_regs[i]) 478 + return true; 479 + 480 + return false; 481 + } 482 + 483 + #define __gen8_write(x) \ 484 + static void \ 485 + gen8_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace) { \ 486 + bool __needs_put = !is_gen8_shadowed(dev_priv, reg); \ 487 + REG_WRITE_HEADER; \ 488 + if (__needs_put) { \ 489 + dev_priv->uncore.funcs.force_wake_get(dev_priv); \ 490 + } \ 491 + __raw_i915_write##x(dev_priv, reg, val); \ 492 + if (__needs_put) { \ 493 + dev_priv->uncore.funcs.force_wake_put(dev_priv); \ 494 + } \ 495 + spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); \ 496 + } 497 + 498 + __gen8_write(8) 499 + __gen8_write(16) 500 + __gen8_write(32) 501 + __gen8_write(64) 463 502 __hsw_write(8) 464 503 __hsw_write(16) 465 504 __hsw_write(32) ··· 517 476 __gen4_write(32) 518 477 __gen4_write(64) 519 478 479 + #undef __gen8_write 520 480 #undef __hsw_write 521 481 #undef __gen6_write 522 482 #undef __gen5_write ··· 534 492 if (IS_VALLEYVIEW(dev)) { 535 493 dev_priv->uncore.funcs.force_wake_get = vlv_force_wake_get; 536 494 dev_priv->uncore.funcs.force_wake_put = vlv_force_wake_put; 537 - } else if (IS_HASWELL(dev)) { 495 + } else if (IS_HASWELL(dev) || IS_GEN8(dev)) { 538 496 dev_priv->uncore.funcs.force_wake_get = __gen6_gt_force_wake_mt_get; 539 497 dev_priv->uncore.funcs.force_wake_put = __gen6_gt_force_wake_mt_put; 540 498 } else if (IS_IVYBRIDGE(dev)) { ··· 576 534 } 577 535 578 536 switch (INTEL_INFO(dev)->gen) { 537 + default: 538 + dev_priv->uncore.funcs.mmio_writeb = gen8_write8; 539 + dev_priv->uncore.funcs.mmio_writew = gen8_write16; 540 + dev_priv->uncore.funcs.mmio_writel = gen8_write32; 541 + dev_priv->uncore.funcs.mmio_writeq = gen8_write64; 542 + dev_priv->uncore.funcs.mmio_readb = gen6_read8; 543 + dev_priv->uncore.funcs.mmio_readw = gen6_read16; 544 + dev_priv->uncore.funcs.mmio_readl = gen6_read32; 545 + dev_priv->uncore.funcs.mmio_readq = gen6_read64; 546 + break; 579 547 case 7: 580 548 case 6: 581 549 if (IS_HASWELL(dev)) {
+4
include/drm/i915_drm.h
··· 49 49 #define SNB_GMCH_GGMS_MASK 0x3 50 50 #define SNB_GMCH_GMS_SHIFT 3 /* Graphics Mode Select */ 51 51 #define SNB_GMCH_GMS_MASK 0x1f 52 + #define BDW_GMCH_GGMS_SHIFT 6 53 + #define BDW_GMCH_GGMS_MASK 0x3 54 + #define BDW_GMCH_GMS_SHIFT 8 55 + #define BDW_GMCH_GMS_MASK 0xff 52 56 53 57 #define I830_GMCH_CTRL 0x52 54 58
+25
include/drm/i915_pciids.h
··· 208 208 #define INTEL_VLV_D_IDS(info) \ 209 209 INTEL_VGA_DEVICE(0x0155, info) 210 210 211 + #define _INTEL_BDW_M(gt, id, info) \ 212 + INTEL_VGA_DEVICE((((gt) - 1) << 4) | (id), info) 213 + #define _INTEL_BDW_D(gt, id, info) \ 214 + INTEL_VGA_DEVICE((((gt) - 1) << 4) | (id), info) 215 + 216 + #define _INTEL_BDW_M_IDS(gt, info) \ 217 + _INTEL_BDW_M(gt, 0x1602, info), /* ULT */ \ 218 + _INTEL_BDW_M(gt, 0x1606, info), /* ULT */ \ 219 + _INTEL_BDW_M(gt, 0x160B, info), /* Iris */ \ 220 + _INTEL_BDW_M(gt, 0x160E, info) /* ULX */ 221 + 222 + #define _INTEL_BDW_D_IDS(gt, info) \ 223 + _INTEL_BDW_D(gt, 0x160A, info), /* Server */ \ 224 + _INTEL_BDW_D(gt, 0x160D, info) /* Workstation */ 225 + 226 + #define INTEL_BDW_M_IDS(info) \ 227 + _INTEL_BDW_M_IDS(1, info), \ 228 + _INTEL_BDW_M_IDS(2, info), \ 229 + _INTEL_BDW_M_IDS(3, info) 230 + 231 + #define INTEL_BDW_D_IDS(info) \ 232 + _INTEL_BDW_D_IDS(1, info), \ 233 + _INTEL_BDW_D_IDS(2, info), \ 234 + _INTEL_BDW_D_IDS(3, info) 235 + 211 236 #endif /* _I915_PCIIDS_H */