Subversion Repositories Kolibri OS

Rev

Rev 6660 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 6660 Rev 6937
Line 27... Line 27...
27
 
27
 
Line 28... Line 28...
28
#include 
28
#include 
Line 29... Line -...
29
 
-
 
30
#define FORCEWAKE_ACK_TIMEOUT_MS 50
-
 
31
 
-
 
32
#define __raw_i915_read8(dev_priv__, reg__) readb((dev_priv__)->regs + (reg__))
-
 
33
#define __raw_i915_write8(dev_priv__, reg__, val__) writeb(val__, (dev_priv__)->regs + (reg__))
-
 
34
 
-
 
35
#define __raw_i915_read16(dev_priv__, reg__) readw((dev_priv__)->regs + (reg__))
-
 
36
#define __raw_i915_write16(dev_priv__, reg__, val__) writew(val__, (dev_priv__)->regs + (reg__))
-
 
37
 
-
 
38
#define __raw_i915_read32(dev_priv__, reg__) readl((dev_priv__)->regs + (reg__))
-
 
39
#define __raw_i915_write32(dev_priv__, reg__, val__) writel(val__, (dev_priv__)->regs + (reg__))
-
 
40
 
-
 
41
#define __raw_i915_read64(dev_priv__, reg__) readq((dev_priv__)->regs + (reg__))
29
 
Line 42... Line 30...
42
#define __raw_i915_write64(dev_priv__, reg__, val__) writeq(val__, (dev_priv__)->regs + (reg__))
30
#define FORCEWAKE_ACK_TIMEOUT_MS 50
43
 
31
 
44
#define __raw_posting_read(dev_priv__, reg__) (void)__raw_i915_read32(dev_priv__, reg__)
32
#define __raw_posting_read(dev_priv__, reg__) (void)__raw_i915_read32((dev_priv__), (reg__))
45
 
33
 
Line 60... Line 48...
60
	WARN_ON(id);
48
	WARN_ON(id);
Line 61... Line 49...
61
 
49
 
62
	return "unknown";
50
	return "unknown";
Line 63... Line -...
63
}
-
 
64
 
-
 
65
static void
-
 
66
assert_device_not_suspended(struct drm_i915_private *dev_priv)
-
 
67
{
-
 
68
	WARN_ONCE(HAS_RUNTIME_PM(dev_priv->dev) && dev_priv->pm.suspended,
-
 
69
		  "Device suspended\n");
-
 
70
}
51
}
71
 
52
 
72
static inline void
53
static inline void
73
fw_domain_reset(const struct intel_uncore_forcewake_domain *d)
54
fw_domain_reset(const struct intel_uncore_forcewake_domain *d)
74
{
55
{
75
	WARN_ON(d->reg_set == 0);
56
	WARN_ON(!i915_mmio_reg_valid(d->reg_set));
Line 76... Line 57...
76
	__raw_i915_write32(d->i915, d->reg_set, d->val_reset);
57
	__raw_i915_write32(d->i915, d->reg_set, d->val_reset);
77
}
58
}
Line 118... Line 99...
118
 
99
 
119
static inline void
100
static inline void
120
fw_domain_posting_read(const struct intel_uncore_forcewake_domain *d)
101
fw_domain_posting_read(const struct intel_uncore_forcewake_domain *d)
121
{
102
{
122
	/* something from same cacheline, but not from the set register */
103
	/* something from same cacheline, but not from the set register */
123
	if (d->reg_post)
104
	if (i915_mmio_reg_valid(d->reg_post))
124
		__raw_posting_read(d->i915, d->reg_post);
105
		__raw_posting_read(d->i915, d->reg_post);
Line 125... Line 106...
125
}
106
}
126
 
107
 
Line 248... Line 229...
248
static void intel_uncore_fw_release_timer(unsigned long arg)
229
static void intel_uncore_fw_release_timer(unsigned long arg)
249
{
230
{
250
	struct intel_uncore_forcewake_domain *domain = (void *)arg;
231
	struct intel_uncore_forcewake_domain *domain = (void *)arg;
251
	unsigned long irqflags;
232
	unsigned long irqflags;
Line 252... Line 233...
252
 
233
 
Line 253... Line 234...
253
	assert_device_not_suspended(domain->i915);
234
	assert_rpm_device_not_suspended(domain->i915);
254
 
235
 
255
	spin_lock_irqsave(&domain->i915->uncore.lock, irqflags);
236
	spin_lock_irqsave(&domain->i915->uncore.lock, irqflags);
Line 423... Line 404...
423
	unsigned long irqflags;
404
	unsigned long irqflags;
Line 424... Line 405...
424
 
405
 
425
	if (!dev_priv->uncore.funcs.force_wake_get)
406
	if (!dev_priv->uncore.funcs.force_wake_get)
Line 426... Line 407...
426
		return;
407
		return;
Line 427... Line 408...
427
 
408
 
428
	WARN_ON(dev_priv->pm.suspended);
409
	assert_rpm_wakelock_held(dev_priv);
429
 
410
 
430
	spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
411
	spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
Line 525... Line 506...
525
	for_each_fw_domain(domain, dev_priv, id)
506
	for_each_fw_domain(domain, dev_priv, id)
526
		WARN_ON(domain->wake_count);
507
		WARN_ON(domain->wake_count);
527
}
508
}
Line 528... Line 509...
528
 
509
 
529
/* We give fast paths for the really cool registers */
510
/* We give fast paths for the really cool registers */
530
#define NEEDS_FORCE_WAKE(reg) \
-
 
Line 531... Line 511...
531
	 ((reg) < 0x40000 && (reg) != FORCEWAKE)
511
#define NEEDS_FORCE_WAKE(reg) ((reg) < 0x40000)
Line 532... Line 512...
532
 
512
 
533
#define REG_RANGE(reg, start, end) ((reg) >= (start) && (reg) < (end))
513
#define REG_RANGE(reg, start, end) ((reg) >= (start) && (reg) < (end))
Line 605... Line 585...
605
	 * hence harmless to write 0 into. */
585
	 * hence harmless to write 0 into. */
606
	__raw_i915_write32(dev_priv, MI_MODE, 0);
586
	__raw_i915_write32(dev_priv, MI_MODE, 0);
607
}
587
}
Line 608... Line 588...
608
 
588
 
