0
0
mirror of https://git.openwrt.org/openwrt/openwrt.git synced 2025-09-22 16:19:27 +00:00
Files
openwrt/target/linux/bcm27xx/patches-5.15/950-0156-drm-v3d-Skip-MMU-flush-if-the-device-is-currently-of.patch
Hauke Mehrtens f15fa8b343 kernel: Update to version 5.15.174
Manually adapted the following patches:
   bcm27xx/patches-5.15/950-0156-drm-v3d-Skip-MMU-flush-if-the-device-is-currently-of.patch
   bcm27xx/patches-5.15/950-0173-drm-v3d-Delete-pm_runtime-support.patch
   generic/hack-5.15/780-usb-net-MeigLink_modem_support.patch

Link: https://github.com/openwrt/openwrt/pull/18012
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
2025-04-13 02:53:07 +02:00

53 lines
1.4 KiB
Diff

From 15d0d4bb7c817c3cbcdb276d911b9e93a0c825e9 Mon Sep 17 00:00:00 2001
From: Eric Anholt <eric@anholt.net>
Date: Mon, 14 Jan 2019 12:35:43 -0800
Subject: [PATCH] drm/v3d: Skip MMU flush if the device is currently
off.
If it's off, we know it will be reset on poweron, so the MMU won't
have any TLB cached from before this point. Avoids failed waits for
MMU flush to reply.
Signed-off-by: Eric Anholt <eric@anholt.net>
(cherry picked from commit 3ee4e2e0a9e9587eacbb69b067bbc72ab2cdc47b)
---
drivers/gpu/drm/v3d/v3d_mmu.c | 13 +++++++++++++
1 file changed, 13 insertions(+)
--- a/drivers/gpu/drm/v3d/v3d_mmu.c
+++ b/drivers/gpu/drm/v3d/v3d_mmu.c
@@ -18,6 +18,8 @@
* each client. This is not yet implemented.
*/
+#include <linux/pm_runtime.h>
+
#include "v3d_drv.h"
#include "v3d_regs.h"
@@ -34,6 +36,14 @@ static int v3d_mmu_flush_all(struct v3d_
{
int ret;
+ /* Keep power on the device on until we're done with this
+ * call, but skip the flush if the device is off and will be
+ * reset when powered back on.
+ */
+ ret = pm_runtime_get_if_in_use(v3d->dev);
+ if (ret == 0)
+ return 0;
+
V3D_WRITE(V3D_MMUC_CONTROL, V3D_MMUC_CONTROL_FLUSH |
V3D_MMUC_CONTROL_ENABLE);
@@ -52,6 +62,9 @@ static int v3d_mmu_flush_all(struct v3d_
if (ret)
dev_err(v3d->drm.dev, "MMU TLB clear wait idle failed\n");
+ pm_runtime_mark_last_busy(v3d->dev);
+ pm_runtime_put_autosuspend(v3d->dev);
+
return ret;
}