Subversion Repositories Kolibri OS

Rev

Rev 6937 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 6937 Rev 7144
Line 327... Line 327...
327
		dev_priv->ellc_size = 128;
327
		dev_priv->ellc_size = 128;
328
		DRM_INFO("Found %zuMB of eLLC\n", dev_priv->ellc_size);
328
		DRM_INFO("Found %zuMB of eLLC\n", dev_priv->ellc_size);
329
	}
329
	}
330
}
330
}
Line -... Line 331...
-
 
331
 
-
 
332
static bool
-
 
333
fpga_check_for_unclaimed_mmio(struct drm_i915_private *dev_priv)
-
 
334
{
-
 
335
	u32 dbg;
-
 
336
 
-
 
337
	dbg = __raw_i915_read32(dev_priv, FPGA_DBG);
-
 
338
	if (likely(!(dbg & FPGA_DBG_RM_NOCLAIM)))
-
 
339
		return false;
-
 
340
 
-
 
341
	__raw_i915_write32(dev_priv, FPGA_DBG, FPGA_DBG_RM_NOCLAIM);
-
 
342
 
-
 
343
	return true;
-
 
344
}
-
 
345
 
-
 
346
static bool
-
 
347
vlv_check_for_unclaimed_mmio(struct drm_i915_private *dev_priv)
-
 
348
{
-
 
349
	u32 cer;
-
 
350
 
-
 
351
	cer = __raw_i915_read32(dev_priv, CLAIM_ER);
-
 
352
	if (likely(!(cer & (CLAIM_ER_OVERFLOW | CLAIM_ER_CTR_MASK))))
-
 
353
		return false;
-
 
354
 
-
 
355
	__raw_i915_write32(dev_priv, CLAIM_ER, CLAIM_ER_CLR);
-
 
356
 
-
 
357
	return true;
-
 
358
}
-
 
359
 
-
 
360
static bool
-
 
361
check_for_unclaimed_mmio(struct drm_i915_private *dev_priv)
-
 
362
{
-
 
363
	if (HAS_FPGA_DBG_UNCLAIMED(dev_priv))
-
 
364
		return fpga_check_for_unclaimed_mmio(dev_priv);
-
 
365
 
-
 
366
	if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
-
 
367
		return vlv_check_for_unclaimed_mmio(dev_priv);
-
 
368
 
-
 
369
	return false;
-
 
370
}
331
 
371
 
332
static void __intel_uncore_early_sanitize(struct drm_device *dev,
372
static void __intel_uncore_early_sanitize(struct drm_device *dev,
333
					  bool restore_forcewake)
373
					  bool restore_forcewake)
334
{
374
{
Line -... Line 375...
-
 
375
	struct drm_i915_private *dev_priv = dev->dev_private;
335
	struct drm_i915_private *dev_priv = dev->dev_private;
376
 
336
 
377
	/* clear out unclaimed reg detection bit */
Line 337... Line 378...
337
	if (HAS_FPGA_DBG_UNCLAIMED(dev))
378
	if (check_for_unclaimed_mmio(dev_priv))
338
		__raw_i915_write32(dev_priv, FPGA_DBG, FPGA_DBG_RM_NOCLAIM);
379
		DRM_DEBUG("unclaimed mmio detected on uncore init, clearing\n");
339
 
380
 
340
	/* clear out old GT FIFO errors */
381
	/* clear out old GT FIFO errors */
Line 359... Line 400...
359
	i915_check_and_clear_faults(dev);
400
	i915_check_and_clear_faults(dev);
360
}
401
}
Line 361... Line 402...
361
 
402
 
362
void intel_uncore_sanitize(struct drm_device *dev)
403
void intel_uncore_sanitize(struct drm_device *dev)
-
 
404
{
-
 
405
	i915.enable_rc6 = sanitize_rc6_option(dev, i915.enable_rc6);
363
{
406
 
364
	/* BIOS often leaves RC6 enabled, but disable it for hw init */
407
	/* BIOS often leaves RC6 enabled, but disable it for hw init */
365
	intel_disable_gt_powersave(dev);
408
	intel_disable_gt_powersave(dev);
Line 366... Line 409...
366
}
409
}
Line 585... Line 628...
585
	 * hence harmless to write 0 into. */
628
	 * hence harmless to write 0 into. */
586
	__raw_i915_write32(dev_priv, MI_MODE, 0);
629
	__raw_i915_write32(dev_priv, MI_MODE, 0);
