@@ -2954,71 +2954,6 @@ static void intel_update_pipe_size(struct intel_crtc *crtc)
2954
2954
crtc -> config .pipe_src_h = adjusted_mode -> crtc_vdisplay ;
2955
2955
}
2956
2956
2957
- static int
2958
- intel_pipe_set_base (struct drm_crtc * crtc , int x , int y ,
2959
- struct drm_framebuffer * fb )
2960
- {
2961
- struct drm_device * dev = crtc -> dev ;
2962
- struct drm_i915_private * dev_priv = dev -> dev_private ;
2963
- struct intel_crtc * intel_crtc = to_intel_crtc (crtc );
2964
- enum pipe pipe = intel_crtc -> pipe ;
2965
- struct drm_framebuffer * old_fb = crtc -> primary -> fb ;
2966
- struct drm_i915_gem_object * old_obj = intel_fb_obj (old_fb );
2967
- int ret ;
2968
-
2969
- if (intel_crtc_has_pending_flip (crtc )) {
2970
- DRM_ERROR ("pipe is still busy with an old pageflip\n" );
2971
- return - EBUSY ;
2972
- }
2973
-
2974
- /* no fb bound */
2975
- if (!fb ) {
2976
- DRM_ERROR ("No FB bound\n" );
2977
- return 0 ;
2978
- }
2979
-
2980
- if (intel_crtc -> plane > INTEL_INFO (dev )-> num_pipes ) {
2981
- DRM_ERROR ("no plane for crtc: plane %c, num_pipes %d\n" ,
2982
- plane_name (intel_crtc -> plane ),
2983
- INTEL_INFO (dev )-> num_pipes );
2984
- return - EINVAL ;
2985
- }
2986
-
2987
- mutex_lock (& dev -> struct_mutex );
2988
- ret = intel_pin_and_fence_fb_obj (crtc -> primary , fb , NULL );
2989
- if (ret == 0 )
2990
- i915_gem_track_fb (old_obj , intel_fb_obj (fb ),
2991
- INTEL_FRONTBUFFER_PRIMARY (pipe ));
2992
- mutex_unlock (& dev -> struct_mutex );
2993
- if (ret != 0 ) {
2994
- DRM_ERROR ("pin & fence failed\n" );
2995
- return ret ;
2996
- }
2997
-
2998
- dev_priv -> display .update_primary_plane (crtc , fb , x , y );
2999
-
3000
- if (intel_crtc -> active )
3001
- intel_frontbuffer_flip (dev , INTEL_FRONTBUFFER_PRIMARY (pipe ));
3002
-
3003
- crtc -> primary -> fb = fb ;
3004
- crtc -> x = x ;
3005
- crtc -> y = y ;
3006
-
3007
- if (old_fb ) {
3008
- if (intel_crtc -> active && old_fb != fb )
3009
- intel_wait_for_vblank (dev , intel_crtc -> pipe );
3010
- mutex_lock (& dev -> struct_mutex );
3011
- intel_unpin_fb_obj (old_obj );
3012
- mutex_unlock (& dev -> struct_mutex );
3013
- }
3014
-
3015
- mutex_lock (& dev -> struct_mutex );
3016
- intel_update_fbc (dev );
3017
- mutex_unlock (& dev -> struct_mutex );
3018
-
3019
- return 0 ;
3020
- }
3021
-
3022
2957
static void intel_fdi_normal_train (struct drm_crtc * crtc )
3023
2958
{
3024
2959
struct drm_device * dev = crtc -> dev ;
@@ -5312,23 +5247,14 @@ static void intel_crtc_disable(struct drm_crtc *crtc)
5312
5247
struct drm_device * dev = crtc -> dev ;
5313
5248
struct drm_connector * connector ;
5314
5249
struct drm_i915_private * dev_priv = dev -> dev_private ;
5315
- struct drm_i915_gem_object * old_obj = intel_fb_obj (crtc -> primary -> fb );
5316
- enum pipe pipe = to_intel_crtc (crtc )-> pipe ;
5317
5250
5318
5251
/* crtc should still be enabled when we disable it. */
5319
5252
WARN_ON (!crtc -> enabled );
5320
5253
5321
5254
dev_priv -> display .crtc_disable (crtc );
5322
5255
dev_priv -> display .off (crtc );
5323
5256
5324
- if (crtc -> primary -> fb ) {
5325
- mutex_lock (& dev -> struct_mutex );
5326
- intel_unpin_fb_obj (old_obj );
5327
- i915_gem_track_fb (old_obj , NULL ,
5328
- INTEL_FRONTBUFFER_PRIMARY (pipe ));
5329
- mutex_unlock (& dev -> struct_mutex );
5330
- crtc -> primary -> fb = NULL ;
5331
- }
5257
+ crtc -> primary -> funcs -> disable_plane (crtc -> primary );
5332
5258
5333
5259
/* Update computed state. */
5334
5260
list_for_each_entry (connector , & dev -> mode_config .connector_list , head ) {
@@ -9691,6 +9617,8 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
9691
9617
struct drm_framebuffer * old_fb = crtc -> primary -> fb ;
9692
9618
struct drm_i915_gem_object * obj = intel_fb_obj (fb );
9693
9619
struct intel_crtc * intel_crtc = to_intel_crtc (crtc );
9620
+ struct drm_plane * primary = crtc -> primary ;
9621
+ struct intel_plane * intel_plane = to_intel_plane (primary );
9694
9622
enum pipe pipe = intel_crtc -> pipe ;
9695
9623
struct intel_unpin_work * work ;
9696
9624
struct intel_engine_cs * ring ;
@@ -9849,8 +9777,15 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
9849
9777
9850
9778
if (ret == - EIO ) {
9851
9779
out_hang :
9852
- intel_crtc_wait_for_pending_flips (crtc );
9853
- ret = intel_pipe_set_base (crtc , crtc -> x , crtc -> y , fb );
9780
+ ret = primary -> funcs -> update_plane (primary , crtc , fb ,
9781
+ intel_plane -> crtc_x ,
9782
+ intel_plane -> crtc_y ,
9783
+ intel_plane -> crtc_h ,
9784
+ intel_plane -> crtc_w ,
9785
+ intel_plane -> src_x ,
9786
+ intel_plane -> src_y ,
9787
+ intel_plane -> src_h ,
9788
+ intel_plane -> src_w );
9854
9789
if (ret == 0 && event ) {
9855
9790
spin_lock_irq (& dev -> event_lock );
9856
9791
drm_send_vblank_event (dev , pipe , event );
@@ -11079,26 +11014,15 @@ static int __intel_set_mode(struct drm_crtc *crtc,
11079
11014
* on the DPLL.
11080
11015
*/
11081
11016
for_each_intel_crtc_masked (dev , modeset_pipes , intel_crtc ) {
11082
- struct drm_framebuffer * old_fb = crtc -> primary -> fb ;
11083
- struct drm_i915_gem_object * old_obj = intel_fb_obj (old_fb );
11084
- struct drm_i915_gem_object * obj = intel_fb_obj (fb );
11017
+ struct drm_plane * primary = intel_crtc -> base .primary ;
11018
+ int vdisplay , hdisplay ;
11085
11019
11086
- mutex_lock (& dev -> struct_mutex );
11087
- ret = intel_pin_and_fence_fb_obj (crtc -> primary , fb , NULL );
11088
- if (ret != 0 ) {
11089
- DRM_ERROR ("pin & fence failed\n" );
11090
- mutex_unlock (& dev -> struct_mutex );
11091
- goto done ;
11092
- }
11093
- if (old_fb )
11094
- intel_unpin_fb_obj (old_obj );
11095
- i915_gem_track_fb (old_obj , obj ,
11096
- INTEL_FRONTBUFFER_PRIMARY (intel_crtc -> pipe ));
11097
- mutex_unlock (& dev -> struct_mutex );
11098
-
11099
- crtc -> primary -> fb = fb ;
11100
- crtc -> x = x ;
11101
- crtc -> y = y ;
11020
+ drm_crtc_get_hv_timing (mode , & hdisplay , & vdisplay );
11021
+ ret = primary -> funcs -> update_plane (primary , & intel_crtc -> base ,
11022
+ fb , 0 , 0 ,
11023
+ hdisplay , vdisplay ,
11024
+ x << 16 , y << 16 ,
11025
+ hdisplay << 16 , vdisplay << 16 );
11102
11026
}
11103
11027
11104
11028
/* Now enable the clocks, plane, pipe, and connectors that we set up. */
@@ -11564,11 +11488,14 @@ static int intel_crtc_set_config(struct drm_mode_set *set)
11564
11488
disable_pipes );
11565
11489
} else if (config -> fb_changed ) {
11566
11490
struct intel_crtc * intel_crtc = to_intel_crtc (set -> crtc );
11567
-
11568
- intel_crtc_wait_for_pending_flips (set -> crtc );
11569
-
11570
- ret = intel_pipe_set_base (set -> crtc ,
11571
- set -> x , set -> y , set -> fb );
11491
+ struct drm_plane * primary = set -> crtc -> primary ;
11492
+ int vdisplay , hdisplay ;
11493
+
11494
+ drm_crtc_get_hv_timing (set -> mode , & hdisplay , & vdisplay );
11495
+ ret = primary -> funcs -> update_plane (primary , set -> crtc , set -> fb ,
11496
+ 0 , 0 , hdisplay , vdisplay ,
11497
+ set -> x << 16 , set -> y << 16 ,
11498
+ hdisplay << 16 , vdisplay << 16 );
11572
11499
11573
11500
/*
11574
11501
* We need to make sure the primary plane is re-enabled if it
0 commit comments