609
static void
589
static void
610
hsw_unclaimed_reg_debug(struct drm_i915_private *dev_priv, u32 reg, bool read,
590
hsw_unclaimed_reg_debug(struct drm_i915_private *dev_priv,
611
			bool before)
591
			i915_reg_t reg, bool read, bool before)
612
{
592
{
613
	const char *op = read ? "reading" : "writing to";
593
	const char *op = read ? "reading" : "writing to";
Line 614... Line 594...
614
	const char *when = before ? "before" : "after";
594
	const char *when = before ? "before" : "after";
615
 
595
 
Line 616... Line 596...
616
	if (!i915.mmio_debug)
596
	if (!i915.mmio_debug)
617
		return;
597
		return;
618
 
598
 
619
	if (__raw_i915_read32(dev_priv, FPGA_DBG) & FPGA_DBG_RM_NOCLAIM) {
599
	if (__raw_i915_read32(dev_priv, FPGA_DBG) & FPGA_DBG_RM_NOCLAIM) {
620
		WARN(1, "Unclaimed register detected %s %s register 0x%x\n",
600
		WARN(1, "Unclaimed register detected %s %s register 0x%x\n",
621
		     when, op, reg);
601
		     when, op, i915_mmio_reg_offset(reg));
622
		__raw_i915_write32(dev_priv, FPGA_DBG, FPGA_DBG_RM_NOCLAIM);
602
		__raw_i915_write32(dev_priv, FPGA_DBG, FPGA_DBG_RM_NOCLAIM);
Line 641... Line 621...
641
	}
621
	}
642
}
622
}
Line 643... Line 623...
643
 
623
 
644
#define GEN2_READ_HEADER(x) \
624
#define GEN2_READ_HEADER(x) \
645
	u##x val = 0; \
625
	u##x val = 0; \
Line 646... Line 626...
646
	assert_device_not_suspended(dev_priv);
626
	assert_rpm_wakelock_held(dev_priv);
647
 
627
 
648
#define GEN2_READ_FOOTER \
628
#define GEN2_READ_FOOTER \
Line 649... Line 629...
649
	trace_i915_reg_rw(false, reg, val, sizeof(val), trace); \
629
	trace_i915_reg_rw(false, reg, val, sizeof(val), trace); \
650
	return val
630
	return val
651
 
631
 
652
#define __gen2_read(x) \
632
#define __gen2_read(x) \
653
static u##x \
633
static u##x \
654
gen2_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \
634
gen2_read##x(struct drm_i915_private *dev_priv, i915_reg_t reg, bool trace) { \
655
	GEN2_READ_HEADER(x); \
635
	GEN2_READ_HEADER(x); \
Line 656... Line 636...
656
	val = __raw_i915_read##x(dev_priv, reg); \
636
	val = __raw_i915_read##x(dev_priv, reg); \
657
	GEN2_READ_FOOTER; \
637
	GEN2_READ_FOOTER; \
658
}
638
}
659
 
639
 
660
#define __gen5_read(x) \
640
#define __gen5_read(x) \
661
static u##x \
641
static u##x \
662
gen5_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \
642
gen5_read##x(struct drm_i915_private *dev_priv, i915_reg_t reg, bool trace) { \
663
	GEN2_READ_HEADER(x); \
643
	GEN2_READ_HEADER(x); \
Line 680... Line 660...
680
 
660
 
681
#undef GEN2_READ_FOOTER
661
#undef GEN2_READ_FOOTER
Line 682... Line 662...
682
#undef GEN2_READ_HEADER
662
#undef GEN2_READ_HEADER
-
 
663
 
683
 
664
#define GEN6_READ_HEADER(x) \
684
#define GEN6_READ_HEADER(x) \
665
	u32 offset = i915_mmio_reg_offset(reg); \
685
	unsigned long irqflags; \
666
	unsigned long irqflags; \
686
	u##x val = 0; \
667
	u##x val = 0; \
Line 687... Line 668...
687
	assert_device_not_suspended(dev_priv); \
668
	assert_rpm_wakelock_held(dev_priv); \
688
	spin_lock_irqsave(&dev_priv->uncore.lock, irqflags)
669
	spin_lock_irqsave(&dev_priv->uncore.lock, irqflags)
689
 
670
 
Line 714... Line 695...
714
 
695
 
715
	if (fw_domains)
696
	if (fw_domains)
716
		dev_priv->uncore.funcs.force_wake_get(dev_priv, fw_domains);
697
		dev_priv->uncore.funcs.force_wake_get(dev_priv, fw_domains);
Line 717... Line -...
717
}
-
 
718
 
-
 
719
#define __vgpu_read(x) \
-
 
720
static u##x \
-
 
721
vgpu_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \
-
 
722
	GEN6_READ_HEADER(x); \
-
 
723
	val = __raw_i915_read##x(dev_priv, reg); \
-
 
724
	GEN6_READ_FOOTER; \
-
 
725
}
698
}
726
 
699
 
727
#define __gen6_read(x) \
700
#define __gen6_read(x) \
728
static u##x \
701
static u##x \
729
gen6_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \
702
gen6_read##x(struct drm_i915_private *dev_priv, i915_reg_t reg, bool trace) { \
730
	GEN6_READ_HEADER(x); \
703
	GEN6_READ_HEADER(x); \
731
	hsw_unclaimed_reg_debug(dev_priv, reg, true, true); \
704
	hsw_unclaimed_reg_debug(dev_priv, reg, true, true); \
732
	if (NEEDS_FORCE_WAKE(reg)) \
705
	if (NEEDS_FORCE_WAKE(offset)) \
733
		__force_wake_get(dev_priv, FORCEWAKE_RENDER); \
706
		__force_wake_get(dev_priv, FORCEWAKE_RENDER); \
734
	val = __raw_i915_read##x(dev_priv, reg); \
707
	val = __raw_i915_read##x(dev_priv, reg); \
735
	hsw_unclaimed_reg_debug(dev_priv, reg, true, false); \
708
	hsw_unclaimed_reg_debug(dev_priv, reg, true, false); \
Line 736... Line 709...
736
	GEN6_READ_FOOTER; \
709
	GEN6_READ_FOOTER; \
737
}
710
}
738
 
711
 
-
 
712
#define __vlv_read(x) \
739
#define __vlv_read(x) \
713
static u##x \
-
 
