@@ -55,6 +55,8 @@ struct mdp5_crtc {
55
55
56
56
struct completion pp_completion ;
57
57
58
+ bool lm_cursor_enabled ;
59
+
58
60
struct {
59
61
/* protect REG_MDP5_LM_CURSOR* registers and cursor scanout_bo*/
60
62
spinlock_t lock ;
@@ -457,19 +459,24 @@ static void mdp5_crtc_atomic_enable(struct drm_crtc *crtc,
457
459
458
460
pm_runtime_get_sync (dev );
459
461
460
- /* Restore cursor state, as it might have been lost with suspend: */
461
- if (mdp5_crtc -> cursor .iova ) {
462
- unsigned long flags ;
463
-
464
- spin_lock_irqsave (& mdp5_crtc -> cursor .lock , flags );
465
- mdp5_crtc_restore_cursor (crtc );
466
- spin_unlock_irqrestore (& mdp5_crtc -> cursor .lock , flags );
467
-
468
- mdp5_ctl_set_cursor (mdp5_cstate -> ctl ,
469
- & mdp5_cstate -> pipeline , 0 , true);
470
- } else {
471
- mdp5_ctl_set_cursor (mdp5_cstate -> ctl ,
472
- & mdp5_cstate -> pipeline , 0 , false);
462
+ if (mdp5_crtc -> lm_cursor_enabled ) {
463
+ /*
464
+ * Restore LM cursor state, as it might have been lost
465
+ * with suspend:
466
+ */
467
+ if (mdp5_crtc -> cursor .iova ) {
468
+ unsigned long flags ;
469
+
470
+ spin_lock_irqsave (& mdp5_crtc -> cursor .lock , flags );
471
+ mdp5_crtc_restore_cursor (crtc );
472
+ spin_unlock_irqrestore (& mdp5_crtc -> cursor .lock , flags );
473
+
474
+ mdp5_ctl_set_cursor (mdp5_cstate -> ctl ,
475
+ & mdp5_cstate -> pipeline , 0 , true);
476
+ } else {
477
+ mdp5_ctl_set_cursor (mdp5_cstate -> ctl ,
478
+ & mdp5_cstate -> pipeline , 0 , false);
479
+ }
473
480
}
474
481
475
482
/* Restore vblank irq handling after power is enabled */
@@ -817,6 +824,12 @@ static int mdp5_crtc_cursor_set(struct drm_crtc *crtc,
817
824
bool cursor_enable = true;
818
825
unsigned long flags ;
819
826
827
+ if (!mdp5_crtc -> lm_cursor_enabled ) {
828
+ dev_warn (dev -> dev ,
829
+ "cursor_set is deprecated with cursor planes\n" );
830
+ return - EINVAL ;
831
+ }
832
+
820
833
if ((width > CURSOR_WIDTH ) || (height > CURSOR_HEIGHT )) {
821
834
dev_err (dev -> dev , "bad cursor size: %dx%d\n" , width , height );
822
835
return - EINVAL ;
@@ -888,10 +901,17 @@ static int mdp5_crtc_cursor_move(struct drm_crtc *crtc, int x, int y)
888
901
struct mdp5_crtc * mdp5_crtc = to_mdp5_crtc (crtc );
889
902
struct mdp5_crtc_state * mdp5_cstate = to_mdp5_crtc_state (crtc -> state );
890
903
uint32_t flush_mask = mdp_ctl_flush_mask_cursor (0 );
904
+ struct drm_device * dev = crtc -> dev ;
891
905
uint32_t roi_w ;
892
906
uint32_t roi_h ;
893
907
unsigned long flags ;
894
908
909
+ if (!mdp5_crtc -> lm_cursor_enabled ) {
910
+ dev_warn (dev -> dev ,
911
+ "cursor_move is deprecated with cursor planes\n" );
912
+ return - EINVAL ;
913
+ }
914
+
895
915
/* don't support LM cursors when we we have source split enabled */
896
916
if (mdp5_cstate -> pipeline .r_mixer )
897
917
return - EINVAL ;
@@ -993,16 +1013,6 @@ static const struct drm_crtc_funcs mdp5_crtc_funcs = {
993
1013
.atomic_print_state = mdp5_crtc_atomic_print_state ,
994
1014
};
995
1015
996
- static const struct drm_crtc_funcs mdp5_crtc_no_lm_cursor_funcs = {
997
- .set_config = drm_atomic_helper_set_config ,
998
- .destroy = mdp5_crtc_destroy ,
999
- .page_flip = drm_atomic_helper_page_flip ,
1000
- .reset = mdp5_crtc_reset ,
1001
- .atomic_duplicate_state = mdp5_crtc_duplicate_state ,
1002
- .atomic_destroy_state = mdp5_crtc_destroy_state ,
1003
- .atomic_print_state = mdp5_crtc_atomic_print_state ,
1004
- };
1005
-
1006
1016
static const struct drm_crtc_helper_funcs mdp5_crtc_helper_funcs = {
1007
1017
.mode_set_nofb = mdp5_crtc_mode_set_nofb ,
1008
1018
.atomic_check = mdp5_crtc_atomic_check ,
@@ -1171,12 +1181,10 @@ struct drm_crtc *mdp5_crtc_init(struct drm_device *dev,
1171
1181
mdp5_crtc -> err .irq = mdp5_crtc_err_irq ;
1172
1182
mdp5_crtc -> pp_done .irq = mdp5_crtc_pp_done_irq ;
1173
1183
1174
- if (cursor_plane )
1175
- drm_crtc_init_with_planes (dev , crtc , plane , cursor_plane ,
1176
- & mdp5_crtc_no_lm_cursor_funcs , NULL );
1177
- else
1178
- drm_crtc_init_with_planes (dev , crtc , plane , NULL ,
1179
- & mdp5_crtc_funcs , NULL );
1184
+ mdp5_crtc -> lm_cursor_enabled = cursor_plane ? false : true;
1185
+
1186
+ drm_crtc_init_with_planes (dev , crtc , plane , cursor_plane ,
1187
+ & mdp5_crtc_funcs , NULL );
1180
1188
1181
1189
drm_flip_work_init (& mdp5_crtc -> unref_cursor_work ,
1182
1190
"unref cursor" , unref_cursor_worker );
0 commit comments