587
}
630
}
Line 588... Line 631...
588
 
631
 
589
static void
632
static void
-
 
633
__unclaimed_reg_debug(struct drm_i915_private *dev_priv,
-
 
634
		      const i915_reg_t reg,
590
hsw_unclaimed_reg_debug(struct drm_i915_private *dev_priv,
635
		      const bool read,
591
			i915_reg_t reg, bool read, bool before)
636
		      const bool before)
592
{
637
{
-
 
638
	/* XXX. We limit the auto arming traces for mmio
-
 
639
	 * debugs on these platforms. There are just too many
593
	const char *op = read ? "reading" : "writing to";
640
	 * revealed by these and CI/Bat suffers from the noise.
594
	const char *when = before ? "before" : "after";
641
	 * Please fix and then re-enable the automatic traces.
595
 
642
	 */
-
 
643
	if (i915.mmio_debug < 2 &&
596
	if (!i915.mmio_debug)
644
	    (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)))
Line 597... Line 645...
597
		return;
645
		return;
598
 
646
 
599
	if (__raw_i915_read32(dev_priv, FPGA_DBG) & FPGA_DBG_RM_NOCLAIM) {
647
	if (WARN(check_for_unclaimed_mmio(dev_priv),
-
 
648
		 "Unclaimed register detected %s %s register 0x%x\n",
600
		WARN(1, "Unclaimed register detected %s %s register 0x%x\n",
649
		 before ? "before" : "after",
601
		     when, op, i915_mmio_reg_offset(reg));
650
		 read ? "reading" : "writing to",
602
		__raw_i915_write32(dev_priv, FPGA_DBG, FPGA_DBG_RM_NOCLAIM);
651
		 i915_mmio_reg_offset(reg)))
603
		i915.mmio_debug--; /* Only report the first N failures */
-
 
Line 604... Line 652...
604
	}
652
		i915.mmio_debug--; /* Only report the first N failures */
605
}
653
}
-
 
654
 
-
 
655
static inline void
-
 
656
unclaimed_reg_debug(struct drm_i915_private *dev_priv,
606
 
657
		    const i915_reg_t reg,
607
static void
-
 
608
hsw_unclaimed_reg_detect(struct drm_i915_private *dev_priv)
-
 
609
{
658
		    const bool read,
610
	static bool mmio_debug_once = true;
659
		    const bool before)
Line 611... Line -...
611
 
-
 
612
	if (i915.mmio_debug || !mmio_debug_once)
-
 
613
		return;
-
 
614
 
-
 
615
	if (__raw_i915_read32(dev_priv, FPGA_DBG) & FPGA_DBG_RM_NOCLAIM) {
660
{
616
		DRM_DEBUG("Unclaimed register detected, "
-
 
617
			  "enabling oneshot unclaimed register reporting. "
-
 
618
			  "Please use i915.mmio_debug=N for more information.\n");
661
	if (likely(!i915.mmio_debug))
Line 619... Line 662...
619
		__raw_i915_write32(dev_priv, FPGA_DBG, FPGA_DBG_RM_NOCLAIM);
662
		return;
620
		i915.mmio_debug = mmio_debug_once--;
663
 
621
	}
664
	__unclaimed_reg_debug(dev_priv, reg, read, before);
Line 664... Line 707...
664
#define GEN6_READ_HEADER(x) \
707
#define GEN6_READ_HEADER(x) \
665
	u32 offset = i915_mmio_reg_offset(reg); \
708
	u32 offset = i915_mmio_reg_offset(reg); \
666
	unsigned long irqflags; \
709
	unsigned long irqflags; \
667
	u##x val = 0; \
710
	u##x val = 0; \
668
	assert_rpm_wakelock_held(dev_priv); \
711
	assert_rpm_wakelock_held(dev_priv); \
669
	spin_lock_irqsave(&dev_priv->uncore.lock, irqflags)
712
	spin_lock_irqsave(&dev_priv->uncore.lock, irqflags); \
-
 
713
	unclaimed_reg_debug(dev_priv, reg, true, true)
Line 670... Line 714...
670
 
714
 
-
 
715
#define GEN6_READ_FOOTER \
671
#define GEN6_READ_FOOTER \
716
	unclaimed_reg_debug(dev_priv, reg, true, false); \
672
	spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); \
717
	spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); \
673
	trace_i915_reg_rw(false, reg, val, sizeof(val), trace); \
