32
32
#include "drm.h"
33
33
#include "i915_drm.h"
34
34
#include "i915_drv.h"
35
+ #include "i915_trace.h"
35
36
#include "intel_drv.h"
36
37
37
38
#include <linux/console.h>
@@ -432,36 +433,26 @@ bool i915_semaphore_is_enabled(struct drm_device *dev)
432
433
return 1 ;
433
434
}
434
435
435
- void __gen6_gt_force_wake_get (struct drm_i915_private * dev_priv )
436
+ static void __gen6_gt_force_wake_get (struct drm_i915_private * dev_priv )
436
437
{
437
- int count ;
438
-
439
- count = 0 ;
440
- while (count ++ < 50 && (I915_READ_NOTRACE (FORCEWAKE_ACK ) & 1 ))
441
- udelay (10 );
438
+ if (wait_for_atomic_us ((I915_READ_NOTRACE (FORCEWAKE_ACK ) & 1 ) == 0 , 500 ))
439
+ DRM_ERROR ("Force wake wait timed out\n" );
442
440
443
441
I915_WRITE_NOTRACE (FORCEWAKE , 1 );
444
- POSTING_READ (FORCEWAKE );
445
442
446
- count = 0 ;
447
- while (count ++ < 50 && (I915_READ_NOTRACE (FORCEWAKE_ACK ) & 1 ) == 0 )
448
- udelay (10 );
443
+ if (wait_for_atomic_us ((I915_READ_NOTRACE (FORCEWAKE_ACK ) & 1 ), 500 ))
444
+ DRM_ERROR ("Force wake wait timed out\n" );
449
445
}
450
446
451
- void __gen6_gt_force_wake_mt_get (struct drm_i915_private * dev_priv )
447
+ static void __gen6_gt_force_wake_mt_get (struct drm_i915_private * dev_priv )
452
448
{
453
- int count ;
454
-
455
- count = 0 ;
456
- while (count ++ < 50 && (I915_READ_NOTRACE (FORCEWAKE_MT_ACK ) & 1 ))
457
- udelay (10 );
449
+ if (wait_for_atomic_us ((I915_READ_NOTRACE (FORCEWAKE_MT_ACK ) & 1 ) == 0 , 500 ))
450
+ DRM_ERROR ("Force wake wait timed out\n" );
458
451
459
452
I915_WRITE_NOTRACE (FORCEWAKE_MT , _MASKED_BIT_ENABLE (1 ));
460
- POSTING_READ (FORCEWAKE_MT );
461
453
462
- count = 0 ;
463
- while (count ++ < 50 && (I915_READ_NOTRACE (FORCEWAKE_MT_ACK ) & 1 ) == 0 )
464
- udelay (10 );
454
+ if (wait_for_atomic_us ((I915_READ_NOTRACE (FORCEWAKE_MT_ACK ) & 1 ), 500 ))
455
+ DRM_ERROR ("Force wake wait timed out\n" );
465
456
}
466
457
467
458
/*
@@ -476,7 +467,7 @@ void gen6_gt_force_wake_get(struct drm_i915_private *dev_priv)
476
467
477
468
spin_lock_irqsave (& dev_priv -> gt_lock , irqflags );
478
469
if (dev_priv -> forcewake_count ++ == 0 )
479
- dev_priv -> display .force_wake_get (dev_priv );
470
+ dev_priv -> gt .force_wake_get (dev_priv );
480
471
spin_unlock_irqrestore (& dev_priv -> gt_lock , irqflags );
481
472
}
482
473
@@ -489,14 +480,14 @@ static void gen6_gt_check_fifodbg(struct drm_i915_private *dev_priv)
489
480
I915_WRITE_NOTRACE (GTFIFODBG , GT_FIFO_CPU_ERROR_MASK );
490
481
}
491
482
492
- void __gen6_gt_force_wake_put (struct drm_i915_private * dev_priv )
483
+ static void __gen6_gt_force_wake_put (struct drm_i915_private * dev_priv )
493
484
{
494
485
I915_WRITE_NOTRACE (FORCEWAKE , 0 );
495
486
/* The below doubles as a POSTING_READ */
496
487
gen6_gt_check_fifodbg (dev_priv );
497
488
}
498
489
499
- void __gen6_gt_force_wake_mt_put (struct drm_i915_private * dev_priv )
490
+ static void __gen6_gt_force_wake_mt_put (struct drm_i915_private * dev_priv )
500
491
{
501
492
I915_WRITE_NOTRACE (FORCEWAKE_MT , _MASKED_BIT_DISABLE (1 ));
502
493
/* The below doubles as a POSTING_READ */
@@ -512,7 +503,7 @@ void gen6_gt_force_wake_put(struct drm_i915_private *dev_priv)
512
503
513
504
spin_lock_irqsave (& dev_priv -> gt_lock , irqflags );
514
505
if (-- dev_priv -> forcewake_count == 0 )
515
- dev_priv -> display .force_wake_put (dev_priv );
506
+ dev_priv -> gt .force_wake_put (dev_priv );
516
507
spin_unlock_irqrestore (& dev_priv -> gt_lock , irqflags );
517
508
}
518
509
@@ -536,31 +527,67 @@ int __gen6_gt_wait_for_fifo(struct drm_i915_private *dev_priv)
536
527
return ret ;
537
528
}
538
529
539
- void vlv_force_wake_get (struct drm_i915_private * dev_priv )
530
+ static void vlv_force_wake_get (struct drm_i915_private * dev_priv )
540
531
{
541
- int count ;
542
-
543
- count = 0 ;
544
-
545
532
/* Already awake? */
546
533
if ((I915_READ (0x130094 ) & 0xa1 ) == 0xa1 )
547
534
return ;
548
535
549
536
I915_WRITE_NOTRACE (FORCEWAKE_VLV , 0xffffffff );
550
537
POSTING_READ (FORCEWAKE_VLV );
551
538
552
- count = 0 ;
553
- while (count ++ < 50 && (I915_READ_NOTRACE (FORCEWAKE_ACK_VLV ) & 1 ) == 0 )
554
- udelay (10 );
539
+ if (wait_for_atomic_us ((I915_READ_NOTRACE (FORCEWAKE_ACK_VLV ) & 1 ), 500 ))
540
+ DRM_ERROR ("Force wake wait timed out\n" );
555
541
}
556
542
557
- void vlv_force_wake_put (struct drm_i915_private * dev_priv )
543
+ static void vlv_force_wake_put (struct drm_i915_private * dev_priv )
558
544
{
559
545
I915_WRITE_NOTRACE (FORCEWAKE_VLV , 0xffff0000 );
560
546
/* FIXME: confirm VLV behavior with Punit folks */
561
547
POSTING_READ (FORCEWAKE_VLV );
562
548
}
563
549
550
+ void intel_gt_init (struct drm_device * dev )
551
+ {
552
+ struct drm_i915_private * dev_priv = dev -> dev_private ;
553
+
554
+ spin_lock_init (& dev_priv -> gt_lock );
555
+
556
+ if (IS_VALLEYVIEW (dev )) {
557
+ dev_priv -> gt .force_wake_get = vlv_force_wake_get ;
558
+ dev_priv -> gt .force_wake_put = vlv_force_wake_put ;
559
+ } else if (INTEL_INFO (dev )-> gen >= 6 ) {
560
+ dev_priv -> gt .force_wake_get = __gen6_gt_force_wake_get ;
561
+ dev_priv -> gt .force_wake_put = __gen6_gt_force_wake_put ;
562
+
563
+ /* IVB configs may use multi-threaded forcewake */
564
+ if (IS_IVYBRIDGE (dev ) || IS_HASWELL (dev )) {
565
+ u32 ecobus ;
566
+
567
+ /* A small trick here - if the bios hasn't configured
568
+ * MT forcewake, and if the device is in RC6, then
569
+ * force_wake_mt_get will not wake the device and the
570
+ * ECOBUS read will return zero. Which will be
571
+ * (correctly) interpreted by the test below as MT
572
+ * forcewake being disabled.
573
+ */
574
+ mutex_lock (& dev -> struct_mutex );
575
+ __gen6_gt_force_wake_mt_get (dev_priv );
576
+ ecobus = I915_READ_NOTRACE (ECOBUS );
577
+ __gen6_gt_force_wake_mt_put (dev_priv );
578
+ mutex_unlock (& dev -> struct_mutex );
579
+
580
+ if (ecobus & FORCEWAKE_MT_ENABLE ) {
581
+ DRM_DEBUG_KMS ("Using MT version of forcewake\n" );
582
+ dev_priv -> gt .force_wake_get =
583
+ __gen6_gt_force_wake_mt_get ;
584
+ dev_priv -> gt .force_wake_put =
585
+ __gen6_gt_force_wake_mt_put ;
586
+ }
587
+ }
588
+ }
589
+ }
590
+
564
591
static int i915_drm_freeze (struct drm_device * dev )
565
592
{
566
593
struct drm_i915_private * dev_priv = dev -> dev_private ;
@@ -797,9 +824,9 @@ static int gen6_do_reset(struct drm_device *dev)
797
824
798
825
/* If reset with a user forcewake, try to restore, otherwise turn it off */
799
826
if (dev_priv -> forcewake_count )
800
- dev_priv -> display .force_wake_get (dev_priv );
827
+ dev_priv -> gt .force_wake_get (dev_priv );
801
828
else
802
- dev_priv -> display .force_wake_put (dev_priv );
829
+ dev_priv -> gt .force_wake_put (dev_priv );
803
830
804
831
/* Restore fifo count */
805
832
dev_priv -> gt_fifo_count = I915_READ_NOTRACE (GT_FIFO_FREE_ENTRIES );
@@ -1248,10 +1275,10 @@ u##x i915_read##x(struct drm_i915_private *dev_priv, u32 reg) { \
1248
1275
unsigned long irqflags; \
1249
1276
spin_lock_irqsave(&dev_priv->gt_lock, irqflags); \
1250
1277
if (dev_priv->forcewake_count == 0) \
1251
- dev_priv->display .force_wake_get(dev_priv); \
1278
+ dev_priv->gt .force_wake_get(dev_priv); \
1252
1279
val = read##y(dev_priv->regs + reg); \
1253
1280
if (dev_priv->forcewake_count == 0) \
1254
- dev_priv->display .force_wake_put(dev_priv); \
1281
+ dev_priv->gt .force_wake_put(dev_priv); \
1255
1282
spin_unlock_irqrestore(&dev_priv->gt_lock, irqflags); \
1256
1283
} else if (IS_VALLEYVIEW(dev_priv->dev) && IS_DISPLAYREG(reg)) { \
1257
1284
val = read##y(dev_priv->regs + reg + 0x180000); \
0 commit comments