@@ -48,7 +48,7 @@ struct vc4_fkms {
48
48
bool bcm2711 ;
49
49
};
50
50
51
- #define PLANES_PER_CRTC 3
51
+ #define PLANES_PER_CRTC 8
52
52
53
53
struct set_plane {
54
54
u8 display ;
@@ -1725,15 +1725,15 @@ static int vc4_fkms_create_screen(struct device *dev, struct drm_device *drm,
1725
1725
struct vc4_crtc * vc4_crtc ;
1726
1726
struct vc4_fkms_encoder * vc4_encoder ;
1727
1727
struct drm_crtc * crtc ;
1728
- struct drm_plane * primary_plane , * overlay_plane , * cursor_plane ;
1729
1728
struct drm_plane * destroy_plane , * temp ;
1730
1729
struct mailbox_blank_display blank = {
1731
1730
.tag1 = {RPI_FIRMWARE_FRAMEBUFFER_SET_DISPLAY_NUM , 4 , 0 , },
1732
1731
.display = display_idx ,
1733
1732
.tag2 = { RPI_FIRMWARE_FRAMEBUFFER_BLANK , 4 , 0 , },
1734
1733
.blank = 1 ,
1735
1734
};
1736
- int ret ;
1735
+ struct drm_plane * planes [PLANES_PER_CRTC ];
1736
+ int ret , i ;
1737
1737
1738
1738
vc4_crtc = devm_kzalloc (dev , sizeof (* vc4_crtc ), GFP_KERNEL );
1739
1739
if (!vc4_crtc )
@@ -1746,38 +1746,26 @@ static int vc4_fkms_create_screen(struct device *dev, struct drm_device *drm,
1746
1746
/* Blank the firmware provided framebuffer */
1747
1747
rpi_firmware_property_list (vc4 -> firmware , & blank , sizeof (blank ));
1748
1748
1749
- primary_plane = vc4_fkms_plane_init (drm , DRM_PLANE_TYPE_PRIMARY ,
1750
- display_ref ,
1751
- 0 + (display_idx * PLANES_PER_CRTC )
1752
- );
1753
- if (IS_ERR (primary_plane )) {
1754
- dev_err (dev , "failed to construct primary plane\n" );
1755
- ret = PTR_ERR (primary_plane );
1756
- goto err ;
1757
- }
1758
-
1759
- overlay_plane = vc4_fkms_plane_init (drm , DRM_PLANE_TYPE_OVERLAY ,
1760
- display_ref ,
1761
- 1 + (display_idx * PLANES_PER_CRTC )
1762
- );
1763
- if (IS_ERR (overlay_plane )) {
1764
- dev_err (dev , "failed to construct overlay plane\n" );
1765
- ret = PTR_ERR (overlay_plane );
1766
- goto err ;
1767
- }
1768
-
1769
- cursor_plane = vc4_fkms_plane_init (drm , DRM_PLANE_TYPE_CURSOR ,
1770
- display_ref ,
1771
- 2 + (display_idx * PLANES_PER_CRTC )
1772
- );
1773
- if (IS_ERR (cursor_plane )) {
1774
- dev_err (dev , "failed to construct cursor plane\n" );
1775
- ret = PTR_ERR (cursor_plane );
1776
- goto err ;
1749
+ for (i = 0 ; i < PLANES_PER_CRTC ; i ++ ) {
1750
+ planes [i ] = vc4_fkms_plane_init (drm ,
1751
+ (i == 0 ) ?
1752
+ DRM_PLANE_TYPE_PRIMARY :
1753
+ (i == PLANES_PER_CRTC - 1 ) ?
1754
+ DRM_PLANE_TYPE_CURSOR :
1755
+ DRM_PLANE_TYPE_OVERLAY ,
1756
+ display_ref ,
1757
+ i + (display_idx * PLANES_PER_CRTC )
1758
+ );
1759
+ if (IS_ERR (planes [i ])) {
1760
+ dev_err (dev , "failed to construct plane %u\n" , i );
1761
+ ret = PTR_ERR (planes [i ]);
1762
+ goto err ;
1763
+ }
1777
1764
}
1778
1765
1779
- drm_crtc_init_with_planes (drm , crtc , primary_plane , cursor_plane ,
1780
- & vc4_crtc_funcs , NULL );
1766
+ drm_crtc_init_with_planes (drm , crtc , planes [0 ],
1767
+ planes [PLANES_PER_CRTC - 1 ], & vc4_crtc_funcs ,
1768
+ NULL );
1781
1769
drm_crtc_helper_add (crtc , & vc4_crtc_helper_funcs );
1782
1770
1783
1771
vc4_encoder = devm_kzalloc (dev , sizeof (* vc4_encoder ), GFP_KERNEL );
0 commit comments