mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-22 06:57:57 +00:00
a34255b795
Removed upstreamed: bcm27xx/patches-5.15/950-0446-drm-vc4-Fix-timings-for-VEC-modes.patch[1] Manually rebased: patches-5.15/950-0600-xhci-quirks-add-link-TRB-quirk-for-VL805.patch bcm27xx/patches-5.15/950-0606-usb-xhci-add-VLI_TRB_CACHE_BUG-quirk.patch bcm27xx/patches-5.15/950-0717-usb-xhci-add-a-quirk-for-Superspeed-bulk-OUT-transfe.patch bcm53xx/patches-5.15/180-usb-xhci-add-support-for-performing-fake-doorbell.patch All other patches automatically rebased 1. https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v5.15.75&id=2810061452f9b748b096ad023d318690ca519aa3 Build system: x86_64 Build-tested: bcm2711/RPi4B, mt7622/RT3200 Run-tested: bcm2711/RPi4B, mt7622/RT3200 Signed-off-by: John Audia <therealgraysky@proton.me>
119 lines
3.7 KiB
Diff
119 lines
3.7 KiB
Diff
From 99c7b8eabae7a6a6e6c5f53f3a9d0996b24e10b3 Mon Sep 17 00:00:00 2001
|
|
From: Maxime Ripard <maxime@cerno.tech>
|
|
Date: Mon, 2 May 2022 15:27:36 +0200
|
|
Subject: [PATCH] drm/vc4: crtc: Move the BO Handling out of Common
|
|
Page-Flip Handler
|
|
|
|
The function vc4_async_page_flip() handles asynchronous page-flips in
|
|
the vc4 driver.
|
|
|
|
However, it mixes some generic code with code that should only be run on
|
|
older generations that have the GPU handled by the vc4 driver.
|
|
|
|
Let's split the generic part out of vc4_async_page_flip() and into a
|
|
common function that we be reusable by an handler made for the BCM2711.
|
|
|
|
Signed-off-by: Maxime Ripard <maxime@cerno.tech>
|
|
---
|
|
drivers/gpu/drm/vc4/vc4_crtc.c | 75 ++++++++++++++++++++++------------
|
|
1 file changed, 48 insertions(+), 27 deletions(-)
|
|
|
|
--- a/drivers/gpu/drm/vc4/vc4_crtc.c
|
|
+++ b/drivers/gpu/drm/vc4/vc4_crtc.c
|
|
@@ -896,40 +896,19 @@ static int vc4_async_set_fence_cb(struct
|
|
return 0;
|
|
}
|
|
|
|
-/* Implements async (non-vblank-synced) page flips.
|
|
- *
|
|
- * The page flip ioctl needs to return immediately, so we grab the
|
|
- * modeset semaphore on the pipe, and queue the address update for
|
|
- * when V3D is done with the BO being flipped to.
|
|
- */
|
|
-static int vc4_async_page_flip(struct drm_crtc *crtc,
|
|
- struct drm_framebuffer *fb,
|
|
- struct drm_pending_vblank_event *event,
|
|
- uint32_t flags)
|
|
+static int
|
|
+vc4_async_page_flip_common(struct drm_crtc *crtc,
|
|
+ struct drm_framebuffer *fb,
|
|
+ struct drm_pending_vblank_event *event,
|
|
+ uint32_t flags)
|
|
{
|
|
struct drm_device *dev = crtc->dev;
|
|
struct drm_plane *plane = crtc->primary;
|
|
- int ret = 0;
|
|
struct vc4_async_flip_state *flip_state;
|
|
- struct drm_gem_cma_object *cma_bo = drm_fb_cma_get_gem_obj(fb, 0);
|
|
- struct vc4_bo *bo = to_vc4_bo(&cma_bo->base);
|
|
-
|
|
- /* Increment the BO usecnt here, so that we never end up with an
|
|
- * unbalanced number of vc4_bo_{dec,inc}_usecnt() calls when the
|
|
- * plane is later updated through the non-async path.
|
|
- * FIXME: we should move to generic async-page-flip when it's
|
|
- * available, so that we can get rid of this hand-made prepare_fb()
|
|
- * logic.
|
|
- */
|
|
- ret = vc4_bo_inc_usecnt(bo);
|
|
- if (ret)
|
|
- return ret;
|
|
|
|
flip_state = kzalloc(sizeof(*flip_state), GFP_KERNEL);
|
|
- if (!flip_state) {
|
|
- vc4_bo_dec_usecnt(bo);
|
|
+ if (!flip_state)
|
|
return -ENOMEM;
|
|
- }
|
|
|
|
drm_framebuffer_get(fb);
|
|
flip_state->fb = fb;
|
|
@@ -962,6 +941,48 @@ static int vc4_async_page_flip(struct dr
|
|
return 0;
|
|
}
|
|
|
|
+/* Implements async (non-vblank-synced) page flips.
|
|
+ *
|
|
+ * The page flip ioctl needs to return immediately, so we grab the
|
|
+ * modeset semaphore on the pipe, and queue the address update for
|
|
+ * when V3D is done with the BO being flipped to.
|
|
+ */
|
|
+static int vc4_async_page_flip(struct drm_crtc *crtc,
|
|
+ struct drm_framebuffer *fb,
|
|
+ struct drm_pending_vblank_event *event,
|
|
+ uint32_t flags)
|
|
+{
|
|
+ struct drm_device *dev = crtc->dev;
|
|
+ struct vc4_dev *vc4 = to_vc4_dev(dev);
|
|
+ struct drm_gem_cma_object *cma_bo = drm_fb_cma_get_gem_obj(fb, 0);
|
|
+ struct vc4_bo *bo = to_vc4_bo(&cma_bo->base);
|
|
+ int ret;
|
|
+
|
|
+ if (WARN_ON_ONCE(vc4->is_vc5))
|
|
+ return -ENODEV;
|
|
+
|
|
+ /*
|
|
+ * Increment the BO usecnt here, so that we never end up with an
|
|
+ * unbalanced number of vc4_bo_{dec,inc}_usecnt() calls when the
|
|
+ * plane is later updated through the non-async path.
|
|
+ *
|
|
+ * FIXME: we should move to generic async-page-flip when
|
|
+ * it's available, so that we can get rid of this
|
|
+ * hand-made prepare_fb() logic.
|
|
+ */
|
|
+ ret = vc4_bo_inc_usecnt(bo);
|
|
+ if (ret)
|
|
+ return ret;
|
|
+
|
|
+ ret = vc4_async_page_flip_common(crtc, fb, event, flags);
|
|
+ if (ret) {
|
|
+ vc4_bo_dec_usecnt(bo);
|
|
+ return ret;
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
int vc4_page_flip(struct drm_crtc *crtc,
|
|
struct drm_framebuffer *fb,
|
|
struct drm_pending_vblank_event *event,
|