714
vlv_read##x(struct drm_i915_private *dev_priv, i915_reg_t reg, bool trace) { \
-
 
715
	enum forcewake_domains fw_engine = 0; \
740
static u##x \
716
	GEN6_READ_HEADER(x); \
741
vlv_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \
717
	if (!NEEDS_FORCE_WAKE(offset)) \
742
	GEN6_READ_HEADER(x); \
718
		fw_engine = 0; \
-
 
719
	else if (FORCEWAKE_VLV_RENDER_RANGE_OFFSET(offset)) \
-
 
720
		fw_engine = FORCEWAKE_RENDER; \
743
	if (FORCEWAKE_VLV_RENDER_RANGE_OFFSET(reg)) \
721
	else if (FORCEWAKE_VLV_MEDIA_RANGE_OFFSET(offset)) \
744
		__force_wake_get(dev_priv, FORCEWAKE_RENDER); \
722
		fw_engine = FORCEWAKE_MEDIA; \
745
	else if (FORCEWAKE_VLV_MEDIA_RANGE_OFFSET(reg)) \
723
	if (fw_engine) \
746
		__force_wake_get(dev_priv, FORCEWAKE_MEDIA); \
724
		__force_wake_get(dev_priv, fw_engine); \
Line 747... Line 725...
747
	val = __raw_i915_read##x(dev_priv, reg); \
725
	val = __raw_i915_read##x(dev_priv, reg); \
748
	GEN6_READ_FOOTER; \
726
	GEN6_READ_FOOTER; \
749
}
727
}
-
 
728
 
750
 
729
#define __chv_read(x) \
-
 
730
static u##x \
-
 
731
chv_read##x(struct drm_i915_private *dev_priv, i915_reg_t reg, bool trace) { \
751
#define __chv_read(x) \
732
	enum forcewake_domains fw_engine = 0; \
752
static u##x \
733
	GEN6_READ_HEADER(x); \
753
chv_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \
734
	if (!NEEDS_FORCE_WAKE(offset)) \
754
	GEN6_READ_HEADER(x); \
735
		fw_engine = 0; \
755
	if (FORCEWAKE_CHV_RENDER_RANGE_OFFSET(reg)) \
736
	else if (FORCEWAKE_CHV_RENDER_RANGE_OFFSET(offset)) \
-
 
737
		fw_engine = FORCEWAKE_RENDER; \
756
		__force_wake_get(dev_priv, FORCEWAKE_RENDER); \
738
	else if (FORCEWAKE_CHV_MEDIA_RANGE_OFFSET(offset)) \
757
	else if (FORCEWAKE_CHV_MEDIA_RANGE_OFFSET(reg)) \
739
		fw_engine = FORCEWAKE_MEDIA; \
758
		__force_wake_get(dev_priv, FORCEWAKE_MEDIA); \
740
	else if (FORCEWAKE_CHV_COMMON_RANGE_OFFSET(offset)) \
759
	else if (FORCEWAKE_CHV_COMMON_RANGE_OFFSET(reg)) \
741
		fw_engine = FORCEWAKE_RENDER | FORCEWAKE_MEDIA; \
760
		__force_wake_get(dev_priv, \
742
	if (fw_engine) \
Line 761... Line 743...
761
				 FORCEWAKE_RENDER | FORCEWAKE_MEDIA); \
743
		__force_wake_get(dev_priv, fw_engine); \
762
	val = __raw_i915_read##x(dev_priv, reg); \
744
	val = __raw_i915_read##x(dev_priv, reg); \
Line 763... Line 745...
763
	GEN6_READ_FOOTER; \
745
	GEN6_READ_FOOTER; \
764
}
746
}
765
 
747
 
766
#define SKL_NEEDS_FORCE_WAKE(reg) \
748
#define SKL_NEEDS_FORCE_WAKE(reg) \
767
	 ((reg) < 0x40000 && !FORCEWAKE_GEN9_UNCORE_RANGE_OFFSET(reg))
749
	 ((reg) < 0x40000 && !FORCEWAKE_GEN9_UNCORE_RANGE_OFFSET(reg))
768
 
750
 
769
#define __gen9_read(x) \
751
#define __gen9_read(x) \
770
static u##x \
752
static u##x \
771
gen9_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \
753
gen9_read##x(struct drm_i915_private *dev_priv, i915_reg_t reg, bool trace) { \
772
	enum forcewake_domains fw_engine; \
754
	enum forcewake_domains fw_engine; \
773
	GEN6_READ_HEADER(x); \
755
	GEN6_READ_HEADER(x); \
774
	hsw_unclaimed_reg_debug(dev_priv, reg, true, true); \
756
	hsw_unclaimed_reg_debug(dev_priv, reg, true, true); \
775
	if (!SKL_NEEDS_FORCE_WAKE(reg)) \
757
	if (!SKL_NEEDS_FORCE_WAKE(offset)) \
776
		fw_engine = 0; \
758
		fw_engine = 0; \
777
	else if (FORCEWAKE_GEN9_RENDER_RANGE_OFFSET(reg)) \
759
	else if (FORCEWAKE_GEN9_RENDER_RANGE_OFFSET(offset)) \
778
		fw_engine = FORCEWAKE_RENDER; \
760
		fw_engine = FORCEWAKE_RENDER; \
779
	else if (FORCEWAKE_GEN9_MEDIA_RANGE_OFFSET(reg)) \
761
	else if (FORCEWAKE_GEN9_MEDIA_RANGE_OFFSET(offset)) \
780
		fw_engine = FORCEWAKE_MEDIA; \
762
		fw_engine = FORCEWAKE_MEDIA; \
781
	else if (FORCEWAKE_GEN9_COMMON_RANGE_OFFSET(reg)) \
763
	else if (FORCEWAKE_GEN9_COMMON_RANGE_OFFSET(offset)) \
782
		fw_engine = FORCEWAKE_RENDER | FORCEWAKE_MEDIA; \
764
		fw_engine = FORCEWAKE_RENDER | FORCEWAKE_MEDIA; \
783
	else \
765
	else \
784
		fw_engine = FORCEWAKE_BLITTER; \
766
		fw_engine = FORCEWAKE_BLITTER; \
Line 785... Line -...
785
	if (fw_engine) \
-
 
786
		__force_wake_get(dev_priv, fw_engine); \
