diff options
author | Ben Widawsky <benjamin.widawsky@intel.com> | 2013-10-05 00:22:54 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2013-10-10 06:47:09 -0400 |
commit | 4032ef4315475dd9605d6cde461168fb85d776ea (patch) | |
tree | afc655e39cee864255cb49657d4e30d1e0c549ac | |
parent | 3967018ed67f9480b2f47f8908b44b66bdbd40b5 (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.c | 87 |
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) \ |
412 | static void \ | 412 | static void \ |
413 | i915_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace) { \ | 413 | gen4_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) \ | ||
420 | static void \ | ||
421 | gen5_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) \ | ||
429 | static void \ | ||
430 | gen6_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) \ | ||
444 | static void \ | ||
445 | hsw_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 | ||
437 | void intel_uncore_init(struct drm_device *dev) | 483 | void 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 | ||
517 | void intel_uncore_fini(struct drm_device *dev) | 578 | void intel_uncore_fini(struct drm_device *dev) |