718
	trace_i915_reg_rw(false, reg, val, sizeof(val), trace); \
Line 674... Line 719...
674
	return val
719
	return val
Line 699... Line 744...
699
 
744
 
700
#define __gen6_read(x) \
745
#define __gen6_read(x) \
701
static u##x \
746
static u##x \
702
gen6_read##x(struct drm_i915_private *dev_priv, i915_reg_t reg, bool trace) { \
747
gen6_read##x(struct drm_i915_private *dev_priv, i915_reg_t reg, bool trace) { \
703
	GEN6_READ_HEADER(x); \
-
 
704
	hsw_unclaimed_reg_debug(dev_priv, reg, true, true); \
748
	GEN6_READ_HEADER(x); \
705
	if (NEEDS_FORCE_WAKE(offset)) \
749
	if (NEEDS_FORCE_WAKE(offset)) \
706
		__force_wake_get(dev_priv, FORCEWAKE_RENDER); \
750
		__force_wake_get(dev_priv, FORCEWAKE_RENDER); \
707
	val = __raw_i915_read##x(dev_priv, reg); \
-
 
708
	hsw_unclaimed_reg_debug(dev_priv, reg, true, false); \
751
	val = __raw_i915_read##x(dev_priv, reg); \
709
	GEN6_READ_FOOTER; \
752
	GEN6_READ_FOOTER; \
Line 710... Line 753...
710
}
753
}
711
 
754
 
Line 751... Line 794...
751
#define __gen9_read(x) \
794
#define __gen9_read(x) \
752
static u##x \
795
static u##x \
753
gen9_read##x(struct drm_i915_private *dev_priv, i915_reg_t reg, bool trace) { \
796
gen9_read##x(struct drm_i915_private *dev_priv, i915_reg_t reg, bool trace) { \
754
	enum forcewake_domains fw_engine; \
797
	enum forcewake_domains fw_engine; \
755
	GEN6_READ_HEADER(x); \
798
	GEN6_READ_HEADER(x); \
756
	hsw_unclaimed_reg_debug(dev_priv, reg, true, true); \
-
 
757
	if (!SKL_NEEDS_FORCE_WAKE(offset)) \
799
	if (!SKL_NEEDS_FORCE_WAKE(offset)) \
758
		fw_engine = 0; \
800
		fw_engine = 0; \
759
	else if (FORCEWAKE_GEN9_RENDER_RANGE_OFFSET(offset)) \
801
	else if (FORCEWAKE_GEN9_RENDER_RANGE_OFFSET(offset)) \
760
		fw_engine = FORCEWAKE_RENDER; \
802
		fw_engine = FORCEWAKE_RENDER; \
761
	else if (FORCEWAKE_GEN9_MEDIA_RANGE_OFFSET(offset)) \
803
	else if (FORCEWAKE_GEN9_MEDIA_RANGE_OFFSET(offset)) \
Line 765... Line 807...
765
	else \
807
	else \
766
		fw_engine = FORCEWAKE_BLITTER; \
808
		fw_engine = FORCEWAKE_BLITTER; \
767
	if (fw_engine) \
809
	if (fw_engine) \
768
		__force_wake_get(dev_priv, fw_engine); \
810
		__force_wake_get(dev_priv, fw_engine); \
769
	val = __raw_i915_read##x(dev_priv, reg); \
811
	val = __raw_i915_read##x(dev_priv, reg); \
770
	hsw_unclaimed_reg_debug(dev_priv, reg, true, false); \
-
 
771
	GEN6_READ_FOOTER; \
812
	GEN6_READ_FOOTER; \
772
}
813
}
Line 773... Line 814...
773
 
814
 
774
__gen9_read(8)
815
__gen9_read(8)
Line 864... Line 905...
864
#define GEN6_WRITE_HEADER \
905
#define GEN6_WRITE_HEADER \
865
	u32 offset = i915_mmio_reg_offset(reg); \
906
	u32 offset = i915_mmio_reg_offset(reg); \
866
	unsigned long irqflags; \
907
	unsigned long irqflags; \
867
	trace_i915_reg_rw(true, reg, val, sizeof(val), trace); \
908
	trace_i915_reg_rw(true, reg, val, sizeof(val), trace); \
868
	assert_rpm_wakelock_held(dev_priv); \
909
	assert_rpm_wakelock_held(dev_priv); \
869
	spin_lock_irqsave(&dev_priv->uncore.lock, irqflags)