-
 
787
	val = __raw_i915_read##x(dev_priv, reg); \
-
 
788
	hsw_unclaimed_reg_debug(dev_priv, reg, true, false); \
-
 
789
	GEN6_READ_FOOTER; \
767
	if (fw_engine) \
790
}
768
		__force_wake_get(dev_priv, fw_engine); \
791
 
769
	val = __raw_i915_read##x(dev_priv, reg); \
792
__vgpu_read(8)
770
	hsw_unclaimed_reg_debug(dev_priv, reg, true, false); \
793
__vgpu_read(16)
771
	GEN6_READ_FOOTER; \
Line 812... Line 790...
812
 
790
 
813
#undef __gen9_read
791
#undef __gen9_read
814
#undef __chv_read
792
#undef __chv_read
815
#undef __vlv_read
793
#undef __vlv_read
816
#undef __gen6_read
-
 
817
#undef __vgpu_read
794
#undef __gen6_read
818
#undef GEN6_READ_FOOTER
795
#undef GEN6_READ_FOOTER
Line -... Line 796...
-
 
796
#undef GEN6_READ_HEADER
-
 
797
 
-
 
798
#define VGPU_READ_HEADER(x) \
-
 
799
	unsigned long irqflags; \
-
 
800
	u##x val = 0; \
-
 
801
	assert_rpm_device_not_suspended(dev_priv); \
-
 
802
	spin_lock_irqsave(&dev_priv->uncore.lock, irqflags)
-
 
803
 
-
 
804
#define VGPU_READ_FOOTER \
-
 
805
	spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); \
-
 
806
	trace_i915_reg_rw(false, reg, val, sizeof(val), trace); \
-
 
807
	return val
-
 
808
 
-
 
809
#define __vgpu_read(x) \
-
 
810
static u##x \
-
 
811
vgpu_read##x(struct drm_i915_private *dev_priv, i915_reg_t reg, bool trace) { \
-
 
812
	VGPU_READ_HEADER(x); \
-
 
813
	val = __raw_i915_read##x(dev_priv, reg); \
-
 
814
	VGPU_READ_FOOTER; \
-
 
815
}
-
 
816
 
-
 
817
__vgpu_read(8)
-
 
818
__vgpu_read(16)
-
 
819
__vgpu_read(32)
-
 
820
__vgpu_read(64)
-
 
821
 
-
 
822
#undef __vgpu_read
-
 
823
#undef VGPU_READ_FOOTER
819
#undef GEN6_READ_HEADER
824
#undef VGPU_READ_HEADER
820
 
825
 
821
#define GEN2_WRITE_HEADER \
826
#define GEN2_WRITE_HEADER \
Line 822... Line 827...
822
	trace_i915_reg_rw(true, reg, val, sizeof(val), trace); \
827
	trace_i915_reg_rw(true, reg, val, sizeof(val), trace); \
Line 823... Line 828...
823
	assert_device_not_suspended(dev_priv); \
828
	assert_rpm_wakelock_held(dev_priv); \
824
 
829
 
825
#define GEN2_WRITE_FOOTER
830
#define GEN2_WRITE_FOOTER
826
 
831
 
827
#define __gen2_write(x) \
832
#define __gen2_write(x) \
828
static void \
833
static void \
829
gen2_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace) { \
834
gen2_write##x(struct drm_i915_private *dev_priv, i915_reg_t reg, u##x val, bool trace) { \
Line 830... Line 835...
830
	GEN2_WRITE_HEADER; \
835
	GEN2_WRITE_HEADER; \
831
	__raw_i915_write##x(dev_priv, reg, val); \
836
	__raw_i915_write##x(dev_priv, reg, val); \
832
	GEN2_WRITE_FOOTER; \
837
	GEN2_WRITE_FOOTER; \
833
}
838
}
834
 
839
 
835
#define __gen5_write(x) \
840
#define __gen5_write(x) \
836
static void \
841
static void \
837
gen5_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace) { \
842
gen5_write##x(struct drm_i915_private *dev_priv, i915_reg_t reg, u##x val, bool trace) { \
Line 855... Line 860...
855
 
860
 
856
#undef GEN2_WRITE_FOOTER
861
#undef GEN2_WRITE_FOOTER
Line 857... Line 862...
857
#undef GEN2_WRITE_HEADER
862
#undef GEN2_WRITE_HEADER
-
 
863
 
858
 
864
#define GEN6_WRITE_HEADER \
859
#define GEN6_WRITE_HEADER \
865
	u32 offset = i915_mmio_reg_offset(reg); \
860
	unsigned long irqflags; \
866
	unsigned long irqflags; \
861
	trace_i915_reg_rw(true, reg, val, sizeof(val), trace); \
867
	trace_i915_reg_rw(true, reg, val, sizeof(val), trace); \
Line 862... Line 868...
862
	assert_device_not_suspended(dev_priv); \
868
	assert_rpm_wakelock_held(dev_priv); \
863
	spin_lock_irqsave(&dev_priv->uncore.lock, irqflags)
869
	spin_lock_irqsave(&dev_priv->uncore.lock, irqflags)
Line 864... Line 870...
864
 
870
 
865
#define GEN6_WRITE_FOOTER \
871
#define GEN6_WRITE_FOOTER \
866
	spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags)
872
	spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags)
867
 
873
 
