@@ -42,6 +42,38 @@ static const u32 sunxi_rgb2yuv_coef[12] = {
42
42
0x000001c1 , 0x00003e88 , 0x00003fb8 , 0x00000808
43
43
};
44
44
45
+ static inline bool sun4i_backend_format_is_planar_yuv (uint32_t format )
46
+ {
47
+ switch (format ) {
48
+ case DRM_FORMAT_YUV411 :
49
+ case DRM_FORMAT_YUV422 :
50
+ case DRM_FORMAT_YUV444 :
51
+ return true;
52
+ default :
53
+ return false;
54
+ }
55
+ }
56
+
57
+ static inline bool sun4i_backend_format_is_packed_yuv422 (uint32_t format )
58
+ {
59
+ switch (format ) {
60
+ case DRM_FORMAT_YUYV :
61
+ case DRM_FORMAT_YVYU :
62
+ case DRM_FORMAT_UYVY :
63
+ case DRM_FORMAT_VYUY :
64
+ return true;
65
+
66
+ default :
67
+ return false;
68
+ }
69
+ }
70
+
71
+ static inline bool sun4i_backend_format_is_yuv (uint32_t format )
72
+ {
73
+ return sun4i_backend_format_is_planar_yuv (format ) ||
74
+ sun4i_backend_format_is_packed_yuv422 (format );
75
+ }
76
+
45
77
static void sun4i_backend_apply_color_correction (struct sunxi_engine * engine )
46
78
{
47
79
int i ;
@@ -330,6 +362,7 @@ static int sun4i_backend_atomic_check(struct sunxi_engine *engine,
330
362
unsigned int num_planes = 0 ;
331
363
unsigned int num_alpha_planes = 0 ;
332
364
unsigned int num_frontend_planes = 0 ;
365
+ unsigned int num_yuv_planes = 0 ;
333
366
unsigned int current_pipe = 0 ;
334
367
unsigned int i ;
335
368
@@ -362,6 +395,11 @@ static int sun4i_backend_atomic_check(struct sunxi_engine *engine,
362
395
if (fb -> format -> has_alpha )
363
396
num_alpha_planes ++ ;
364
397
398
+ if (sun4i_backend_format_is_yuv (fb -> format -> format )) {
399
+ DRM_DEBUG_DRIVER ("Plane FB format is YUV\n" );
400
+ num_yuv_planes ++ ;
401
+ }
402
+
365
403
DRM_DEBUG_DRIVER ("Plane zpos is %d\n" ,
366
404
plane_state -> normalized_zpos );
367
405
@@ -430,13 +468,20 @@ static int sun4i_backend_atomic_check(struct sunxi_engine *engine,
430
468
s_state -> pipe = current_pipe ;
431
469
}
432
470
471
+ /* We can only have a single YUV plane at a time */
472
+ if (num_yuv_planes > SUN4I_BACKEND_NUM_YUV_PLANES ) {
473
+ DRM_DEBUG_DRIVER ("Too many planes with YUV, rejecting...\n" );
474
+ return - EINVAL ;
475
+ }
476
+
433
477
if (num_frontend_planes > SUN4I_BACKEND_NUM_FRONTEND_LAYERS ) {
434
478
DRM_DEBUG_DRIVER ("Too many planes going through the frontend, rejecting\n" );
435
479
return - EINVAL ;
436
480
}
437
481
438
- DRM_DEBUG_DRIVER ("State valid with %u planes, %u alpha, %u video\n" ,
439
- num_planes , num_alpha_planes , num_frontend_planes );
482
+ DRM_DEBUG_DRIVER ("State valid with %u planes, %u alpha, %u video, %u YUV\n" ,
483
+ num_planes , num_alpha_planes , num_frontend_planes ,
484
+ num_yuv_planes );
440
485
441
486
return 0 ;
442
487
}
0 commit comments