1 From ac2c812856c3a496354b9f19d0a43458e108844d Mon Sep 17 00:00:00 2001
2 From: Maxime Ripard <maxime@cerno.tech>
3 Date: Thu, 6 Feb 2020 14:32:57 +0100
4 Subject: [PATCH] drm/vc4: plane: Move planes creation to its own
7 The planes so far were created as part of the CRTC binding code with
8 each planes created associated only to one CRTC. However, the hardware
9 in the vc4 doesn't really have such constraint and can be used with any
12 In order to rework this, let's first move the overlay and cursor planes
13 creation to a function of its own.
15 Signed-off-by: Maxime Ripard <maxime@cerno.tech>
17 drivers/gpu/drm/vc4/vc4_crtc.c | 33 ++++------------------------
18 drivers/gpu/drm/vc4/vc4_drv.h | 2 ++
19 drivers/gpu/drm/vc4/vc4_plane.c | 38 +++++++++++++++++++++++++++++++++
20 3 files changed, 44 insertions(+), 29 deletions(-)
22 --- a/drivers/gpu/drm/vc4/vc4_crtc.c
23 +++ b/drivers/gpu/drm/vc4/vc4_crtc.c
24 @@ -1142,7 +1142,7 @@ static int vc4_crtc_bind(struct device *
25 struct drm_device *drm = dev_get_drvdata(master);
26 struct vc4_crtc *vc4_crtc;
27 struct drm_crtc *crtc;
28 - struct drm_plane *primary_plane, *cursor_plane, *destroy_plane, *temp;
29 + struct drm_plane *primary_plane, *destroy_plane, *temp;
30 const struct of_device_id *match;
33 @@ -1190,34 +1190,9 @@ static int vc4_crtc_bind(struct device *
35 drm_crtc_enable_color_mgmt(crtc, 0, true, crtc->gamma_size);
37 - /* Set up some arbitrary number of planes. We're not limited
38 - * by a set number of physical registers, just the space in
39 - * the HVS (16k) and how small an plane can be (28 bytes).
40 - * However, each plane we set up takes up some memory, and
41 - * increases the cost of looping over planes, which atomic
42 - * modesetting does quite a bit. As a result, we pick a
43 - * modest number of planes to expose, that should hopefully
44 - * still cover any sane usecase.
46 - for (i = 0; i < 8; i++) {
47 - struct drm_plane *plane =
48 - vc4_plane_init(drm, DRM_PLANE_TYPE_OVERLAY);
53 - plane->possible_crtcs = drm_crtc_mask(crtc);
56 - /* Set up the legacy cursor after overlay initialization,
57 - * since we overlay planes on the CRTC in the order they were
60 - cursor_plane = vc4_plane_init(drm, DRM_PLANE_TYPE_CURSOR);
61 - if (!IS_ERR(cursor_plane)) {
62 - cursor_plane->possible_crtcs = drm_crtc_mask(crtc);
63 - crtc->cursor = cursor_plane;
65 + ret = vc4_plane_create_additional_planes(drm, crtc);
67 + goto err_destroy_planes;
69 vc4_crtc_get_cob_allocation(vc4_crtc);
71 --- a/drivers/gpu/drm/vc4/vc4_drv.h
72 +++ b/drivers/gpu/drm/vc4/vc4_drv.h
73 @@ -855,6 +855,8 @@ int vc4_kms_load(struct drm_device *dev)
75 struct drm_plane *vc4_plane_init(struct drm_device *dev,
76 enum drm_plane_type type);
77 +int vc4_plane_create_additional_planes(struct drm_device *dev,
78 + struct drm_crtc *crtc);
79 u32 vc4_plane_write_dlist(struct drm_plane *plane, u32 __iomem *dlist);
80 u32 vc4_plane_dlist_size(const struct drm_plane_state *state);
81 void vc4_plane_async_set_fb(struct drm_plane *plane,
82 --- a/drivers/gpu/drm/vc4/vc4_plane.c
83 +++ b/drivers/gpu/drm/vc4/vc4_plane.c
84 @@ -1447,3 +1447,41 @@ struct drm_plane *vc4_plane_init(struct
89 +int vc4_plane_create_additional_planes(struct drm_device *drm,
90 + struct drm_crtc *crtc)
92 + struct drm_plane *cursor_plane;
95 + /* Set up some arbitrary number of planes. We're not limited
96 + * by a set number of physical registers, just the space in
97 + * the HVS (16k) and how small an plane can be (28 bytes).
98 + * However, each plane we set up takes up some memory, and
99 + * increases the cost of looping over planes, which atomic
100 + * modesetting does quite a bit. As a result, we pick a
101 + * modest number of planes to expose, that should hopefully
102 + * still cover any sane usecase.
104 + for (i = 0; i < 8; i++) {
105 + struct drm_plane *plane =
106 + vc4_plane_init(drm, DRM_PLANE_TYPE_OVERLAY);
111 + plane->possible_crtcs = drm_crtc_mask(crtc);
114 + /* Set up the legacy cursor after overlay initialization,
115 + * since we overlay planes on the CRTC in the order they were
118 + cursor_plane = vc4_plane_init(drm, DRM_PLANE_TYPE_CURSOR);
119 + if (!IS_ERR(cursor_plane)) {
120 + cursor_plane->possible_crtcs = drm_crtc_mask(crtc);
121 + crtc->cursor = cursor_plane;