aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Widawsky <benjamin.widawsky@intel.com>2013-10-05 00:22:54 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2013-10-10 06:47:09 -0400
commit4032ef4315475dd9605d6cde461168fb85d776ea (patch)
treeafc655e39cee864255cb49657d4e30d1e0c549ac
parent3967018ed67f9480b2f47f8908b44b66bdbd40b5 (diff)
drm/i915: Create GEN specific write MMIO
Similar to the previous patch which implemented GEN specific reads; this patch does the same for writes. Writes have a bit of adding complexity due to the FPGA_DBG feature of HSW plus: gen[2-4]: nothing special gen5: ILK dummy write gen[6-7]: forcewake shenanigans gen[HSW}: forcewake shenanigans + FPGA_DBG I was a bit torn about whether or not to combine 6-HSW as one function, since the FPGA_DBG is cleanly separated, and it wouldn't make the 6-7 MMIO too messy. In the end, I chose the clearest possible solution which splits out HSW. Signed-off-by: Ben Widawsky <ben@bwidawsk.net> Reviewed-by: Damien Lespiau <damien.lespiau@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/i915/intel_uncore.c87
1 files changed, 74 insertions, 13 deletions
diff --git a/drivers/gpu/drm/i915/intel_uncore.c b/drivers/gpu/drm/i915/intel_uncore.c
index d1b32c848a44..7e8dcbeb0cac 100644
--- a/drivers/gpu/drm/i915/intel_uncore.c
+++ b/drivers/gpu/drm/i915/intel_uncore.c
@@ -408,16 +408,46 @@ __gen4_read(64)
408 trace_i915_reg_rw(true, reg, val, sizeof(val), trace); \ 408 trace_i915_reg_rw(true, reg, val, sizeof(val), trace); \
409 spin_lock_irqsave(&dev_priv->uncore.lock, irqflags) 409 spin_lock_irqsave(&dev_priv->uncore.lock, irqflags)
410 410
411#define __i915_write(x) \ 411#define __gen4_write(x) \
412static void \ 412static void \
413i915_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace) { \ 413gen4_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace) { \
414 REG_WRITE_HEADER; \
415 __raw_i915_write##x(dev_priv, reg, val); \
416 spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); \
417}
418
419#define __gen5_write(x) \
420static void \
421gen5_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace) { \
422 REG_WRITE_HEADER; \
423 ilk_dummy_write(dev_priv); \
424 __raw_i915_write##x(dev_priv, reg, val); \
425 spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); \
426}
427
428#define __gen6_write(x) \
429static void \
430gen6_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace) { \
431 u32 __fifo_ret = 0; \
432 REG_WRITE_HEADER; \
433 if (NEEDS_FORCE_WAKE((dev_priv), (reg))) { \
434 __fifo_ret = __gen6_gt_wait_for_fifo(dev_priv); \
435 } \
436 __raw_i915_write##x(dev_priv, reg, val); \
437 if (unlikely(__fifo_ret)) { \
438 gen6_gt_check_fifodbg(dev_priv); \
439 } \
440 spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); \
441}
442
443#define __hsw_write(x) \
444static void \
445hsw_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace) { \
414 u32 __fifo_ret = 0; \ 446 u32 __fifo_ret = 0; \
415 REG_WRITE_HEADER; \ 447 REG_WRITE_HEADER; \
416 if (NEEDS_FORCE_WAKE((dev_priv), (reg))) { \ 448 if (NEEDS_FORCE_WAKE((dev_priv), (reg))) { \
417 __fifo_ret = __gen6_gt_wait_for_fifo(dev_priv); \ 449 __fifo_ret = __gen6_gt_wait_for_fifo(dev_priv); \
418 } \ 450 } \
419 if (dev_priv->info->gen == 5) \
420 ilk_dummy_write(dev_priv); \
421 hsw_unclaimed_reg_clear(dev_priv, reg); \ 451 hsw_unclaimed_reg_clear(dev_priv, reg); \
422 __raw_i915_write##x(dev_priv, reg, val); \ 452 __raw_i915_write##x(dev_priv, reg, val); \
423 if (unlikely(__fifo_ret)) { \ 453 if (unlikely(__fifo_ret)) { \
@@ -427,11 +457,27 @@ i915_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace
427 spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); \ 457 spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); \
428} 458}
429 459
430__i915_write(8) 460__hsw_write(8)
431__i915_write(16) 461__hsw_write(16)
432__i915_write(32) 462__hsw_write(32)
433__i915_write(64) 463__hsw_write(64)
434#undef __i915_write 464__gen6_write(8)
465__gen6_write(16)
466__gen6_write(32)
467__gen6_write(64)
468__gen5_write(8)
469__gen5_write(16)
470__gen5_write(32)
471__gen5_write(64)
472__gen4_write(8)
473__gen4_write(16)
474__gen4_write(32)
475__gen4_write(64)
476
477#undef __hsw_write
478#undef __gen6_write
479#undef __gen5_write
480#undef __gen4_write
435#undef REG_WRITE_HEADER 481#undef REG_WRITE_HEADER
436 482
437void intel_uncore_init(struct drm_device *dev) 483void intel_uncore_init(struct drm_device *dev)
@@ -488,12 +534,27 @@ void intel_uncore_init(struct drm_device *dev)
488 switch (INTEL_INFO(dev)->gen) { 534 switch (INTEL_INFO(dev)->gen) {
489 case 7: 535 case 7:
490 case 6: 536 case 6:
537 if (IS_HASWELL(dev)) {
538 dev_priv->uncore.funcs.mmio_writeb = hsw_write8;
539 dev_priv->uncore.funcs.mmio_writew = hsw_write16;
540 dev_priv->uncore.funcs.mmio_writel = hsw_write32;
541 dev_priv->uncore.funcs.mmio_writeq = hsw_write64;
542 } else {
543 dev_priv->uncore.funcs.mmio_writeb = gen6_write8;
544 dev_priv->uncore.funcs.mmio_writew = gen6_write16;
545 dev_priv->uncore.funcs.mmio_writel = gen6_write32;
546 dev_priv->uncore.funcs.mmio_writeq = gen6_write64;
547 }
491 dev_priv->uncore.funcs.mmio_readb = gen6_read8; 548 dev_priv->uncore.funcs.mmio_readb = gen6_read8;
492 dev_priv->uncore.funcs.mmio_readw = gen6_read16; 549 dev_priv->uncore.funcs.mmio_readw = gen6_read16;
493 dev_priv->uncore.funcs.mmio_readl = gen6_read32; 550 dev_priv->uncore.funcs.mmio_readl = gen6_read32;
494 dev_priv->uncore.funcs.mmio_readq = gen6_read64; 551 dev_priv->uncore.funcs.mmio_readq = gen6_read64;
495 break; 552 break;
496 case 5: 553 case 5:
554 dev_priv->uncore.funcs.mmio_writeb = gen5_write8;
555 dev_priv->uncore.funcs.mmio_writew = gen5_write16;
556 dev_priv->uncore.funcs.mmio_writel = gen5_write32;
557 dev_priv->uncore.funcs.mmio_writeq = gen5_write64;
497 dev_priv->uncore.funcs.mmio_readb = gen5_read8; 558 dev_priv->uncore.funcs.mmio_readb = gen5_read8;
498 dev_priv->uncore.funcs.mmio_readw = gen5_read16; 559 dev_priv->uncore.funcs.mmio_readw = gen5_read16;
499 dev_priv->uncore.funcs.mmio_readl = gen5_read32; 560 dev_priv->uncore.funcs.mmio_readl = gen5_read32;
@@ -502,16 +563,16 @@ void intel_uncore_init(struct drm_device *dev)
502 case 4: 563 case 4:
503 case 3: 564 case 3:
504 case 2: 565 case 2:
566 dev_priv->uncore.funcs.mmio_writeb = gen4_write8;
567 dev_priv->uncore.funcs.mmio_writew = gen4_write16;
568 dev_priv->uncore.funcs.mmio_writel = gen4_write32;
569 dev_priv->uncore.funcs.mmio_writeq = gen4_write64;
505 dev_priv->uncore.funcs.mmio_readb = gen4_read8; 570 dev_priv->uncore.funcs.mmio_readb = gen4_read8;
506 dev_priv->uncore.funcs.mmio_readw = gen4_read16; 571 dev_priv->uncore.funcs.mmio_readw = gen4_read16;
507 dev_priv->uncore.funcs.mmio_readl = gen4_read32; 572 dev_priv->uncore.funcs.mmio_readl = gen4_read32;
508 dev_priv->uncore.funcs.mmio_readq = gen4_read64; 573 dev_priv->uncore.funcs.mmio_readq = gen4_read64;
509 break; 574 break;
510 } 575 }
511 dev_priv->uncore.funcs.mmio_writeb = i915_write8;
512 dev_priv->uncore.funcs.mmio_writew = i915_write16;
513 dev_priv->uncore.funcs.mmio_writel = i915_write32;
514 dev_priv->uncore.funcs.mmio_writeq = i915_write64;
515} 576}
516 577
517void intel_uncore_fini(struct drm_device *dev) 578void intel_uncore_fini(struct drm_device *dev)