868
#define __gen6_write(x) \
874
#define __gen6_write(x) \
869
static void \
875
static void \
870
gen6_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace) { \
876
gen6_write##x(struct drm_i915_private *dev_priv, i915_reg_t reg, u##x val, bool trace) { \
871
	u32 __fifo_ret = 0; \
877
	u32 __fifo_ret = 0; \
872
	GEN6_WRITE_HEADER; \
878
	GEN6_WRITE_HEADER; \
873
	if (NEEDS_FORCE_WAKE(reg)) { \
879
	if (NEEDS_FORCE_WAKE(offset)) { \
874
		__fifo_ret = __gen6_gt_wait_for_fifo(dev_priv); \
880
		__fifo_ret = __gen6_gt_wait_for_fifo(dev_priv); \
Line 880... Line 886...
880
	GEN6_WRITE_FOOTER; \
886
	GEN6_WRITE_FOOTER; \
881
}
887
}
Line 882... Line 888...
882
 
888
 
883
#define __hsw_write(x) \
889
#define __hsw_write(x) \
884
static void \
890
static void \
885
hsw_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace) { \
891
hsw_write##x(struct drm_i915_private *dev_priv, i915_reg_t reg, u##x val, bool trace) { \
886
	u32 __fifo_ret = 0; \
892
	u32 __fifo_ret = 0; \
887
	GEN6_WRITE_HEADER; \
893
	GEN6_WRITE_HEADER; \
888
	if (NEEDS_FORCE_WAKE(reg)) { \
894
	if (NEEDS_FORCE_WAKE(offset)) { \
889
		__fifo_ret = __gen6_gt_wait_for_fifo(dev_priv); \
895
		__fifo_ret = __gen6_gt_wait_for_fifo(dev_priv); \
890
	} \
896
	} \
891
	hsw_unclaimed_reg_debug(dev_priv, reg, false, true); \
897
	hsw_unclaimed_reg_debug(dev_priv, reg, false, true); \
892
	__raw_i915_write##x(dev_priv, reg, val); \
898
	__raw_i915_write##x(dev_priv, reg, val); \
Line 896... Line 902...
896
	hsw_unclaimed_reg_debug(dev_priv, reg, false, false); \
902
	hsw_unclaimed_reg_debug(dev_priv, reg, false, false); \
897
	hsw_unclaimed_reg_detect(dev_priv); \
903
	hsw_unclaimed_reg_detect(dev_priv); \
898
	GEN6_WRITE_FOOTER; \
904
	GEN6_WRITE_FOOTER; \
899
}
905
}
Line 900... Line -...
900
 
-
 
901
#define __vgpu_write(x) \
-
 
902
static void vgpu_write##x(struct drm_i915_private *dev_priv, \
-
 
903
			  off_t reg, u##x val, bool trace) { \
-
 
904
	GEN6_WRITE_HEADER; \
-
 
905
	__raw_i915_write##x(dev_priv, reg, val); \
-
 
906
	GEN6_WRITE_FOOTER; \
-
 
907
}
-
 
908
 
906
 
909
static const u32 gen8_shadowed_regs[] = {
907
static const i915_reg_t gen8_shadowed_regs[] = {
910
	FORCEWAKE_MT,
908
	FORCEWAKE_MT,
911
	GEN6_RPNSWREQ,
909
	GEN6_RPNSWREQ,
912
	GEN6_RC_VIDEO_FREQ,
910
	GEN6_RC_VIDEO_FREQ,
913
	RING_TAIL(RENDER_RING_BASE),
911
	RING_TAIL(RENDER_RING_BASE),
914
	RING_TAIL(GEN6_BSD_RING_BASE),
912
	RING_TAIL(GEN6_BSD_RING_BASE),
915
	RING_TAIL(VEBOX_RING_BASE),
913
	RING_TAIL(VEBOX_RING_BASE),
916
	RING_TAIL(BLT_RING_BASE),
914
	RING_TAIL(BLT_RING_BASE),
917
	/* TODO: Other registers are not yet used */
915
	/* TODO: Other registers are not yet used */
Line 918... Line 916...
918
};
916
};
-
 
917
 
919
 
918
static bool is_gen8_shadowed(struct drm_i915_private *dev_priv,
920
static bool is_gen8_shadowed(struct drm_i915_private *dev_priv, u32 reg)
919
			     i915_reg_t reg)
921
{
920
{
922
	int i;
921
	int i;
923
	for (i = 0; i < ARRAY_SIZE(gen8_shadowed_regs); i++)
922
	for (i = 0; i < ARRAY_SIZE(gen8_shadowed_regs); i++)
Line 924... Line 923...
924
		if (reg == gen8_shadowed_regs[i])
923
		if (i915_mmio_reg_equal(reg, gen8_shadowed_regs[i]))
925
			return true;
924
			return true;
Line 926... Line 925...
926
 
925
 
927
	return false;
926
	return false;
928
}
927
}
929
 
928
 
930
#define __gen8_write(x) \
929
#define __gen8_write(x) \
931
static void \
930
static void \
932
gen8_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace) { \
931
gen8_write##x(struct drm_i915_private *dev_priv, i915_reg_t reg, u##x val, bool trace) { \
933
	GEN6_WRITE_HEADER; \
932
	GEN6_WRITE_HEADER; \
934
	hsw_unclaimed_reg_debug(dev_priv, reg, false, true); \
933
	hsw_unclaimed_reg_debug(dev_priv, reg, false, true); \
935
	if (reg < 0x40000 && !is_gen8_shadowed(dev_priv, reg)) \
934
	if (NEEDS_FORCE_WAKE(offset) && !is_gen8_shadowed(dev_priv, reg)) \
936
		__force_wake_get(dev_priv, FORCEWAKE_RENDER); \
935
		__force_wake_get(dev_priv, FORCEWAKE_RENDER); \
937
	__raw_i915_write##x(dev_priv, reg, val); \
936
	__raw_i915_write##x(dev_priv, reg, val); \
Line 938... Line 937...
938
	hsw_unclaimed_reg_debug(dev_priv, reg, false, false); \
937
	hsw_unclaimed_reg_debug(dev_priv, reg, false, false); \
939
	hsw_unclaimed_reg_detect(dev_priv); \
938
	hsw_unclaimed_reg_detect(dev_priv); \
940
	GEN6_WRITE_FOOTER; \
939
	GEN6_WRITE_FOOTER; \
941
}
940
}
942
 
941
 
-
 
942
#define __chv_write(x) \
-
 
943
static void \
943
#define __chv_write(x) \
944
chv_write##x(struct drm_i915_private *dev_priv, i915_reg_t reg, u##x val, bool trace) { \
944
static void \
945
	enum forcewake_domains fw_engine = 0; \
