@@ -2356,7 +2356,7 @@ static void intel_find_plane_obj(struct intel_crtc *intel_crtc,
2356
2356
struct drm_device * dev = intel_crtc -> base .dev ;
2357
2357
struct drm_crtc * c ;
2358
2358
struct intel_crtc * i ;
2359
- struct intel_framebuffer * fb ;
2359
+ struct drm_i915_gem_object * obj ;
2360
2360
2361
2361
if (!intel_crtc -> base .primary -> fb )
2362
2362
return ;
@@ -2377,14 +2377,17 @@ static void intel_find_plane_obj(struct intel_crtc *intel_crtc,
2377
2377
if (c == & intel_crtc -> base )
2378
2378
continue ;
2379
2379
2380
- if (!i -> active || !c -> primary -> fb )
2380
+ if (!i -> active )
2381
+ continue ;
2382
+
2383
+ obj = intel_fb_obj (c -> primary -> fb );
2384
+ if (obj == NULL )
2381
2385
continue ;
2382
2386
2383
- fb = to_intel_framebuffer (c -> primary -> fb );
2384
- if (i915_gem_obj_ggtt_offset (fb -> obj ) == plane_config -> base ) {
2387
+ if (i915_gem_obj_ggtt_offset (obj ) == plane_config -> base ) {
2385
2388
drm_framebuffer_reference (c -> primary -> fb );
2386
2389
intel_crtc -> base .primary -> fb = c -> primary -> fb ;
2387
- fb -> obj -> frontbuffer_bits |= INTEL_FRONTBUFFER_PRIMARY (intel_crtc -> pipe );
2390
+ obj -> frontbuffer_bits |= INTEL_FRONTBUFFER_PRIMARY (intel_crtc -> pipe );
2388
2391
break ;
2389
2392
}
2390
2393
}
@@ -2397,16 +2400,12 @@ static void i9xx_update_primary_plane(struct drm_crtc *crtc,
2397
2400
struct drm_device * dev = crtc -> dev ;
2398
2401
struct drm_i915_private * dev_priv = dev -> dev_private ;
2399
2402
struct intel_crtc * intel_crtc = to_intel_crtc (crtc );
2400
- struct intel_framebuffer * intel_fb ;
2401
- struct drm_i915_gem_object * obj ;
2403
+ struct drm_i915_gem_object * obj = intel_fb_obj (fb );
2402
2404
int plane = intel_crtc -> plane ;
2403
2405
unsigned long linear_offset ;
2404
2406
u32 dspcntr ;
2405
2407
u32 reg ;
2406
2408
2407
- intel_fb = to_intel_framebuffer (fb );
2408
- obj = intel_fb -> obj ;
2409
-
2410
2409
reg = DSPCNTR (plane );
2411
2410
dspcntr = I915_READ (reg );
2412
2411
/* Mask out pixel format bits in case we change it */
@@ -2487,16 +2486,12 @@ static void ironlake_update_primary_plane(struct drm_crtc *crtc,
2487
2486
struct drm_device * dev = crtc -> dev ;
2488
2487
struct drm_i915_private * dev_priv = dev -> dev_private ;
2489
2488
struct intel_crtc * intel_crtc = to_intel_crtc (crtc );
2490
- struct intel_framebuffer * intel_fb ;
2491
- struct drm_i915_gem_object * obj ;
2489
+ struct drm_i915_gem_object * obj = intel_fb_obj (fb );
2492
2490
int plane = intel_crtc -> plane ;
2493
2491
unsigned long linear_offset ;
2494
2492
u32 dspcntr ;
2495
2493
u32 reg ;
2496
2494
2497
- intel_fb = to_intel_framebuffer (fb );
2498
- obj = intel_fb -> obj ;
2499
-
2500
2495
reg = DSPCNTR (plane );
2501
2496
dspcntr = I915_READ (reg );
2502
2497
/* Mask out pixel format bits in case we change it */
@@ -2627,7 +2622,7 @@ void intel_display_handle_reset(struct drm_device *dev)
2627
2622
static int
2628
2623
intel_finish_fb (struct drm_framebuffer * old_fb )
2629
2624
{
2630
- struct drm_i915_gem_object * obj = to_intel_framebuffer (old_fb )-> obj ;
2625
+ struct drm_i915_gem_object * obj = intel_fb_obj (old_fb );
2631
2626
struct drm_i915_private * dev_priv = obj -> base .dev -> dev_private ;
2632
2627
bool was_interruptible = dev_priv -> mm .interruptible ;
2633
2628
int ret ;
@@ -2674,9 +2669,9 @@ intel_pipe_set_base(struct drm_crtc *crtc, int x, int y,
2674
2669
struct drm_i915_private * dev_priv = dev -> dev_private ;
2675
2670
struct intel_crtc * intel_crtc = to_intel_crtc (crtc );
2676
2671
enum pipe pipe = intel_crtc -> pipe ;
2677
- struct drm_framebuffer * old_fb ;
2678
- struct drm_i915_gem_object * obj = to_intel_framebuffer (fb )-> obj ;
2679
- struct drm_i915_gem_object * old_obj ;
2672
+ struct drm_framebuffer * old_fb = crtc -> primary -> fb ;
2673
+ struct drm_i915_gem_object * obj = intel_fb_obj (fb );
2674
+ struct drm_i915_gem_object * old_obj = intel_fb_obj ( old_fb ) ;
2680
2675
int ret ;
2681
2676
2682
2677
if (intel_crtc_has_pending_flip (crtc )) {
@@ -2697,9 +2692,6 @@ intel_pipe_set_base(struct drm_crtc *crtc, int x, int y,
2697
2692
return - EINVAL ;
2698
2693
}
2699
2694
2700
- old_fb = crtc -> primary -> fb ;
2701
- old_obj = old_fb ? to_intel_framebuffer (old_fb )-> obj : NULL ;
2702
-
2703
2695
mutex_lock (& dev -> struct_mutex );
2704
2696
ret = intel_pin_and_fence_fb_obj (dev , obj , NULL );
2705
2697
if (ret == 0 )
@@ -2755,7 +2747,7 @@ intel_pipe_set_base(struct drm_crtc *crtc, int x, int y,
2755
2747
if (intel_crtc -> active && old_fb != fb )
2756
2748
intel_wait_for_vblank (dev , intel_crtc -> pipe );
2757
2749
mutex_lock (& dev -> struct_mutex );
2758
- intel_unpin_fb_obj (to_intel_framebuffer ( old_fb ) -> obj );
2750
+ intel_unpin_fb_obj (old_obj );
2759
2751
mutex_unlock (& dev -> struct_mutex );
2760
2752
}
2761
2753
@@ -4929,7 +4921,7 @@ static void intel_crtc_disable(struct drm_crtc *crtc)
4929
4921
struct drm_device * dev = crtc -> dev ;
4930
4922
struct drm_connector * connector ;
4931
4923
struct drm_i915_private * dev_priv = dev -> dev_private ;
4932
- struct drm_i915_gem_object * old_obj ;
4924
+ struct drm_i915_gem_object * old_obj = intel_fb_obj ( crtc -> primary -> fb ) ;
4933
4925
enum pipe pipe = to_intel_crtc (crtc )-> pipe ;
4934
4926
4935
4927
/* crtc should still be enabled when we disable it. */
@@ -4944,7 +4936,6 @@ static void intel_crtc_disable(struct drm_crtc *crtc)
4944
4936
assert_pipe_disabled (dev -> dev_private , pipe );
4945
4937
4946
4938
if (crtc -> primary -> fb ) {
4947
- old_obj = to_intel_framebuffer (crtc -> primary -> fb )-> obj ;
4948
4939
mutex_lock (& dev -> struct_mutex );
4949
4940
intel_unpin_fb_obj (old_obj );
4950
4941
i915_gem_track_fb (old_obj , NULL ,
@@ -9586,14 +9577,22 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
9586
9577
struct drm_device * dev = crtc -> dev ;
9587
9578
struct drm_i915_private * dev_priv = dev -> dev_private ;
9588
9579
struct drm_framebuffer * old_fb = crtc -> primary -> fb ;
9589
- struct drm_i915_gem_object * obj = to_intel_framebuffer (fb )-> obj ;
9580
+ struct drm_i915_gem_object * obj = intel_fb_obj (fb );
9590
9581
struct intel_crtc * intel_crtc = to_intel_crtc (crtc );
9591
9582
enum pipe pipe = intel_crtc -> pipe ;
9592
9583
struct intel_unpin_work * work ;
9593
9584
struct intel_engine_cs * ring ;
9594
9585
unsigned long flags ;
9595
9586
int ret ;
9596
9587
9588
+ /*
9589
+ * drm_mode_page_flip_ioctl() should already catch this, but double
9590
+ * check to be safe. In the future we may enable pageflipping from
9591
+ * a disabled primary plane.
9592
+ */
9593
+ if (WARN_ON (intel_fb_obj (old_fb ) == NULL ))
9594
+ return - EBUSY ;
9595
+
9597
9596
/* Can't change pixel format via MI display flips. */
9598
9597
if (fb -> pixel_format != crtc -> primary -> fb -> pixel_format )
9599
9598
return - EINVAL ;
@@ -9616,7 +9615,7 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
9616
9615
9617
9616
work -> event = event ;
9618
9617
work -> crtc = crtc ;
9619
- work -> old_fb_obj = to_intel_framebuffer (old_fb )-> obj ;
9618
+ work -> old_fb_obj = intel_fb_obj (old_fb );
9620
9619
INIT_WORK (& work -> work , intel_unpin_work_fn );
9621
9620
9622
9621
ret = drm_crtc_vblank_get (crtc );
@@ -10758,10 +10757,9 @@ static int __intel_set_mode(struct drm_crtc *crtc,
10758
10757
* on the DPLL.
10759
10758
*/
10760
10759
for_each_intel_crtc_masked (dev , modeset_pipes , intel_crtc ) {
10761
- struct drm_framebuffer * old_fb ;
10762
- struct drm_i915_gem_object * old_obj = NULL ;
10763
- struct drm_i915_gem_object * obj =
10764
- to_intel_framebuffer (fb )-> obj ;
10760
+ struct drm_framebuffer * old_fb = crtc -> primary -> fb ;
10761
+ struct drm_i915_gem_object * old_obj = intel_fb_obj (old_fb );
10762
+ struct drm_i915_gem_object * obj = intel_fb_obj (fb );
10765
10763
10766
10764
mutex_lock (& dev -> struct_mutex );
10767
10765
ret = intel_pin_and_fence_fb_obj (dev ,
@@ -10772,11 +10770,8 @@ static int __intel_set_mode(struct drm_crtc *crtc,
10772
10770
mutex_unlock (& dev -> struct_mutex );
10773
10771
goto done ;
10774
10772
}
10775
- old_fb = crtc -> primary -> fb ;
10776
- if (old_fb ) {
10777
- old_obj = to_intel_framebuffer (old_fb )-> obj ;
10773
+ if (old_fb )
10778
10774
intel_unpin_fb_obj (old_obj );
10779
- }
10780
10775
i915_gem_track_fb (old_obj , obj ,
10781
10776
INTEL_FRONTBUFFER_PRIMARY (intel_crtc -> pipe ));
10782
10777
mutex_unlock (& dev -> struct_mutex );
@@ -11394,9 +11389,9 @@ intel_primary_plane_disable(struct drm_plane *plane)
11394
11389
intel_disable_primary_hw_plane (dev_priv , intel_plane -> plane ,
11395
11390
intel_plane -> pipe );
11396
11391
disable_unpin :
11397
- i915_gem_track_fb (to_intel_framebuffer (plane -> fb )-> obj , NULL ,
11392
+ i915_gem_track_fb (intel_fb_obj (plane -> fb ), NULL ,
11398
11393
INTEL_FRONTBUFFER_PRIMARY (intel_crtc -> pipe ));
11399
- intel_unpin_fb_obj (to_intel_framebuffer (plane -> fb )-> obj );
11394
+ intel_unpin_fb_obj (intel_fb_obj (plane -> fb ));
11400
11395
plane -> fb = NULL ;
11401
11396
11402
11397
return 0 ;
@@ -11413,7 +11408,8 @@ intel_primary_plane_setplane(struct drm_plane *plane, struct drm_crtc *crtc,
11413
11408
struct drm_i915_private * dev_priv = dev -> dev_private ;
11414
11409
struct intel_crtc * intel_crtc = to_intel_crtc (crtc );
11415
11410
struct intel_plane * intel_plane = to_intel_plane (plane );
11416
- struct drm_i915_gem_object * obj , * old_obj = NULL ;
11411
+ struct drm_i915_gem_object * obj = intel_fb_obj (fb );
11412
+ struct drm_i915_gem_object * old_obj = intel_fb_obj (plane -> fb );
11417
11413
struct drm_rect dest = {
11418
11414
/* integer pixels */
11419
11415
.x1 = crtc_x ,
@@ -11445,10 +11441,6 @@ intel_primary_plane_setplane(struct drm_plane *plane, struct drm_crtc *crtc,
11445
11441
if (ret )
11446
11442
return ret ;
11447
11443
11448
- if (plane -> fb )
11449
- old_obj = to_intel_framebuffer (plane -> fb )-> obj ;
11450
- obj = to_intel_framebuffer (fb )-> obj ;
11451
-
11452
11444
/*
11453
11445
* If the CRTC isn't enabled, we're just pinning the framebuffer,
11454
11446
* updating the fb pointer, and returning without touching the
@@ -12945,7 +12937,7 @@ void intel_modeset_setup_hw_state(struct drm_device *dev,
12945
12937
void intel_modeset_gem_init (struct drm_device * dev )
12946
12938
{
12947
12939
struct drm_crtc * c ;
12948
- struct intel_framebuffer * fb ;
12940
+ struct drm_i915_gem_object * obj ;
12949
12941
12950
12942
mutex_lock (& dev -> struct_mutex );
12951
12943
intel_init_gt_powersave (dev );
@@ -12962,11 +12954,11 @@ void intel_modeset_gem_init(struct drm_device *dev)
12962
12954
*/
12963
12955
mutex_lock (& dev -> struct_mutex );
12964
12956
for_each_crtc (dev , c ) {
12965
- if (!c -> primary -> fb )
12957
+ obj = intel_fb_obj (c -> primary -> fb );
12958
+ if (obj == NULL )
12966
12959
continue ;
12967
12960
12968
- fb = to_intel_framebuffer (c -> primary -> fb );
12969
- if (intel_pin_and_fence_fb_obj (dev , fb -> obj , NULL )) {
12961
+ if (intel_pin_and_fence_fb_obj (dev , obj , NULL )) {
12970
12962
DRM_ERROR ("failed to pin boot fb on pipe %d\n" ,
12971
12963
to_intel_crtc (c )-> pipe );
12972
12964
drm_framebuffer_unreference (c -> primary -> fb );
0 commit comments