910
	spin_lock_irqsave(&dev_priv->uncore.lock, irqflags); \
-
 
911
	unclaimed_reg_debug(dev_priv, reg, false, true)
Line 870... Line 912...
870
 
912
 
-
 
913
#define GEN6_WRITE_FOOTER \
871
#define GEN6_WRITE_FOOTER \
914
	unclaimed_reg_debug(dev_priv, reg, false, false); \
Line 872... Line 915...
872
	spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags)
915
	spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags)
873
 
916
 
874
#define __gen6_write(x) \
917
#define __gen6_write(x) \
Line 892... Line 935...
892
	u32 __fifo_ret = 0; \
935
	u32 __fifo_ret = 0; \
893
	GEN6_WRITE_HEADER; \
936
	GEN6_WRITE_HEADER; \
894
	if (NEEDS_FORCE_WAKE(offset)) { \
937
	if (NEEDS_FORCE_WAKE(offset)) { \
895
		__fifo_ret = __gen6_gt_wait_for_fifo(dev_priv); \
938
		__fifo_ret = __gen6_gt_wait_for_fifo(dev_priv); \
896
	} \
939
	} \
897
	hsw_unclaimed_reg_debug(dev_priv, reg, false, true); \
-
 
898
	__raw_i915_write##x(dev_priv, reg, val); \
940
	__raw_i915_write##x(dev_priv, reg, val); \
899
	if (unlikely(__fifo_ret)) { \
941
	if (unlikely(__fifo_ret)) { \
900
		gen6_gt_check_fifodbg(dev_priv); \
942
		gen6_gt_check_fifodbg(dev_priv); \
901
	} \
943
	} \
902
	hsw_unclaimed_reg_debug(dev_priv, reg, false, false); \
-
 
903
	hsw_unclaimed_reg_detect(dev_priv); \
-
 
904
	GEN6_WRITE_FOOTER; \
944
	GEN6_WRITE_FOOTER; \
905
}
945
}
Line 906... Line 946...
906
 
946
 
907
static const i915_reg_t gen8_shadowed_regs[] = {
947
static const i915_reg_t gen8_shadowed_regs[] = {
Line 928... Line 968...
928
 
968
 
929
#define __gen8_write(x) \
969
#define __gen8_write(x) \
930
static void \
970
static void \
931
gen8_write##x(struct drm_i915_private *dev_priv, i915_reg_t reg, u##x val, bool trace) { \
971
gen8_write##x(struct drm_i915_private *dev_priv, i915_reg_t reg, u##x val, bool trace) { \
932
	GEN6_WRITE_HEADER; \
-
 
933
	hsw_unclaimed_reg_debug(dev_priv, reg, false, true); \
972
	GEN6_WRITE_HEADER; \
934
	if (NEEDS_FORCE_WAKE(offset) && !is_gen8_shadowed(dev_priv, reg)) \
973
	if (NEEDS_FORCE_WAKE(offset) && !is_gen8_shadowed(dev_priv, reg)) \
935
		__force_wake_get(dev_priv, FORCEWAKE_RENDER); \
974
		__force_wake_get(dev_priv, FORCEWAKE_RENDER); \
936
	__raw_i915_write##x(dev_priv, reg, val); \
-
 
937
	hsw_unclaimed_reg_debug(dev_priv, reg, false, false); \
-
 
938
	hsw_unclaimed_reg_detect(dev_priv); \
975
	__raw_i915_write##x(dev_priv, reg, val); \
939
	GEN6_WRITE_FOOTER; \
976
	GEN6_WRITE_FOOTER; \
Line 940... Line 977...
940
}
977
}
941
 
978
 
