129 lines
4.4 KiB
Diff
129 lines
4.4 KiB
Diff
From bb2b068209d73b320cac7222a3b8ecef9b0dcc9a Mon Sep 17 00:00:00 2001
|
|
From: Maxime Ripard <maxime@cerno.tech>
|
|
Date: Thu, 6 Feb 2020 14:46:14 +0100
|
|
Subject: [PATCH] drm/vc4: plane: Register all the planes at once
|
|
|
|
Instead of creating planes for each CRTC, we eventually want to create all
|
|
the planes for each CRTCs.
|
|
|
|
In order to make that more convenient, let's iterate on the CRTCs in the
|
|
plane creation function instead of its caller.
|
|
|
|
Signed-off-by: Maxime Ripard <maxime@cerno.tech>
|
|
---
|
|
drivers/gpu/drm/vc4/vc4_drv.c | 9 ++----
|
|
drivers/gpu/drm/vc4/vc4_drv.h | 3 +-
|
|
drivers/gpu/drm/vc4/vc4_plane.c | 54 +++++++++++++++++----------------
|
|
3 files changed, 32 insertions(+), 34 deletions(-)
|
|
|
|
--- a/drivers/gpu/drm/vc4/vc4_drv.c
|
|
+++ b/drivers/gpu/drm/vc4/vc4_drv.c
|
|
@@ -253,7 +253,6 @@ static int vc4_drm_bind(struct device *d
|
|
{
|
|
struct platform_device *pdev = to_platform_device(dev);
|
|
struct drm_device *drm;
|
|
- struct drm_crtc *crtc;
|
|
struct vc4_dev *vc4;
|
|
struct device_node *node;
|
|
int ret = 0;
|
|
@@ -292,11 +291,9 @@ static int vc4_drm_bind(struct device *d
|
|
if (ret)
|
|
goto gem_destroy;
|
|
|
|
- drm_for_each_crtc(crtc, drm) {
|
|
- ret = vc4_plane_create_additional_planes(drm, crtc);
|
|
- if (ret)
|
|
- continue;
|
|
- }
|
|
+ ret = vc4_plane_create_additional_planes(drm);
|
|
+ if (ret)
|
|
+ goto unbind_all;
|
|
|
|
drm_fb_helper_remove_conflicting_framebuffers(NULL, "vc4drmfb", false);
|
|
|
|
--- a/drivers/gpu/drm/vc4/vc4_drv.h
|
|
+++ b/drivers/gpu/drm/vc4/vc4_drv.h
|
|
@@ -855,8 +855,7 @@ int vc4_kms_load(struct drm_device *dev)
|
|
/* vc4_plane.c */
|
|
struct drm_plane *vc4_plane_init(struct drm_device *dev,
|
|
enum drm_plane_type type);
|
|
-int vc4_plane_create_additional_planes(struct drm_device *dev,
|
|
- struct drm_crtc *crtc);
|
|
+int vc4_plane_create_additional_planes(struct drm_device *dev);
|
|
u32 vc4_plane_write_dlist(struct drm_plane *plane, u32 __iomem *dlist);
|
|
u32 vc4_plane_dlist_size(const struct drm_plane_state *state);
|
|
void vc4_plane_async_set_fb(struct drm_plane *plane,
|
|
--- a/drivers/gpu/drm/vc4/vc4_plane.c
|
|
+++ b/drivers/gpu/drm/vc4/vc4_plane.c
|
|
@@ -1448,39 +1448,41 @@ struct drm_plane *vc4_plane_init(struct
|
|
return plane;
|
|
}
|
|
|
|
-int vc4_plane_create_additional_planes(struct drm_device *drm,
|
|
- struct drm_crtc *crtc)
|
|
+int vc4_plane_create_additional_planes(struct drm_device *drm)
|
|
{
|
|
struct drm_plane *cursor_plane;
|
|
+ struct drm_crtc *crtc;
|
|
unsigned int i;
|
|
|
|
- /* Set up some arbitrary number of planes. We're not limited
|
|
- * by a set number of physical registers, just the space in
|
|
- * the HVS (16k) and how small an plane can be (28 bytes).
|
|
- * However, each plane we set up takes up some memory, and
|
|
- * increases the cost of looping over planes, which atomic
|
|
- * modesetting does quite a bit. As a result, we pick a
|
|
- * modest number of planes to expose, that should hopefully
|
|
- * still cover any sane usecase.
|
|
- */
|
|
- for (i = 0; i < 8; i++) {
|
|
- struct drm_plane *plane =
|
|
- vc4_plane_init(drm, DRM_PLANE_TYPE_OVERLAY);
|
|
-
|
|
- if (IS_ERR(plane))
|
|
- continue;
|
|
-
|
|
- plane->possible_crtcs = drm_crtc_mask(crtc);
|
|
- }
|
|
-
|
|
- /* Set up the legacy cursor after overlay initialization,
|
|
- * since we overlay planes on the CRTC in the order they were
|
|
- * initialized.
|
|
- */
|
|
- cursor_plane = vc4_plane_init(drm, DRM_PLANE_TYPE_CURSOR);
|
|
- if (!IS_ERR(cursor_plane)) {
|
|
- cursor_plane->possible_crtcs = drm_crtc_mask(crtc);
|
|
- crtc->cursor = cursor_plane;
|
|
+ drm_for_each_crtc(crtc, drm) {
|
|
+ /* Set up some arbitrary number of planes. We're not limited
|
|
+ * by a set number of physical registers, just the space in
|
|
+ * the HVS (16k) and how small an plane can be (28 bytes).
|
|
+ * However, each plane we set up takes up some memory, and
|
|
+ * increases the cost of looping over planes, which atomic
|
|
+ * modesetting does quite a bit. As a result, we pick a
|
|
+ * modest number of planes to expose, that should hopefully
|
|
+ * still cover any sane usecase.
|
|
+ */
|
|
+ for (i = 0; i < 8; i++) {
|
|
+ struct drm_plane *plane =
|
|
+ vc4_plane_init(drm, DRM_PLANE_TYPE_OVERLAY);
|
|
+
|
|
+ if (IS_ERR(plane))
|
|
+ continue;
|
|
+
|
|
+ plane->possible_crtcs = drm_crtc_mask(crtc);
|
|
+ }
|
|
+
|
|
+ /* Set up the legacy cursor after overlay initialization,
|
|
+ * since we overlay planes on the CRTC in the order they were
|
|
+ * initialized.
|
|
+ */
|
|
+ cursor_plane = vc4_plane_init(drm, DRM_PLANE_TYPE_CURSOR);
|
|
+ if (!IS_ERR(cursor_plane)) {
|
|
+ cursor_plane->possible_crtcs = drm_crtc_mask(crtc);
|
|
+ crtc->cursor = cursor_plane;
|
|
+ }
|
|
}
|
|
|
|
return 0;
|