945
chv_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace) { \
946
	GEN6_WRITE_HEADER; \
946
	bool shadowed = is_gen8_shadowed(dev_priv, reg); \
947
	if (!NEEDS_FORCE_WAKE(offset) || \
947
	GEN6_WRITE_HEADER; \
948
	    is_gen8_shadowed(dev_priv, reg)) \
948
	if (!shadowed) { \
949
		fw_engine = 0; \
949
		if (FORCEWAKE_CHV_RENDER_RANGE_OFFSET(reg)) \
950
	else if (FORCEWAKE_CHV_RENDER_RANGE_OFFSET(offset)) \
950
			__force_wake_get(dev_priv, FORCEWAKE_RENDER); \
951
		fw_engine = FORCEWAKE_RENDER; \
-
 
952
	else if (FORCEWAKE_CHV_MEDIA_RANGE_OFFSET(offset)) \
951
		else if (FORCEWAKE_CHV_MEDIA_RANGE_OFFSET(reg)) \
953
		fw_engine = FORCEWAKE_MEDIA; \
952
			__force_wake_get(dev_priv, FORCEWAKE_MEDIA); \
954
	else if (FORCEWAKE_CHV_COMMON_RANGE_OFFSET(offset)) \
953
		else if (FORCEWAKE_CHV_COMMON_RANGE_OFFSET(reg)) \
955
		fw_engine = FORCEWAKE_RENDER | FORCEWAKE_MEDIA; \
Line 954... Line 956...
954
			__force_wake_get(dev_priv, FORCEWAKE_RENDER | FORCEWAKE_MEDIA); \
956
	if (fw_engine) \
955
	} \
957
		__force_wake_get(dev_priv, fw_engine); \
956
	__raw_i915_write##x(dev_priv, reg, val); \
958
	__raw_i915_write##x(dev_priv, reg, val); \
957
	GEN6_WRITE_FOOTER; \
959
	GEN6_WRITE_FOOTER; \
958
}
960
}
959
 
961
 
Line 968... Line 970...
968
	GEN6_RPNSWREQ,
970
	GEN6_RPNSWREQ,
969
	GEN6_RC_VIDEO_FREQ,
971
	GEN6_RC_VIDEO_FREQ,
970
	/* TODO: Other registers are not yet used */
972
	/* TODO: Other registers are not yet used */
971
};
973
};
Line 972... Line 974...
972
 
974
 
-
 
975
static bool is_gen9_shadowed(struct drm_i915_private *dev_priv,
973
static bool is_gen9_shadowed(struct drm_i915_private *dev_priv, u32 reg)
976
			     i915_reg_t reg)
974
{
977
{
975
	int i;
978
	int i;
976
	for (i = 0; i < ARRAY_SIZE(gen9_shadowed_regs); i++)
979
	for (i = 0; i < ARRAY_SIZE(gen9_shadowed_regs); i++)
977
		if (reg == gen9_shadowed_regs[i])
980
		if (i915_mmio_reg_equal(reg, gen9_shadowed_regs[i]))
Line 978... Line 981...
978
			return true;
981
			return true;
979
 
982
 
Line 980... Line 983...
980
	return false;
983
	return false;
981
}
984
}
982
 
985
 
983
#define __gen9_write(x) \
986
#define __gen9_write(x) \
984
static void \
987
static void \
985
gen9_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, \
988
gen9_write##x(struct drm_i915_private *dev_priv, i915_reg_t reg, u##x val, \
986
		bool trace) { \
989
		bool trace) { \
987
	enum forcewake_domains fw_engine; \
990
	enum forcewake_domains fw_engine; \
988
	GEN6_WRITE_HEADER; \
991
	GEN6_WRITE_HEADER; \
989
	hsw_unclaimed_reg_debug(dev_priv, reg, false, true); \
992
	hsw_unclaimed_reg_debug(dev_priv, reg, false, true); \
990
	if (!SKL_NEEDS_FORCE_WAKE(reg) || \
993
	if (!SKL_NEEDS_FORCE_WAKE(offset) || \
991
	    is_gen9_shadowed(dev_priv, reg)) \
994
	    is_gen9_shadowed(dev_priv, reg)) \
992
		fw_engine = 0; \
995
		fw_engine = 0; \
993
	else if (FORCEWAKE_GEN9_RENDER_RANGE_OFFSET(reg)) \
996
	else if (FORCEWAKE_GEN9_RENDER_RANGE_OFFSET(offset)) \
994
		fw_engine = FORCEWAKE_RENDER; \
997
		fw_engine = FORCEWAKE_RENDER; \
995
	else if (FORCEWAKE_GEN9_MEDIA_RANGE_OFFSET(reg)) \
998
	else if (FORCEWAKE_GEN9_MEDIA_RANGE_OFFSET(offset)) \
996
		fw_engine = FORCEWAKE_MEDIA; \
999
		fw_engine = FORCEWAKE_MEDIA; \
997
	else if (FORCEWAKE_GEN9_COMMON_RANGE_OFFSET(reg)) \
1000
	else if (FORCEWAKE_GEN9_COMMON_RANGE_OFFSET(offset)) \
998
		fw_engine = FORCEWAKE_RENDER | FORCEWAKE_MEDIA; \
1001
		fw_engine = FORCEWAKE_RENDER | FORCEWAKE_MEDIA; \
999
	else \
1002
	else \
Line 1024... Line 1027...
1024
__hsw_write(64)
1027
__hsw_write(64)
1025
__gen6_write(8)
1028
__gen6_write(8)
1026
__gen6_write(16)
1029
__gen6_write(16)
1027
__gen6_write(32)
1030
__gen6_write(32)
1028
__gen6_write(64)
1031
__gen6_write(64)
1029
__vgpu_write(8)
-
 
1030
__vgpu_write(16)
-
 
1031
__vgpu_write(32)
-
 
1032
__vgpu_write(64)
-
 
Line 1033... Line 1032...
1033
 
1032
 
1034
#undef __gen9_write
1033
#undef __gen9_write
1035
#undef __chv_write
1034
#undef __chv_write
1036
#undef __gen8_write
1035
#undef __gen8_write
1037
#undef __hsw_write
1036
#undef __hsw_write
1038
#undef __gen6_write
-
 
1039
#undef __vgpu_write
1037
#undef __gen6_write
1040
#undef GEN6_WRITE_FOOTER
1038
#undef GEN6_WRITE_FOOTER
Line -... Line 1039...
-
 
1039
#undef GEN6_WRITE_HEADER
-
 
1040
 
-
 
1041
#define VGPU_WRITE_HEADER \
-
 
1042
	unsigned long irqflags; \
-
 
1043
	trace_i915_reg_rw(true, reg, val, sizeof(val), trace); \
-
 
1044
	assert_rpm_device_not_suspended(dev_priv); \
-
 
1045
	spin_lock_irqsave(&dev_priv->uncore.lock, irqflags)
-
 
1046
 
-
 
1047
#define VGPU_WRITE_FOOTER \
-
 
1048
	spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags)
