bcm27xx: update patches from RPi foundation
[openwrt/staging/luka.git] / target / linux / bcm27xx / patches-5.4 / 950-0551-drm-vc4-plane-Register-all-the-planes-at-once.patch
diff --git a/target/linux/bcm27xx/patches-5.4/950-0551-drm-vc4-plane-Register-all-the-planes-at-once.patch b/target/linux/bcm27xx/patches-5.4/950-0551-drm-vc4-plane-Register-all-the-planes-at-once.patch
new file mode 100644 (file)
index 0000000..e917410
--- /dev/null
@@ -0,0 +1,128 @@
+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
+@@ -1438,39 +1438,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;