67
67
*/
68
68
u32 i915_get_vblank_counter (struct drm_crtc * crtc )
69
69
{
70
- struct drm_i915_private * dev_priv = to_i915 (crtc -> dev );
70
+ struct intel_display * display = to_intel_display (crtc -> dev );
71
71
struct drm_vblank_crtc * vblank = drm_crtc_vblank_crtc (crtc );
72
72
const struct drm_display_mode * mode = & vblank -> hwmode ;
73
73
enum pipe pipe = to_intel_crtc (crtc )-> pipe ;
@@ -103,8 +103,8 @@ u32 i915_get_vblank_counter(struct drm_crtc *crtc)
103
103
* we get a low value that's stable across two reads of the high
104
104
* register.
105
105
*/
106
- frame = intel_de_read64_2x32 (dev_priv , PIPEFRAMEPIXEL (dev_priv , pipe ),
107
- PIPEFRAME (dev_priv , pipe ));
106
+ frame = intel_de_read64_2x32 (display , PIPEFRAMEPIXEL (display , pipe ),
107
+ PIPEFRAME (display , pipe ));
108
108
109
109
pixel = frame & PIPE_PIXEL_MASK ;
110
110
frame = (frame >> PIPE_FRAME_LOW_SHIFT ) & 0xffffff ;
@@ -119,19 +119,19 @@ u32 i915_get_vblank_counter(struct drm_crtc *crtc)
119
119
120
120
u32 g4x_get_vblank_counter (struct drm_crtc * crtc )
121
121
{
122
- struct drm_i915_private * dev_priv = to_i915 (crtc -> dev );
122
+ struct intel_display * display = to_intel_display (crtc -> dev );
123
123
struct drm_vblank_crtc * vblank = drm_crtc_vblank_crtc (crtc );
124
124
enum pipe pipe = to_intel_crtc (crtc )-> pipe ;
125
125
126
126
if (!vblank -> max_vblank_count )
127
127
return 0 ;
128
128
129
- return intel_de_read (dev_priv , PIPE_FRMCOUNT_G4X (dev_priv , pipe ));
129
+ return intel_de_read (display , PIPE_FRMCOUNT_G4X (display , pipe ));
130
130
}
131
131
132
132
static u32 intel_crtc_scanlines_since_frame_timestamp (struct intel_crtc * crtc )
133
133
{
134
- struct drm_i915_private * dev_priv = to_i915 (crtc -> base . dev );
134
+ struct intel_display * display = to_intel_display (crtc );
135
135
struct drm_vblank_crtc * vblank = drm_crtc_vblank_crtc (& crtc -> base );
136
136
const struct drm_display_mode * mode = & vblank -> hwmode ;
137
137
u32 htotal = mode -> crtc_htotal ;
@@ -150,16 +150,16 @@ static u32 intel_crtc_scanlines_since_frame_timestamp(struct intel_crtc *crtc)
150
150
* pipe frame time stamp. The time stamp value
151
151
* is sampled at every start of vertical blank.
152
152
*/
153
- scan_prev_time = intel_de_read_fw (dev_priv ,
153
+ scan_prev_time = intel_de_read_fw (display ,
154
154
PIPE_FRMTMSTMP (crtc -> pipe ));
155
155
156
156
/*
157
157
* The TIMESTAMP_CTR register has the current
158
158
* time stamp value.
159
159
*/
160
- scan_curr_time = intel_de_read_fw (dev_priv , IVB_TIMESTAMP_CTR );
160
+ scan_curr_time = intel_de_read_fw (display , IVB_TIMESTAMP_CTR );
161
161
162
- scan_post_time = intel_de_read_fw (dev_priv ,
162
+ scan_post_time = intel_de_read_fw (display ,
163
163
PIPE_FRMTMSTMP (crtc -> pipe ));
164
164
} while (scan_post_time != scan_prev_time );
165
165
@@ -192,6 +192,7 @@ static u32 __intel_get_crtc_scanline_from_timestamp(struct intel_crtc *crtc)
192
192
193
193
static int intel_crtc_scanline_offset (const struct intel_crtc_state * crtc_state )
194
194
{
195
+ struct intel_display * display = to_intel_display (crtc_state );
195
196
struct drm_i915_private * i915 = to_i915 (crtc_state -> uapi .crtc -> dev );
196
197
197
198
/*
@@ -220,7 +221,7 @@ static int intel_crtc_scanline_offset(const struct intel_crtc_state *crtc_state)
220
221
* However if queried just before the start of vblank we'll get an
221
222
* answer that's slightly in the future.
222
223
*/
223
- if (DISPLAY_VER (i915 ) == 2 )
224
+ if (DISPLAY_VER (display ) == 2 )
224
225
return -1 ;
225
226
else if (HAS_DDI (i915 ) && intel_crtc_has_type (crtc_state , INTEL_OUTPUT_HDMI ))
226
227
return 2 ;
@@ -234,8 +235,7 @@ static int intel_crtc_scanline_offset(const struct intel_crtc_state *crtc_state)
234
235
*/
235
236
static int __intel_get_crtc_scanline (struct intel_crtc * crtc )
236
237
{
237
- struct drm_device * dev = crtc -> base .dev ;
238
- struct drm_i915_private * dev_priv = to_i915 (dev );
238
+ struct intel_display * display = to_intel_display (crtc );
239
239
struct drm_vblank_crtc * vblank = drm_crtc_vblank_crtc (& crtc -> base );
240
240
const struct drm_display_mode * mode = & vblank -> hwmode ;
241
241
enum pipe pipe = crtc -> pipe ;
@@ -249,7 +249,7 @@ static int __intel_get_crtc_scanline(struct intel_crtc *crtc)
249
249
250
250
vtotal = intel_mode_vtotal (mode );
251
251
252
- position = intel_de_read_fw (dev_priv , PIPEDSL (dev_priv , pipe )) & PIPEDSL_LINE_MASK ;
252
+ position = intel_de_read_fw (display , PIPEDSL (display , pipe )) & PIPEDSL_LINE_MASK ;
253
253
254
254
/*
255
255
* On HSW, the DSL reg (0x70000) appears to return 0 if we
@@ -263,13 +263,13 @@ static int __intel_get_crtc_scanline(struct intel_crtc *crtc)
263
263
* problem. We may need to extend this to include other platforms,
264
264
* but so far testing only shows the problem on HSW.
265
265
*/
266
- if (HAS_DDI (dev_priv ) && !position ) {
266
+ if (HAS_DDI (display ) && !position ) {
267
267
int i , temp ;
268
268
269
269
for (i = 0 ; i < 100 ; i ++ ) {
270
270
udelay (1 );
271
- temp = intel_de_read_fw (dev_priv ,
272
- PIPEDSL (dev_priv , pipe )) & PIPEDSL_LINE_MASK ;
271
+ temp = intel_de_read_fw (display ,
272
+ PIPEDSL (display , pipe )) & PIPEDSL_LINE_MASK ;
273
273
if (temp != position ) {
274
274
position = temp ;
275
275
break ;
@@ -304,23 +304,25 @@ int intel_crtc_scanline_to_hw(struct intel_crtc *crtc, int scanline)
304
304
* otherwise they may hang.
305
305
*/
306
306
#ifdef I915
307
- static void intel_vblank_section_enter (struct drm_i915_private * i915 )
307
+ static void intel_vblank_section_enter (struct intel_display * display )
308
308
__acquires (i915 - > uncore .lock )
309
309
{
310
+ struct drm_i915_private * i915 = to_i915 (display -> drm );
310
311
spin_lock (& i915 -> uncore .lock );
311
312
}
312
313
313
- static void intel_vblank_section_exit (struct drm_i915_private * i915 )
314
+ static void intel_vblank_section_exit (struct intel_display * display )
314
315
__releases (i915 - > uncore .lock )
315
316
{
317
+ struct drm_i915_private * i915 = to_i915 (display -> drm );
316
318
spin_unlock (& i915 -> uncore .lock );
317
319
}
318
320
#else
319
- static void intel_vblank_section_enter (struct drm_i915_private * i915 )
321
+ static void intel_vblank_section_enter (struct intel_display * display )
320
322
{
321
323
}
322
324
323
- static void intel_vblank_section_exit (struct drm_i915_private * i915 )
325
+ static void intel_vblank_section_exit (struct intel_display * display )
324
326
{
325
327
}
326
328
#endif
@@ -331,19 +333,19 @@ static bool i915_get_crtc_scanoutpos(struct drm_crtc *_crtc,
331
333
ktime_t * stime , ktime_t * etime ,
332
334
const struct drm_display_mode * mode )
333
335
{
334
- struct drm_device * dev = _crtc -> dev ;
335
- struct drm_i915_private * dev_priv = to_i915 (dev );
336
+ struct intel_display * display = to_intel_display ( _crtc -> dev ) ;
337
+ struct drm_i915_private * dev_priv = to_i915 (display -> drm );
336
338
struct intel_crtc * crtc = to_intel_crtc (_crtc );
337
339
enum pipe pipe = crtc -> pipe ;
338
340
int position ;
339
341
int vbl_start , vbl_end , hsync_start , htotal , vtotal ;
340
342
unsigned long irqflags ;
341
- bool use_scanline_counter = DISPLAY_VER (dev_priv ) >= 5 ||
342
- IS_G4X (dev_priv ) || DISPLAY_VER (dev_priv ) == 2 ||
343
+ bool use_scanline_counter = DISPLAY_VER (display ) >= 5 ||
344
+ IS_G4X (dev_priv ) || DISPLAY_VER (display ) == 2 ||
343
345
crtc -> mode_flags & I915_MODE_FLAG_USE_SCANLINE_COUNTER ;
344
346
345
- if (drm_WARN_ON (& dev_priv -> drm , !mode -> crtc_clock )) {
346
- drm_dbg (& dev_priv -> drm ,
347
+ if (drm_WARN_ON (display -> drm , !mode -> crtc_clock )) {
348
+ drm_dbg (display -> drm ,
347
349
"trying to get scanoutpos for disabled pipe %c\n" ,
348
350
pipe_name (pipe ));
349
351
return false;
@@ -361,7 +363,7 @@ static bool i915_get_crtc_scanoutpos(struct drm_crtc *_crtc,
361
363
* preemption disabled, so the following code must not block.
362
364
*/
363
365
local_irq_save (irqflags );
364
- intel_vblank_section_enter (dev_priv );
366
+ intel_vblank_section_enter (display );
365
367
366
368
/* preempt_disable_rt() should go right here in PREEMPT_RT patchset. */
367
369
@@ -393,7 +395,7 @@ static bool i915_get_crtc_scanoutpos(struct drm_crtc *_crtc,
393
395
* We can split this into vertical and horizontal
394
396
* scanout position.
395
397
*/
396
- position = (intel_de_read_fw (dev_priv , PIPEFRAMEPIXEL (dev_priv , pipe )) & PIPE_PIXEL_MASK ) >> PIPE_PIXEL_SHIFT ;
398
+ position = (intel_de_read_fw (display , PIPEFRAMEPIXEL (display , pipe )) & PIPE_PIXEL_MASK ) >> PIPE_PIXEL_SHIFT ;
397
399
398
400
/* convert to pixel counts */
399
401
vbl_start *= htotal ;
@@ -429,7 +431,7 @@ static bool i915_get_crtc_scanoutpos(struct drm_crtc *_crtc,
429
431
430
432
/* preempt_enable_rt() should go right here in PREEMPT_RT patchset. */
431
433
432
- intel_vblank_section_exit (dev_priv );
434
+ intel_vblank_section_exit (display );
433
435
local_irq_restore (irqflags );
434
436
435
437
/*
@@ -464,42 +466,42 @@ bool intel_crtc_get_vblank_timestamp(struct drm_crtc *crtc, int *max_error,
464
466
465
467
int intel_get_crtc_scanline (struct intel_crtc * crtc )
466
468
{
467
- struct drm_i915_private * dev_priv = to_i915 (crtc -> base . dev );
469
+ struct intel_display * display = to_intel_display (crtc );
468
470
unsigned long irqflags ;
469
471
int position ;
470
472
471
473
local_irq_save (irqflags );
472
- intel_vblank_section_enter (dev_priv );
474
+ intel_vblank_section_enter (display );
473
475
474
476
position = __intel_get_crtc_scanline (crtc );
475
477
476
- intel_vblank_section_exit (dev_priv );
478
+ intel_vblank_section_exit (display );
477
479
local_irq_restore (irqflags );
478
480
479
481
return position ;
480
482
}
481
483
482
- static bool pipe_scanline_is_moving (struct drm_i915_private * dev_priv ,
484
+ static bool pipe_scanline_is_moving (struct intel_display * display ,
483
485
enum pipe pipe )
484
486
{
485
- i915_reg_t reg = PIPEDSL (dev_priv , pipe );
487
+ i915_reg_t reg = PIPEDSL (display , pipe );
486
488
u32 line1 , line2 ;
487
489
488
- line1 = intel_de_read (dev_priv , reg ) & PIPEDSL_LINE_MASK ;
490
+ line1 = intel_de_read (display , reg ) & PIPEDSL_LINE_MASK ;
489
491
msleep (5 );
490
- line2 = intel_de_read (dev_priv , reg ) & PIPEDSL_LINE_MASK ;
492
+ line2 = intel_de_read (display , reg ) & PIPEDSL_LINE_MASK ;
491
493
492
494
return line1 != line2 ;
493
495
}
494
496
495
497
static void wait_for_pipe_scanline_moving (struct intel_crtc * crtc , bool state )
496
498
{
497
- struct drm_i915_private * dev_priv = to_i915 (crtc -> base . dev );
499
+ struct intel_display * display = to_intel_display (crtc );
498
500
enum pipe pipe = crtc -> pipe ;
499
501
500
502
/* Wait for the display line to settle/start moving */
501
- if (wait_for (pipe_scanline_is_moving (dev_priv , pipe ) == state , 100 ))
502
- drm_err (& dev_priv -> drm ,
503
+ if (wait_for (pipe_scanline_is_moving (display , pipe ) == state , 100 ))
504
+ drm_err (display -> drm ,
503
505
"pipe %c scanline %s wait timed out\n" ,
504
506
pipe_name (pipe ), str_on_off (state ));
505
507
}
@@ -517,8 +519,8 @@ void intel_wait_for_pipe_scanline_moving(struct intel_crtc *crtc)
517
519
void intel_crtc_update_active_timings (const struct intel_crtc_state * crtc_state ,
518
520
bool vrr_enable )
519
521
{
522
+ struct intel_display * display = to_intel_display (crtc_state );
520
523
struct intel_crtc * crtc = to_intel_crtc (crtc_state -> uapi .crtc );
521
- struct drm_i915_private * i915 = to_i915 (crtc -> base .dev );
522
524
u8 mode_flags = crtc_state -> mode_flags ;
523
525
struct drm_display_mode adjusted_mode ;
524
526
int vmax_vblank_start = 0 ;
@@ -527,7 +529,8 @@ void intel_crtc_update_active_timings(const struct intel_crtc_state *crtc_state,
527
529
drm_mode_init (& adjusted_mode , & crtc_state -> hw .adjusted_mode );
528
530
529
531
if (vrr_enable ) {
530
- drm_WARN_ON (& i915 -> drm , (mode_flags & I915_MODE_FLAG_VRR ) == 0 );
532
+ drm_WARN_ON (display -> drm ,
533
+ (mode_flags & I915_MODE_FLAG_VRR ) == 0 );
531
534
532
535
adjusted_mode .crtc_vtotal = crtc_state -> vrr .vmax ;
533
536
adjusted_mode .crtc_vblank_end = crtc_state -> vrr .vmax ;
@@ -549,8 +552,8 @@ void intel_crtc_update_active_timings(const struct intel_crtc_state *crtc_state,
549
552
* __intel_get_crtc_scanline()) with vblank_time_lock?
550
553
* Need to audit everything to make sure it's safe.
551
554
*/
552
- spin_lock_irqsave (& i915 -> drm . vblank_time_lock , irqflags );
553
- intel_vblank_section_enter (i915 );
555
+ spin_lock_irqsave (& display -> drm -> vblank_time_lock , irqflags );
556
+ intel_vblank_section_enter (display );
554
557
555
558
drm_calc_timestamping_constants (& crtc -> base , & adjusted_mode );
556
559
@@ -559,8 +562,8 @@ void intel_crtc_update_active_timings(const struct intel_crtc_state *crtc_state,
559
562
crtc -> mode_flags = mode_flags ;
560
563
561
564
crtc -> scanline_offset = intel_crtc_scanline_offset (crtc_state );
562
- intel_vblank_section_exit (i915 );
563
- spin_unlock_irqrestore (& i915 -> drm . vblank_time_lock , irqflags );
565
+ intel_vblank_section_exit (display );
566
+ spin_unlock_irqrestore (& display -> drm -> vblank_time_lock , irqflags );
564
567
}
565
568
566
569
int intel_mode_vdisplay (const struct drm_display_mode * mode )
@@ -666,7 +669,7 @@ void intel_vblank_evade_init(const struct intel_crtc_state *old_crtc_state,
666
669
int intel_vblank_evade (struct intel_vblank_evade_ctx * evade )
667
670
{
668
671
struct intel_crtc * crtc = evade -> crtc ;
669
- struct drm_i915_private * i915 = to_i915 (crtc -> base . dev );
672
+ struct intel_display * display = to_intel_display (crtc );
670
673
long timeout = msecs_to_jiffies_timeout (1 );
671
674
wait_queue_head_t * wq = drm_crtc_vblank_waitqueue (& crtc -> base );
672
675
DEFINE_WAIT (wait );
@@ -688,7 +691,7 @@ int intel_vblank_evade(struct intel_vblank_evade_ctx *evade)
688
691
break ;
689
692
690
693
if (!timeout ) {
691
- drm_err (& i915 -> drm ,
694
+ drm_err (display -> drm ,
692
695
"Potential atomic update failure on pipe %c\n" ,
693
696
pipe_name (crtc -> pipe ));
694
697
break ;
0 commit comments