-
 
1049
 
-
 
1050
#define __vgpu_write(x) \
-
 
1051
static void vgpu_write##x(struct drm_i915_private *dev_priv, \
-
 
1052
			  i915_reg_t reg, u##x val, bool trace) { \
-
 
1053
	VGPU_WRITE_HEADER; \
-
 
1054
	__raw_i915_write##x(dev_priv, reg, val); \
-
 
1055
	VGPU_WRITE_FOOTER; \
-
 
1056
}
-
 
1057
 
-
 
1058
__vgpu_write(8)
-
 
1059
__vgpu_write(16)
-
 
1060
__vgpu_write(32)
-
 
1061
__vgpu_write(64)
-
 
1062
 
-
 
1063
#undef __vgpu_write
-
 
1064
#undef VGPU_WRITE_FOOTER
1041
#undef GEN6_WRITE_HEADER
1065
#undef VGPU_WRITE_HEADER
1042
 
1066
 
1043
#define ASSIGN_WRITE_MMIO_VFUNCS(x) \
1067
#define ASSIGN_WRITE_MMIO_VFUNCS(x) \
1044
do { \
1068
do { \
1045
	dev_priv->uncore.funcs.mmio_writeb = x##_write8; \
1069
	dev_priv->uncore.funcs.mmio_writeb = x##_write8; \
Line 1057... Line 1081...
1057
} while (0)
1081
} while (0)
Line 1058... Line 1082...
1058
 
1082
 
1059
 
1083
 
-
 
1084
static void fw_domain_init(struct drm_i915_private *dev_priv,
1060
static void fw_domain_init(struct drm_i915_private *dev_priv,
1085
			   enum forcewake_domain_id domain_id,
1061
			   enum forcewake_domain_id domain_id,
1086
			   i915_reg_t reg_set,
1062
			   u32 reg_set, u32 reg_ack)
1087
			   i915_reg_t reg_ack)
Line 1063... Line 1088...
1063
{
1088
{
1064
	struct intel_uncore_forcewake_domain *d;
1089
	struct intel_uncore_forcewake_domain *d;
Line 1083... Line 1108...
1083
		d->val_reset = _MASKED_BIT_DISABLE(0xffff);
1108
		d->val_reset = _MASKED_BIT_DISABLE(0xffff);
1084
		d->val_set = _MASKED_BIT_ENABLE(FORCEWAKE_KERNEL);
1109
		d->val_set = _MASKED_BIT_ENABLE(FORCEWAKE_KERNEL);
1085
		d->val_clear = _MASKED_BIT_DISABLE(FORCEWAKE_KERNEL);
1110
		d->val_clear = _MASKED_BIT_DISABLE(FORCEWAKE_KERNEL);
1086
	}
1111
	}
Line 1087... Line 1112...
1087
 
1112
 
1088
	if (IS_VALLEYVIEW(dev_priv))
1113
	if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
1089
		d->reg_post = FORCEWAKE_ACK_VLV;
1114
		d->reg_post = FORCEWAKE_ACK_VLV;
1090
	else if (IS_GEN6(dev_priv) || IS_GEN7(dev_priv) || IS_GEN8(dev_priv))
1115
	else if (IS_GEN6(dev_priv) || IS_GEN7(dev_priv) || IS_GEN8(dev_priv))
1091
		d->reg_post = ECOBUS;
-
 
1092
	else
-
 
Line 1093... Line 1116...
1093
		d->reg_post = 0;
1116
		d->reg_post = ECOBUS;
1094
 
1117
 
Line 1095... Line 1118...
1095
	d->i915 = dev_priv;
1118
	d->i915 = dev_priv;
Line 1118... Line 1141...
1118
		fw_domain_init(dev_priv, FW_DOMAIN_ID_BLITTER,
1141
		fw_domain_init(dev_priv, FW_DOMAIN_ID_BLITTER,
1119
			       FORCEWAKE_BLITTER_GEN9,
1142
			       FORCEWAKE_BLITTER_GEN9,
1120
			       FORCEWAKE_ACK_BLITTER_GEN9);
1143
			       FORCEWAKE_ACK_BLITTER_GEN9);
1121
		fw_domain_init(dev_priv, FW_DOMAIN_ID_MEDIA,
1144
		fw_domain_init(dev_priv, FW_DOMAIN_ID_MEDIA,
1122
			       FORCEWAKE_MEDIA_GEN9, FORCEWAKE_ACK_MEDIA_GEN9);
1145
			       FORCEWAKE_MEDIA_GEN9, FORCEWAKE_ACK_MEDIA_GEN9);
1123
	} else if (IS_VALLEYVIEW(dev)) {
1146
	} else if (IS_VALLEYVIEW(dev) || IS_CHERRYVIEW(dev)) {
1124
		dev_priv->uncore.funcs.force_wake_get = fw_domains_get;
1147
		dev_priv->uncore.funcs.force_wake_get = fw_domains_get;
1125
		if (!IS_CHERRYVIEW(dev))
1148
		if (!IS_CHERRYVIEW(dev))
1126
			dev_priv->uncore.funcs.force_wake_put =
1149
			dev_priv->uncore.funcs.force_wake_put =
1127
				fw_domains_put_with_fifo;
1150
				fw_domains_put_with_fifo;
1128
		else
1151
		else
Line 1266... Line 1289...
1266
}
1289
}
Line 1267... Line 1290...
1267
 
1290
 
Line 1268... Line 1291...
1268
#define GEN_RANGE(l, h) GENMASK(h, l)
1291
#define GEN_RANGE(l, h) GENMASK(h, l)
1269
 
1292
 