Line 987... Line 1024...
987
static void \
1024
static void \
988
gen9_write##x(struct drm_i915_private *dev_priv, i915_reg_t reg, u##x val, \
1025
gen9_write##x(struct drm_i915_private *dev_priv, i915_reg_t reg, u##x val, \
989
		bool trace) { \
1026
		bool trace) { \
990
	enum forcewake_domains fw_engine; \
1027
	enum forcewake_domains fw_engine; \
991
	GEN6_WRITE_HEADER; \
1028
	GEN6_WRITE_HEADER; \
992
	hsw_unclaimed_reg_debug(dev_priv, reg, false, true); \
-
 
993
	if (!SKL_NEEDS_FORCE_WAKE(offset) || \
1029
	if (!SKL_NEEDS_FORCE_WAKE(offset) || \
994
	    is_gen9_shadowed(dev_priv, reg)) \
1030
	    is_gen9_shadowed(dev_priv, reg)) \
995
		fw_engine = 0; \
1031
		fw_engine = 0; \
996
	else if (FORCEWAKE_GEN9_RENDER_RANGE_OFFSET(offset)) \
1032
	else if (FORCEWAKE_GEN9_RENDER_RANGE_OFFSET(offset)) \
997
		fw_engine = FORCEWAKE_RENDER; \
1033
		fw_engine = FORCEWAKE_RENDER; \
Line 1002... Line 1038...
1002
	else \
1038
	else \
1003
		fw_engine = FORCEWAKE_BLITTER; \
1039
		fw_engine = FORCEWAKE_BLITTER; \
1004
	if (fw_engine) \
1040
	if (fw_engine) \
1005
		__force_wake_get(dev_priv, fw_engine); \
1041
		__force_wake_get(dev_priv, fw_engine); \
1006
	__raw_i915_write##x(dev_priv, reg, val); \
1042
	__raw_i915_write##x(dev_priv, reg, val); \
1007
	hsw_unclaimed_reg_debug(dev_priv, reg, false, false); \
-
 
1008
	hsw_unclaimed_reg_detect(dev_priv); \
-
 
1009
	GEN6_WRITE_FOOTER; \
1043
	GEN6_WRITE_FOOTER; \
1010
}
1044
}
Line 1011... Line 1045...
1011
 
1045
 
1012
__gen9_write(8)
1046
__gen9_write(8)
Line 1227... Line 1261...
1227
 
1261
 
1228
	intel_uncore_ellc_detect(dev);
1262
	intel_uncore_ellc_detect(dev);
1229
	intel_uncore_fw_domains_init(dev);
1263
	intel_uncore_fw_domains_init(dev);
Line -... Line 1264...
-
 
1264
	__intel_uncore_early_sanitize(dev, false);
-
 
1265
 
1230
	__intel_uncore_early_sanitize(dev, false);
1266
	dev_priv->uncore.unclaimed_mmio_check = 1;
1231
 
1267
 
1232
	switch (INTEL_INFO(dev)->gen) {
1268
	switch (INTEL_INFO(dev)->gen) {
1233
	default:
1269
	default:
1234
	case 9:
1270
	case 9:
Line 1584... Line 1620...
1584
bool intel_has_gpu_reset(struct drm_device *dev)
1620
bool intel_has_gpu_reset(struct drm_device *dev)
1585
{
1621
{
1586
	return intel_get_gpu_reset(dev) != NULL;
1622
	return intel_get_gpu_reset(dev) != NULL;
1587
}
1623
}
Line 1588... Line 1624...
1588
 
1624
 
1589
void intel_uncore_check_errors(struct drm_device *dev)
1625
bool intel_uncore_unclaimed_mmio(struct drm_i915_private *dev_priv)
1590
{
1626
{
-
 
1627
	return check_for_unclaimed_mmio(dev_priv);
Line -... Line 1628...
-
 
1628
}
-
 
1629
 
-
 
1630
bool
1591
	struct drm_i915_private *dev_priv = dev->dev_private;
1631
intel_uncore_arm_unclaimed_mmio_detection(struct drm_i915_private *dev_priv)
1592
 
1632
{
-
 
1633
	if (unlikely(i915.mmio_debug ||
-
 
1634
		     dev_priv->uncore.unclaimed_mmio_check <= 0))
-
 
1635
		return false;
1593
	if (HAS_FPGA_DBG_UNCLAIMED(dev) &&
1636
 
-
 
1637
	if (unlikely(intel_uncore_unclaimed_mmio(dev_priv))) {
1594
	    (__raw_i915_read32(dev_priv, FPGA_DBG) & FPGA_DBG_RM_NOCLAIM)) {
1638
		DRM_DEBUG("Unclaimed register detected, "
-
 
1639
			  "enabling oneshot unclaimed register reporting. "
-
 
1640
			  "Please use i915.mmio_debug=N for more information.\n");
-
 
1641
		i915.mmio_debug++;
1595
		DRM_ERROR("Unclaimed register before interrupt\n");
1642
		dev_priv->uncore.unclaimed_mmio_check--;
-
 
1643
		return true;
-
 
1644
	}
1596
		__raw_i915_write32(dev_priv, FPGA_DBG, FPGA_DBG_RM_NOCLAIM);
1645