1270
static const struct register_whitelist {
1293
static const struct register_whitelist {
1271
	uint64_t offset;
1294
	i915_reg_t offset_ldw, offset_udw;
1272
	uint32_t size;
1295
	uint32_t size;
1273
	/* supported gens, 0x10 for 4, 0x30 for 4 and 5, etc. */
1296
	/* supported gens, 0x10 for 4, 0x30 for 4 and 5, etc. */
-
 
1297
	uint32_t gen_bitmask;
-
 
1298
} whitelist[] = {
1274
	uint32_t gen_bitmask;
1299
	{ .offset_ldw = RING_TIMESTAMP(RENDER_RING_BASE),
1275
} whitelist[] = {
1300
	  .offset_udw = RING_TIMESTAMP_UDW(RENDER_RING_BASE),
Line 1276... Line 1301...
1276
	{ RING_TIMESTAMP(RENDER_RING_BASE), 8, GEN_RANGE(4, 9) },
1301
	  .size = 8, .gen_bitmask = GEN_RANGE(4, 9) },
1277
};
1302
};
1278
 
1303
 
1279
int i915_reg_read_ioctl(struct drm_device *dev,
1304
int i915_reg_read_ioctl(struct drm_device *dev,
1280
			void *data, struct drm_file *file)
1305
			void *data, struct drm_file *file)
1281
{
1306
{
1282
	struct drm_i915_private *dev_priv = dev->dev_private;
1307
	struct drm_i915_private *dev_priv = dev->dev_private;
1283
	struct drm_i915_reg_read *reg = data;
1308
	struct drm_i915_reg_read *reg = data;
1284
	struct register_whitelist const *entry = whitelist;
1309
	struct register_whitelist const *entry = whitelist;
Line 1285... Line 1310...
1285
	unsigned size;
1310
	unsigned size;
1286
	u64 offset;
1311
	i915_reg_t offset_ldw, offset_udw;
1287
	int i, ret = 0;
1312
	int i, ret = 0;
1288
 
1313
 
1289
	for (i = 0; i < ARRAY_SIZE(whitelist); i++, entry++) {
1314
	for (i = 0; i < ARRAY_SIZE(whitelist); i++, entry++) {
Line 1290... Line 1315...
1290
		if (entry->offset == (reg->offset & -entry->size) &&
1315
		if (i915_mmio_reg_offset(entry->offset_ldw) == (reg->offset & -entry->size) &&
Line 1297... Line 1322...
1297
 
1322
 
1298
	/* We use the low bits to encode extra flags as the register should
1323
	/* We use the low bits to encode extra flags as the register should
1299
	 * be naturally aligned (and those that are not so aligned merely
1324
	 * be naturally aligned (and those that are not so aligned merely
1300
	 * limit the available flags for that register).
1325
	 * limit the available flags for that register).
-
 
1326
	 */
1301
	 */
1327
	offset_ldw = entry->offset_ldw;
1302
	offset = entry->offset;
1328
	offset_udw = entry->offset_udw;
1303
	size = entry->size;
1329
	size = entry->size;
Line 1304... Line 1330...
1304
	size |= reg->offset ^ offset;
1330
	size |= reg->offset ^ i915_mmio_reg_offset(offset_ldw);
Line 1305... Line 1331...
1305
 
1331
 
1306
	intel_runtime_pm_get(dev_priv);
1332
	intel_runtime_pm_get(dev_priv);
1307
 
1333
 
1308
	switch (size) {
1334
	switch (size) {
1309
	case 8 | 1:
1335
	case 8 | 1:
1310
		reg->val = I915_READ64_2x32(offset, offset+4);
1336
		reg->val = I915_READ64_2x32(offset_ldw, offset_udw);
1311
		break;
1337
		break;
1312
	case 8:
1338
	case 8:
1313
		reg->val = I915_READ64(offset);
1339
		reg->val = I915_READ64(offset_ldw);
1314
		break;
1340
		break;
1315
	case 4:
1341
	case 4:
1316
		reg->val = I915_READ(offset);
1342
		reg->val = I915_READ(offset_ldw);
1317
		break;
1343
		break;
1318
	case 2:
1344
	case 2:
1319
		reg->val = I915_READ16(offset);
1345
		reg->val = I915_READ16(offset_ldw);
1320
		break;
1346
		break;
1321
	case 1:
1347
	case 1:
1322
		reg->val = I915_READ8(offset);
1348
		reg->val = I915_READ8(offset_ldw);
1323
		break;
1349
		break;
1324
	default:
1350
	default:
Line 1341... Line 1367...
1341
	int ret;
1367
	int ret;
Line 1342... Line 1368...
1342
 
1368
 
1343
	if (args->flags || args->pad)
1369
	if (args->flags || args->pad)
Line -... Line 1370...
-
 
1370
		return -EINVAL;
-
 
1371
 
-
 
1372
	if (args->ctx_id == DEFAULT_CONTEXT_HANDLE && !capable(CAP_SYS_ADMIN))
1344
		return -EINVAL;
1373
		return -EPERM;
1345
 
1374
 
1346
	ret = mutex_lock_interruptible(&dev->struct_mutex);
1375
	ret = mutex_lock_interruptible(&dev->struct_mutex);
Line 1347... Line 1376...
1347
	if (ret)
1376
	if (ret)
Line 1352... Line 1381...
1352
		mutex_unlock(&dev->struct_mutex);
1381
		mutex_unlock(&dev->struct_mutex);
1353
		return PTR_ERR(ctx);
1382
		return PTR_ERR(ctx);
1354
	}
1383
	}
1355
	hs = &ctx->hang_stats;
1384
	hs = &ctx->hang_stats;
Line -... Line 1385...
-
 
1385
 
1356
 
1386
	if (capable(CAP_SYS_ADMIN))
-
 
1387
    args->reset_count = i915_reset_count(&dev_priv->gpu_error);
-
 
1388
	else
Line 1357... Line 1389...
1357
    args->reset_count = i915_reset_count(&dev_priv->gpu_error);
1389
		args->reset_count = 0;
1358
 
1390
 
Line 1359... Line 1391...
1359
	args->batch_active = hs->batch_active;
1391
	args->batch_active = hs->batch_active;
Line 1468... Line 1500...
1468
 
1500
 
1469
	return ret;
1501
	return ret;
Line 1470... Line 1502...
1470
}
1502
}
1471
 
1503
 
1472
static int wait_for_register(struct drm_i915_private *dev_priv,
1504
static int wait_for_register(struct drm_i915_private *dev_priv,
1473
			     const u32 reg,
1505
			     i915_reg_t reg,
1474
			     const u32 mask,
1506
			     const u32 mask,
1475
			     const u32 value,
1507
			     const u32 value,
1476
			     const unsigned long timeout_ms)
1508
			     const unsigned long timeout_ms)