* [PATCH v6 0/5] drm/v3d: Fix GPU reset issues on the Raspberry Pi 5
@ 2025-03-18 1:01 Maíra Canal
2025-03-18 1:01 ` [PATCH v6 1/5] drm/v3d: Associate a V3D tech revision to all supported devices Maíra Canal
` (5 more replies)
0 siblings, 6 replies; 14+ messages in thread
From: Maíra Canal @ 2025-03-18 1:01 UTC (permalink / raw)
To: Melissa Wen, Iago Toral, Krzysztof Kozlowski, Conor Dooley,
Nicolas Saenz Julienne, Stefan Wahren, Florian Fainelli
Cc: Phil Elwell, dri-devel, devicetree, kernel-dev, Maíra Canal,
Krzysztof Kozlowski, Emma Anholt, Rob Herring (Arm)
This series addresses GPU reset issues reported in [1], where running a
long compute job would trigger repeated GPU resets, leading to a UI
freeze.
The patches that prevent the same faulty job from being resubmitted in a
loop were merged in drm-misc/drm-misc-fixes in v4.
However, those patches don't solve the issue entirely. Even with a single
GPU reset, the UI still freezes on the Raspberry Pi 5, indicating a GPU
hang. Patches #1, #3, and #5 address this by properly configuring the
V3D_SMS registers, which are required for power management and resets
in V3D 7.1.
Patches #2 and #4 are associated changes related to the robustness
of the DT bindings. Patch #3 added a new register bank to the DT binding
and during the reviewing process, we identified points that could to be
improved in the DT binding.
Patch #2 started by adding per-compatible register restrictions to ensure
that the DTB accurately reflects the hardware design and #5 updates the DT
maintainership, replacing Emma with the current v3d driver maintainer.
[1] https://github.com/raspberrypi/linux/issues/6660
Best Regards,
- Maíra
---
v1 -> v2:
- [1/6, 2/6, 5/6] Add Iago's R-b (Iago Toral)
- [3/6] Use V3D_GEN_* macros consistently throughout the driver (Phil Elwell)
- [3/6] Don't add Iago's R-b in 3/6 due to changes in the patch
- [4/6] Add per-compatible restrictions to enforce per‐SoC register rules (Conor Dooley)
- [6/6] Add Emma's A-b, collected through IRC (Emma Anholt)
- [6/6] Add Rob's A-b (Rob Herring)
- Link to v1: https://lore.kernel.org/r/20250226-v3d-gpu-reset-fixes-v1-0-83a969fdd9c1@igalia.com
v2 -> v3:
- [3/7] Add Iago's R-b (Iago Toral)
- [4/7, 5/7] Separate the patches to ease the reviewing process -> Now,
PATCH 4/7 only adds the per-compatible rules and PATCH 5/7 adds the
SMS registers
- [4/7] `allOf` goes above `additionalProperties` (Krzysztof Kozlowski)
- [4/7, 5/7] Sync `reg` and `reg-names` items (Krzysztof Kozlowski)
- Link to v2: https://lore.kernel.org/r/20250308-v3d-gpu-reset-fixes-v2-0-2939c30f0cc4@igalia.com
v3 -> v4:
- [4/7] BCM2712 has an external reset controller, therefore the "bridge"
register is not needed (Krzysztof Kozlowski)
- [4/7] Remove the word "required" from the reg descriptions (Rob Herring)
- [5/7] Improve commit message (Rob Herring)
- Link to v3: https://lore.kernel.org/r/20250311-v3d-gpu-reset-fixes-v3-0-64f7a4247ec0@igalia.com
v4 -> v5:
- [1/7, 2/7] Applied to drm-misc/drm-misc-fixes
- Changed the commit order to aggregate all DT binding related patches
- [2/6] Add the widest constraints to `reg` and `reg-names` (Krzysztof Kozlowski)
- [2/6] Only declare the registers that exists in a SoC, don't declare all
the possible registers for a V3D generation (Krzysztof Kozlowski)
- [2/6] Enforce register order by ascending address/offset (Florian Fainelli)
- [2/6] Fix the example to match the new stable ABI
- [3/6] Add Krzysztof's A-b (Krzysztof Kozlowski)
- [4/6] New PATCH: Add more examples to the DT binding
- [5/6] Add "v3d: " to commit title
- Link to v4: https://lore.kernel.org/r/20250313-v3d-gpu-reset-fixes-v4-0-c1e780d8e096@igalia.com
v5 -> v6:
- Drop "[PATCH v5 4/6] dt-bindings: gpu: v3d: Add additional examples
to improve binding checks" (Krzysztof Kozlowski)
- [1/5] Improve commit message to mention cases where unexisting V3D
generations were replaced by supported generations (Stefan Wahren)
- [2/5] Don't break the ABI, enforce the order established by reg (Krzysztof Kozlowski)
- [3/5] Add SMS's functionality in the description (Stefan Wahren)
- Link to v5: https://lore.kernel.org/r/20250316-v3d-gpu-reset-fixes-v5-0-9779cdb12f06@igalia.com
---
Maíra Canal (5):
drm/v3d: Associate a V3D tech revision to all supported devices
dt-bindings: gpu: v3d: Add per-compatible register restrictions
dt-bindings: gpu: v3d: Add SMS register to BCM2712 compatible
dt-bindings: gpu: v3d: Add V3D driver maintainer as DT maintainer
drm/v3d: Use V3D_SMS registers for power on/off and reset on V3D 7.x
.../devicetree/bindings/gpu/brcm,bcm-v3d.yaml | 90 ++++++++++++---
drivers/gpu/drm/v3d/v3d_debugfs.c | 126 ++++++++++-----------
drivers/gpu/drm/v3d/v3d_drv.c | 62 +++++++++-
drivers/gpu/drm/v3d/v3d_drv.h | 22 +++-
drivers/gpu/drm/v3d/v3d_gem.c | 27 ++++-
drivers/gpu/drm/v3d/v3d_irq.c | 6 +-
drivers/gpu/drm/v3d/v3d_perfmon.c | 4 +-
drivers/gpu/drm/v3d/v3d_regs.h | 26 +++++
drivers/gpu/drm/v3d/v3d_sched.c | 6 +-
9 files changed, 271 insertions(+), 98 deletions(-)
---
base-commit: 83a0237859bc5a9e0a716e1db8e7fd3cafd63259
change-id: 20250224-v3d-gpu-reset-fixes-2d21fc70711d
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v6 1/5] drm/v3d: Associate a V3D tech revision to all supported devices
2025-03-18 1:01 [PATCH v6 0/5] drm/v3d: Fix GPU reset issues on the Raspberry Pi 5 Maíra Canal
@ 2025-03-18 1:01 ` Maíra Canal
2025-03-18 16:44 ` Stefan Wahren
2025-03-18 20:03 ` kernel test robot
2025-03-18 1:01 ` [PATCH v6 2/5] dt-bindings: gpu: v3d: Add per-compatible register restrictions Maíra Canal
` (4 subsequent siblings)
5 siblings, 2 replies; 14+ messages in thread
From: Maíra Canal @ 2025-03-18 1:01 UTC (permalink / raw)
To: Melissa Wen, Iago Toral, Krzysztof Kozlowski, Conor Dooley,
Nicolas Saenz Julienne, Stefan Wahren, Florian Fainelli
Cc: Phil Elwell, dri-devel, devicetree, kernel-dev, Maíra Canal
The V3D driver currently determines the GPU tech version (33, 41...)
by reading a register. This approach has worked so far since this
information wasn’t needed before powering on the GPU.
V3D 7.1 introduces new registers that must be written to power on the
GPU, requiring us to know the V3D version beforehand. To address this,
associate each supported SoC with the corresponding VideoCore GPU version
as part of the device data.
To prevent possible mistakes, add an assertion to verify that the version
specified in the device data matches the one reported by the hardware.
If there is a mismatch, the kernel will trigger a warning.
With the goal of maintaining consistency around the driver, use `enum
v3d_gen` to assign values to `v3d->ver` and for comparisons with other
V3D generations. Note that all mentions of unsupported or non-existing V3D
generations (such as V3D 4.0) were removed by this commit and replaced
with supported generations without functional changes.
Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
Signed-off-by: Maíra Canal <mcanal@igalia.com>
---
drivers/gpu/drm/v3d/v3d_debugfs.c | 126 +++++++++++++++++++-------------------
drivers/gpu/drm/v3d/v3d_drv.c | 22 +++++--
drivers/gpu/drm/v3d/v3d_drv.h | 11 +++-
drivers/gpu/drm/v3d/v3d_gem.c | 10 +--
drivers/gpu/drm/v3d/v3d_irq.c | 6 +-
drivers/gpu/drm/v3d/v3d_perfmon.c | 4 +-
drivers/gpu/drm/v3d/v3d_sched.c | 6 +-
7 files changed, 101 insertions(+), 84 deletions(-)
diff --git a/drivers/gpu/drm/v3d/v3d_debugfs.c b/drivers/gpu/drm/v3d/v3d_debugfs.c
index 76816f2551c10026a775e4331ad7eb2f008cfb0a..7e789e181af0ac138044f194a29555c30ab01836 100644
--- a/drivers/gpu/drm/v3d/v3d_debugfs.c
+++ b/drivers/gpu/drm/v3d/v3d_debugfs.c
@@ -21,74 +21,74 @@ struct v3d_reg_def {
};
static const struct v3d_reg_def v3d_hub_reg_defs[] = {
- REGDEF(33, 42, V3D_HUB_AXICFG),
- REGDEF(33, 71, V3D_HUB_UIFCFG),
- REGDEF(33, 71, V3D_HUB_IDENT0),
- REGDEF(33, 71, V3D_HUB_IDENT1),
- REGDEF(33, 71, V3D_HUB_IDENT2),
- REGDEF(33, 71, V3D_HUB_IDENT3),
- REGDEF(33, 71, V3D_HUB_INT_STS),
- REGDEF(33, 71, V3D_HUB_INT_MSK_STS),
-
- REGDEF(33, 71, V3D_MMU_CTL),
- REGDEF(33, 71, V3D_MMU_VIO_ADDR),
- REGDEF(33, 71, V3D_MMU_VIO_ID),
- REGDEF(33, 71, V3D_MMU_DEBUG_INFO),
-
- REGDEF(71, 71, V3D_GMP_STATUS(71)),
- REGDEF(71, 71, V3D_GMP_CFG(71)),
- REGDEF(71, 71, V3D_GMP_VIO_ADDR(71)),
+ REGDEF(V3D_GEN_33, V3D_GEN_42, V3D_HUB_AXICFG),
+ REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_HUB_UIFCFG),
+ REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_HUB_IDENT0),
+ REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_HUB_IDENT1),
+ REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_HUB_IDENT2),
+ REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_HUB_IDENT3),
+ REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_HUB_INT_STS),
+ REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_HUB_INT_MSK_STS),
+
+ REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_MMU_CTL),
+ REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_MMU_VIO_ADDR),
+ REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_MMU_VIO_ID),
+ REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_MMU_DEBUG_INFO),
+
+ REGDEF(V3D_GEN_71, V3D_GEN_71, V3D_GMP_STATUS(71)),
+ REGDEF(V3D_GEN_71, V3D_GEN_71, V3D_GMP_CFG(71)),
+ REGDEF(V3D_GEN_71, V3D_GEN_71, V3D_GMP_VIO_ADDR(71)),
};
static const struct v3d_reg_def v3d_gca_reg_defs[] = {
- REGDEF(33, 33, V3D_GCA_SAFE_SHUTDOWN),
- REGDEF(33, 33, V3D_GCA_SAFE_SHUTDOWN_ACK),
+ REGDEF(V3D_GEN_33, V3D_GEN_33, V3D_GCA_SAFE_SHUTDOWN),
+ REGDEF(V3D_GEN_33, V3D_GEN_33, V3D_GCA_SAFE_SHUTDOWN_ACK),
};
static const struct v3d_reg_def v3d_core_reg_defs[] = {
- REGDEF(33, 71, V3D_CTL_IDENT0),
- REGDEF(33, 71, V3D_CTL_IDENT1),
- REGDEF(33, 71, V3D_CTL_IDENT2),
- REGDEF(33, 71, V3D_CTL_MISCCFG),
- REGDEF(33, 71, V3D_CTL_INT_STS),
- REGDEF(33, 71, V3D_CTL_INT_MSK_STS),
- REGDEF(33, 71, V3D_CLE_CT0CS),
- REGDEF(33, 71, V3D_CLE_CT0CA),
- REGDEF(33, 71, V3D_CLE_CT0EA),
- REGDEF(33, 71, V3D_CLE_CT1CS),
- REGDEF(33, 71, V3D_CLE_CT1CA),
- REGDEF(33, 71, V3D_CLE_CT1EA),
-
- REGDEF(33, 71, V3D_PTB_BPCA),
- REGDEF(33, 71, V3D_PTB_BPCS),
-
- REGDEF(33, 42, V3D_GMP_STATUS(33)),
- REGDEF(33, 42, V3D_GMP_CFG(33)),
- REGDEF(33, 42, V3D_GMP_VIO_ADDR(33)),
-
- REGDEF(33, 71, V3D_ERR_FDBGO),
- REGDEF(33, 71, V3D_ERR_FDBGB),
- REGDEF(33, 71, V3D_ERR_FDBGS),
- REGDEF(33, 71, V3D_ERR_STAT),
+ REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_CTL_IDENT0),
+ REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_CTL_IDENT1),
+ REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_CTL_IDENT2),
+ REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_CTL_MISCCFG),
+ REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_CTL_INT_STS),
+ REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_CTL_INT_MSK_STS),
+ REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_CLE_CT0CS),
+ REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_CLE_CT0CA),
+ REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_CLE_CT0EA),
+ REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_CLE_CT1CS),
+ REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_CLE_CT1CA),
+ REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_CLE_CT1EA),
+
+ REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_PTB_BPCA),
+ REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_PTB_BPCS),
+
+ REGDEF(V3D_GEN_33, V3D_GEN_42, V3D_GMP_STATUS(33)),
+ REGDEF(V3D_GEN_33, V3D_GEN_42, V3D_GMP_CFG(33)),
+ REGDEF(V3D_GEN_33, V3D_GEN_42, V3D_GMP_VIO_ADDR(33)),
+
+ REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_ERR_FDBGO),
+ REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_ERR_FDBGB),
+ REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_ERR_FDBGS),
+ REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_ERR_STAT),
};
static const struct v3d_reg_def v3d_csd_reg_defs[] = {
- REGDEF(41, 71, V3D_CSD_STATUS),
- REGDEF(41, 42, V3D_CSD_CURRENT_CFG0(41)),
- REGDEF(41, 42, V3D_CSD_CURRENT_CFG1(41)),
- REGDEF(41, 42, V3D_CSD_CURRENT_CFG2(41)),
- REGDEF(41, 42, V3D_CSD_CURRENT_CFG3(41)),
- REGDEF(41, 42, V3D_CSD_CURRENT_CFG4(41)),
- REGDEF(41, 42, V3D_CSD_CURRENT_CFG5(41)),
- REGDEF(41, 42, V3D_CSD_CURRENT_CFG6(41)),
- REGDEF(71, 71, V3D_CSD_CURRENT_CFG0(71)),
- REGDEF(71, 71, V3D_CSD_CURRENT_CFG1(71)),
- REGDEF(71, 71, V3D_CSD_CURRENT_CFG2(71)),
- REGDEF(71, 71, V3D_CSD_CURRENT_CFG3(71)),
- REGDEF(71, 71, V3D_CSD_CURRENT_CFG4(71)),
- REGDEF(71, 71, V3D_CSD_CURRENT_CFG5(71)),
- REGDEF(71, 71, V3D_CSD_CURRENT_CFG6(71)),
- REGDEF(71, 71, V3D_V7_CSD_CURRENT_CFG7),
+ REGDEF(V3D_GEN_41, V3D_GEN_71, V3D_CSD_STATUS),
+ REGDEF(V3D_GEN_41, V3D_GEN_42, V3D_CSD_CURRENT_CFG0(41)),
+ REGDEF(V3D_GEN_41, V3D_GEN_42, V3D_CSD_CURRENT_CFG1(41)),
+ REGDEF(V3D_GEN_41, V3D_GEN_42, V3D_CSD_CURRENT_CFG2(41)),
+ REGDEF(V3D_GEN_41, V3D_GEN_42, V3D_CSD_CURRENT_CFG3(41)),
+ REGDEF(V3D_GEN_41, V3D_GEN_42, V3D_CSD_CURRENT_CFG4(41)),
+ REGDEF(V3D_GEN_41, V3D_GEN_42, V3D_CSD_CURRENT_CFG5(41)),
+ REGDEF(V3D_GEN_41, V3D_GEN_42, V3D_CSD_CURRENT_CFG6(41)),
+ REGDEF(V3D_GEN_71, V3D_GEN_71, V3D_CSD_CURRENT_CFG0(71)),
+ REGDEF(V3D_GEN_71, V3D_GEN_71, V3D_CSD_CURRENT_CFG1(71)),
+ REGDEF(V3D_GEN_71, V3D_GEN_71, V3D_CSD_CURRENT_CFG2(71)),
+ REGDEF(V3D_GEN_71, V3D_GEN_71, V3D_CSD_CURRENT_CFG3(71)),
+ REGDEF(V3D_GEN_71, V3D_GEN_71, V3D_CSD_CURRENT_CFG4(71)),
+ REGDEF(V3D_GEN_71, V3D_GEN_71, V3D_CSD_CURRENT_CFG5(71)),
+ REGDEF(V3D_GEN_71, V3D_GEN_71, V3D_CSD_CURRENT_CFG6(71)),
+ REGDEF(V3D_GEN_71, V3D_GEN_71, V3D_V7_CSD_CURRENT_CFG7),
};
static int v3d_v3d_debugfs_regs(struct seq_file *m, void *unused)
@@ -164,7 +164,7 @@ static int v3d_v3d_debugfs_ident(struct seq_file *m, void *unused)
str_yes_no(ident2 & V3D_HUB_IDENT2_WITH_MMU));
seq_printf(m, "TFU: %s\n",
str_yes_no(ident1 & V3D_HUB_IDENT1_WITH_TFU));
- if (v3d->ver <= 42) {
+ if (v3d->ver <= V3D_GEN_42) {
seq_printf(m, "TSY: %s\n",
str_yes_no(ident1 & V3D_HUB_IDENT1_WITH_TSY));
}
@@ -196,11 +196,11 @@ static int v3d_v3d_debugfs_ident(struct seq_file *m, void *unused)
seq_printf(m, " QPUs: %d\n", nslc * qups);
seq_printf(m, " Semaphores: %d\n",
V3D_GET_FIELD(ident1, V3D_IDENT1_NSEM));
- if (v3d->ver <= 42) {
+ if (v3d->ver <= V3D_GEN_42) {
seq_printf(m, " BCG int: %d\n",
(ident2 & V3D_IDENT2_BCG_INT) != 0);
}
- if (v3d->ver < 40) {
+ if (v3d->ver < V3D_GEN_41) {
seq_printf(m, " Override TMU: %d\n",
(misccfg & V3D_MISCCFG_OVRTMUOUT) != 0);
}
@@ -234,7 +234,7 @@ static int v3d_measure_clock(struct seq_file *m, void *unused)
int core = 0;
int measure_ms = 1000;
- if (v3d->ver >= 40) {
+ if (v3d->ver >= V3D_GEN_41) {
int cycle_count_reg = V3D_PCTR_CYCLE_COUNT(v3d->ver);
V3D_CORE_WRITE(core, V3D_V4_PCTR_0_SRC_0_3,
V3D_SET_FIELD_VER(cycle_count_reg,
diff --git a/drivers/gpu/drm/v3d/v3d_drv.c b/drivers/gpu/drm/v3d/v3d_drv.c
index 852015214e971c60f9939d34d893d8d8cb4e9b01..c63f0ed1bd8a3d5511085e76ed2fbd6ee7df6f80 100644
--- a/drivers/gpu/drm/v3d/v3d_drv.c
+++ b/drivers/gpu/drm/v3d/v3d_drv.c
@@ -17,6 +17,7 @@
#include <linux/dma-mapping.h>
#include <linux/io.h>
#include <linux/module.h>
+#include <linux/of.h>
#include <linux/of_platform.h>
#include <linux/platform_device.h>
#include <linux/sched/clock.h>
@@ -92,7 +93,7 @@ static int v3d_get_param_ioctl(struct drm_device *dev, void *data,
args->value = 1;
return 0;
case DRM_V3D_PARAM_SUPPORTS_PERFMON:
- args->value = (v3d->ver >= 40);
+ args->value = (v3d->ver >= V3D_GEN_41);
return 0;
case DRM_V3D_PARAM_SUPPORTS_MULTISYNC_EXT:
args->value = 1;
@@ -254,10 +255,10 @@ static const struct drm_driver v3d_drm_driver = {
};
static const struct of_device_id v3d_of_match[] = {
- { .compatible = "brcm,2711-v3d" },
- { .compatible = "brcm,2712-v3d" },
- { .compatible = "brcm,7268-v3d" },
- { .compatible = "brcm,7278-v3d" },
+ { .compatible = "brcm,2711-v3d", .data = (void *)V3D_GEN_42 },
+ { .compatible = "brcm,2712-v3d", .data = (void *)V3D_GEN_71 },
+ { .compatible = "brcm,7268-v3d", .data = (void *)V3D_GEN_33 },
+ { .compatible = "brcm,7278-v3d", .data = (void *)V3D_GEN_41 },
{},
};
MODULE_DEVICE_TABLE(of, v3d_of_match);
@@ -274,6 +275,7 @@ static int v3d_platform_drm_probe(struct platform_device *pdev)
struct device *dev = &pdev->dev;
struct drm_device *drm;
struct v3d_dev *v3d;
+ enum v3d_gen gen;
int ret;
u32 mmu_debug;
u32 ident1, ident3;
@@ -287,6 +289,9 @@ static int v3d_platform_drm_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, drm);
+ gen = (enum v3d_gen)of_device_get_match_data(dev);
+ v3d->ver = gen;
+
ret = map_regs(v3d, &v3d->hub_regs, "hub");
if (ret)
return ret;
@@ -316,6 +321,11 @@ static int v3d_platform_drm_probe(struct platform_device *pdev)
ident1 = V3D_READ(V3D_HUB_IDENT1);
v3d->ver = (V3D_GET_FIELD(ident1, V3D_HUB_IDENT1_TVER) * 10 +
V3D_GET_FIELD(ident1, V3D_HUB_IDENT1_REV));
+ /* Make sure that the V3D tech version retrieved from the HW is equal
+ * to the one advertised by the device tree.
+ */
+ WARN_ON(v3d->ver != gen);
+
v3d->cores = V3D_GET_FIELD(ident1, V3D_HUB_IDENT1_NCORES);
WARN_ON(v3d->cores > 1); /* multicore not yet implemented */
@@ -340,7 +350,7 @@ static int v3d_platform_drm_probe(struct platform_device *pdev)
}
}
- if (v3d->ver < 41) {
+ if (v3d->ver < V3D_GEN_41) {
ret = map_regs(v3d, &v3d->gca_regs, "gca");
if (ret)
goto clk_disable;
diff --git a/drivers/gpu/drm/v3d/v3d_drv.h b/drivers/gpu/drm/v3d/v3d_drv.h
index 9deaefa0f95b71b842f1c5bef2c6a8a8ffc21fe2..de4a9e18f6a9039edf57f406ab1cee9dad4c0a49 100644
--- a/drivers/gpu/drm/v3d/v3d_drv.h
+++ b/drivers/gpu/drm/v3d/v3d_drv.h
@@ -94,11 +94,18 @@ struct v3d_perfmon {
u64 values[] __counted_by(ncounters);
};
+enum v3d_gen {
+ V3D_GEN_33 = 33,
+ V3D_GEN_41 = 41,
+ V3D_GEN_42 = 42,
+ V3D_GEN_71 = 71,
+};
+
struct v3d_dev {
struct drm_device drm;
/* Short representation (e.g. 33, 41) of the V3D tech version */
- int ver;
+ enum v3d_gen ver;
/* Short representation (e.g. 5, 6) of the V3D tech revision */
int rev;
@@ -199,7 +206,7 @@ to_v3d_dev(struct drm_device *dev)
static inline bool
v3d_has_csd(struct v3d_dev *v3d)
{
- return v3d->ver >= 41;
+ return v3d->ver >= V3D_GEN_41;
}
#define v3d_to_pdev(v3d) to_platform_device((v3d)->drm.dev)
diff --git a/drivers/gpu/drm/v3d/v3d_gem.c b/drivers/gpu/drm/v3d/v3d_gem.c
index b1e681630ded098de8aee691884368a959443812..1ea6d3832c2212d9cbbd90236478d18491f0ff14 100644
--- a/drivers/gpu/drm/v3d/v3d_gem.c
+++ b/drivers/gpu/drm/v3d/v3d_gem.c
@@ -25,7 +25,7 @@ v3d_init_core(struct v3d_dev *v3d, int core)
* type. If you want the default behavior, you can still put
* "2" in the indirect texture state's output_type field.
*/
- if (v3d->ver < 40)
+ if (v3d->ver < V3D_GEN_41)
V3D_CORE_WRITE(core, V3D_CTL_MISCCFG, V3D_MISCCFG_OVRTMUOUT);
/* Whenever we flush the L2T cache, we always want to flush
@@ -58,7 +58,7 @@ v3d_idle_axi(struct v3d_dev *v3d, int core)
static void
v3d_idle_gca(struct v3d_dev *v3d)
{
- if (v3d->ver >= 41)
+ if (v3d->ver >= V3D_GEN_41)
return;
V3D_GCA_WRITE(V3D_GCA_SAFE_SHUTDOWN, V3D_GCA_SAFE_SHUTDOWN_EN);
@@ -132,13 +132,13 @@ v3d_reset(struct v3d_dev *v3d)
static void
v3d_flush_l3(struct v3d_dev *v3d)
{
- if (v3d->ver < 41) {
+ if (v3d->ver < V3D_GEN_41) {
u32 gca_ctrl = V3D_GCA_READ(V3D_GCA_CACHE_CTRL);
V3D_GCA_WRITE(V3D_GCA_CACHE_CTRL,
gca_ctrl | V3D_GCA_CACHE_CTRL_FLUSH);
- if (v3d->ver < 33) {
+ if (v3d->ver < V3D_GEN_33) {
V3D_GCA_WRITE(V3D_GCA_CACHE_CTRL,
gca_ctrl & ~V3D_GCA_CACHE_CTRL_FLUSH);
}
@@ -151,7 +151,7 @@ v3d_flush_l3(struct v3d_dev *v3d)
static void
v3d_invalidate_l2c(struct v3d_dev *v3d, int core)
{
- if (v3d->ver > 32)
+ if (v3d->ver >= V3D_GEN_33)
return;
V3D_CORE_WRITE(core, V3D_CTL_L2CACTL,
diff --git a/drivers/gpu/drm/v3d/v3d_irq.c b/drivers/gpu/drm/v3d/v3d_irq.c
index 72b6a119412fa74f8771308e228305678a19ba43..29f63f572d35b7217e346f82b9afb0957a42bd39 100644
--- a/drivers/gpu/drm/v3d/v3d_irq.c
+++ b/drivers/gpu/drm/v3d/v3d_irq.c
@@ -143,7 +143,7 @@ v3d_irq(int irq, void *arg)
/* We shouldn't be triggering these if we have GMP in
* always-allowed mode.
*/
- if (v3d->ver < 71 && (intsts & V3D_INT_GMPV))
+ if (v3d->ver < V3D_GEN_71 && (intsts & V3D_INT_GMPV))
dev_err(v3d->drm.dev, "GMP violation\n");
/* V3D 4.2 wires the hub and core IRQs together, so if we &
@@ -200,7 +200,7 @@ v3d_hub_irq(int irq, void *arg)
V3D_WRITE(V3D_MMU_CTL, V3D_READ(V3D_MMU_CTL));
- if (v3d->ver >= 41) {
+ if (v3d->ver >= V3D_GEN_41) {
axi_id = axi_id >> 5;
if (axi_id < ARRAY_SIZE(v3d41_axi_ids))
client = v3d41_axi_ids[axi_id];
@@ -217,7 +217,7 @@ v3d_hub_irq(int irq, void *arg)
status = IRQ_HANDLED;
}
- if (v3d->ver >= 71 && (intsts & V3D_V7_HUB_INT_GMPV)) {
+ if (v3d->ver >= V3D_GEN_71 && (intsts & V3D_V7_HUB_INT_GMPV)) {
dev_err(v3d->drm.dev, "GMP Violation\n");
status = IRQ_HANDLED;
}
diff --git a/drivers/gpu/drm/v3d/v3d_perfmon.c b/drivers/gpu/drm/v3d/v3d_perfmon.c
index 3ebda2fa46fc4775c67d13d8f8131160ff6ca09d..9a3fe52558746e8523d4cf4ee433a90d94bffdbf 100644
--- a/drivers/gpu/drm/v3d/v3d_perfmon.c
+++ b/drivers/gpu/drm/v3d/v3d_perfmon.c
@@ -200,10 +200,10 @@ void v3d_perfmon_init(struct v3d_dev *v3d)
const struct v3d_perf_counter_desc *counters = NULL;
unsigned int max = 0;
- if (v3d->ver >= 71) {
+ if (v3d->ver >= V3D_GEN_71) {
counters = v3d_v71_performance_counters;
max = ARRAY_SIZE(v3d_v71_performance_counters);
- } else if (v3d->ver >= 42) {
+ } else if (v3d->ver >= V3D_GEN_42) {
counters = v3d_v42_performance_counters;
max = ARRAY_SIZE(v3d_v42_performance_counters);
}
diff --git a/drivers/gpu/drm/v3d/v3d_sched.c b/drivers/gpu/drm/v3d/v3d_sched.c
index 80466ce8c7df669280e556c0793490b79e75d2c7..34bd2b14f932f3b845e3d7dd19e2a4a732a56d91 100644
--- a/drivers/gpu/drm/v3d/v3d_sched.c
+++ b/drivers/gpu/drm/v3d/v3d_sched.c
@@ -345,11 +345,11 @@ v3d_tfu_job_run(struct drm_sched_job *sched_job)
V3D_WRITE(V3D_TFU_ICA(v3d->ver), job->args.ica);
V3D_WRITE(V3D_TFU_IUA(v3d->ver), job->args.iua);
V3D_WRITE(V3D_TFU_IOA(v3d->ver), job->args.ioa);
- if (v3d->ver >= 71)
+ if (v3d->ver >= V3D_GEN_71)
V3D_WRITE(V3D_V7_TFU_IOC, job->args.v71.ioc);
V3D_WRITE(V3D_TFU_IOS(v3d->ver), job->args.ios);
V3D_WRITE(V3D_TFU_COEF0(v3d->ver), job->args.coef[0]);
- if (v3d->ver >= 71 || (job->args.coef[0] & V3D_TFU_COEF0_USECOEF)) {
+ if (v3d->ver >= V3D_GEN_71 || (job->args.coef[0] & V3D_TFU_COEF0_USECOEF)) {
V3D_WRITE(V3D_TFU_COEF1(v3d->ver), job->args.coef[1]);
V3D_WRITE(V3D_TFU_COEF2(v3d->ver), job->args.coef[2]);
V3D_WRITE(V3D_TFU_COEF3(v3d->ver), job->args.coef[3]);
@@ -395,7 +395,7 @@ v3d_csd_job_run(struct drm_sched_job *sched_job)
*
* XXX: Set the CFG7 register
*/
- if (v3d->ver >= 71)
+ if (v3d->ver >= V3D_GEN_71)
V3D_CORE_WRITE(0, V3D_V7_CSD_QUEUED_CFG7, 0);
/* CFG0 write kicks off the job. */
--
2.49.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v6 2/5] dt-bindings: gpu: v3d: Add per-compatible register restrictions
2025-03-18 1:01 [PATCH v6 0/5] drm/v3d: Fix GPU reset issues on the Raspberry Pi 5 Maíra Canal
2025-03-18 1:01 ` [PATCH v6 1/5] drm/v3d: Associate a V3D tech revision to all supported devices Maíra Canal
@ 2025-03-18 1:01 ` Maíra Canal
2025-03-18 8:03 ` Krzysztof Kozlowski
2025-03-18 1:01 ` [PATCH v6 3/5] dt-bindings: gpu: v3d: Add SMS register to BCM2712 compatible Maíra Canal
` (3 subsequent siblings)
5 siblings, 1 reply; 14+ messages in thread
From: Maíra Canal @ 2025-03-18 1:01 UTC (permalink / raw)
To: Melissa Wen, Iago Toral, Krzysztof Kozlowski, Conor Dooley,
Nicolas Saenz Julienne, Stefan Wahren, Florian Fainelli
Cc: Phil Elwell, dri-devel, devicetree, kernel-dev, Maíra Canal
In order to enforce per-SoC register rules, add per-compatible
restrictions. For example, V3D 3.3 (used in brcm,7268-v3d) has a cache
controller (GCA), which is not present in other V3D generations. Declaring
these differences helps ensure the DTB accurately reflect the hardware
design.
The example was using an incorrect order for the register names. This
commit corrects that by enforcing the order established in the register
items description.
Signed-off-by: Maíra Canal <mcanal@igalia.com>
---
.../devicetree/bindings/gpu/brcm,bcm-v3d.yaml | 86 ++++++++++++++++++----
1 file changed, 73 insertions(+), 13 deletions(-)
diff --git a/Documentation/devicetree/bindings/gpu/brcm,bcm-v3d.yaml b/Documentation/devicetree/bindings/gpu/brcm,bcm-v3d.yaml
index dc078ceeca9ac3447ba54a7c8830821f0b2a7f9f..6a1a09031983eda4691a939329ed159b32f77669 100644
--- a/Documentation/devicetree/bindings/gpu/brcm,bcm-v3d.yaml
+++ b/Documentation/devicetree/bindings/gpu/brcm,bcm-v3d.yaml
@@ -22,20 +22,12 @@ properties:
- brcm,7278-v3d
reg:
- items:
- - description: hub register (required)
- - description: core0 register (required)
- - description: GCA cache controller register (if GCA controller present)
- - description: bridge register (if no external reset controller)
minItems: 2
+ maxItems: 4
reg-names:
- items:
- - const: hub
- - const: core0
- - enum: [ bridge, gca ]
- - enum: [ bridge, gca ]
minItems: 2
+ maxItems: 4
interrupts:
items:
@@ -58,6 +50,74 @@ required:
- reg-names
- interrupts
+allOf:
+ - if:
+ properties:
+ compatible:
+ contains:
+ const: brcm,2711-v3d
+ then:
+ properties:
+ reg:
+ items:
+ - description: hub register
+ - description: core0 register
+ reg-names:
+ items:
+ - const: hub
+ - const: core0
+ - if:
+ properties:
+ compatible:
+ contains:
+ const: brcm,2712-v3d
+ then:
+ properties:
+ reg:
+ items:
+ - description: hub register
+ - description: core0 register
+ reg-names:
+ items:
+ - const: hub
+ - const: core0
+ - if:
+ properties:
+ compatible:
+ contains:
+ const: brcm,7268-v3d
+ then:
+ properties:
+ reg:
+ items:
+ - description: hub register
+ - description: core0 register
+ - description: GCA cache controller register
+ - description: bridge register
+ reg-names:
+ items:
+ - const: hub
+ - const: core0
+ - const: gca
+ - const: bridge
+ - if:
+ properties:
+ compatible:
+ contains:
+ const: brcm,7278-v3d
+ then:
+ properties:
+ reg:
+ items:
+ - description: hub register
+ - description: core0 register
+ - description: bridge register
+ reg-names:
+ items:
+ - const: hub
+ - const: core0
+ - const: bridge
+
additionalProperties: false
examples:
@@ -66,9 +126,9 @@ examples:
compatible = "brcm,7268-v3d";
reg = <0xf1200000 0x4000>,
<0xf1208000 0x4000>,
- <0xf1204000 0x100>,
- <0xf1204100 0x100>;
- reg-names = "hub", "core0", "bridge", "gca";
+ <0xf1204100 0x100>,
+ <0xf1204000 0x100>;
+ reg-names = "hub", "core0", "gca", "bridge";
interrupts = <0 78 4>,
<0 77 4>;
};
--
2.49.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v6 3/5] dt-bindings: gpu: v3d: Add SMS register to BCM2712 compatible
2025-03-18 1:01 [PATCH v6 0/5] drm/v3d: Fix GPU reset issues on the Raspberry Pi 5 Maíra Canal
2025-03-18 1:01 ` [PATCH v6 1/5] drm/v3d: Associate a V3D tech revision to all supported devices Maíra Canal
2025-03-18 1:01 ` [PATCH v6 2/5] dt-bindings: gpu: v3d: Add per-compatible register restrictions Maíra Canal
@ 2025-03-18 1:01 ` Maíra Canal
2025-03-19 11:07 ` Stefan Wahren
2025-03-18 1:01 ` [PATCH v6 4/5] dt-bindings: gpu: v3d: Add V3D driver maintainer as DT maintainer Maíra Canal
` (2 subsequent siblings)
5 siblings, 1 reply; 14+ messages in thread
From: Maíra Canal @ 2025-03-18 1:01 UTC (permalink / raw)
To: Melissa Wen, Iago Toral, Krzysztof Kozlowski, Conor Dooley,
Nicolas Saenz Julienne, Stefan Wahren, Florian Fainelli
Cc: Phil Elwell, dri-devel, devicetree, kernel-dev,
Krzysztof Kozlowski, Maíra Canal
V3D 7.1 exposes a new register block, called V3D_SMS. As BCM2712 has a
V3D 7.1 core, add a new register item to its compatible. Similar to the
GCA, which is specific for V3D 3.3, SMS should only be added for V3D 7.1
variants (such as brcm,2712-v3d).
Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Signed-off-by: Maíra Canal <mcanal@igalia.com>
---
Documentation/devicetree/bindings/gpu/brcm,bcm-v3d.yaml | 2 ++
1 file changed, 2 insertions(+)
diff --git a/Documentation/devicetree/bindings/gpu/brcm,bcm-v3d.yaml b/Documentation/devicetree/bindings/gpu/brcm,bcm-v3d.yaml
index 6a1a09031983eda4691a939329ed159b32f77669..dd2cc63c9a51da11691e4e81b225b74fbe86d709 100644
--- a/Documentation/devicetree/bindings/gpu/brcm,bcm-v3d.yaml
+++ b/Documentation/devicetree/bindings/gpu/brcm,bcm-v3d.yaml
@@ -77,10 +77,12 @@ allOf:
items:
- description: hub register
- description: core0 register
+ - description: SMS state manager register
reg-names:
items:
- const: hub
- const: core0
+ - const: sms
- if:
properties:
compatible:
--
2.49.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v6 4/5] dt-bindings: gpu: v3d: Add V3D driver maintainer as DT maintainer
2025-03-18 1:01 [PATCH v6 0/5] drm/v3d: Fix GPU reset issues on the Raspberry Pi 5 Maíra Canal
` (2 preceding siblings ...)
2025-03-18 1:01 ` [PATCH v6 3/5] dt-bindings: gpu: v3d: Add SMS register to BCM2712 compatible Maíra Canal
@ 2025-03-18 1:01 ` Maíra Canal
2025-03-18 1:01 ` [PATCH v6 5/5] drm/v3d: Use V3D_SMS registers for power on/off and reset on V3D 7.x Maíra Canal
2025-03-23 14:45 ` [PATCH v6 0/5] drm/v3d: Fix GPU reset issues on the Raspberry Pi 5 Maíra Canal
5 siblings, 0 replies; 14+ messages in thread
From: Maíra Canal @ 2025-03-18 1:01 UTC (permalink / raw)
To: Melissa Wen, Iago Toral, Krzysztof Kozlowski, Conor Dooley,
Nicolas Saenz Julienne, Stefan Wahren, Florian Fainelli
Cc: Phil Elwell, dri-devel, devicetree, kernel-dev, Emma Anholt,
Rob Herring (Arm), Maíra Canal
As established in commit 89d04995f76c ("MAINTAINERS: Drop Emma Anholt
from all M lines."), Emma is no longer active in the Linux kernel and
dropped the V3D maintainership. Therefore, remove Emma as one of the DT
maintainers and add the current V3D driver maintainer.
Acked-by: Emma Anholt <emma@anholt.net>
Acked-by: Rob Herring (Arm) <robh@kernel.org>
Signed-off-by: Maíra Canal <mcanal@igalia.com>
---
Hi,
I'd like to ask two questions:
1. Nicolas, are you still interested in maintaining this DTB?
2. Florian, would you like to step in as a co-maintainer with me?
Best Regards,
- Maíra
---
Documentation/devicetree/bindings/gpu/brcm,bcm-v3d.yaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Documentation/devicetree/bindings/gpu/brcm,bcm-v3d.yaml b/Documentation/devicetree/bindings/gpu/brcm,bcm-v3d.yaml
index dd2cc63c9a51da11691e4e81b225b74fbe86d709..43c6d2d7245653509c18ac7adc4d15d2baf9f08e 100644
--- a/Documentation/devicetree/bindings/gpu/brcm,bcm-v3d.yaml
+++ b/Documentation/devicetree/bindings/gpu/brcm,bcm-v3d.yaml
@@ -7,7 +7,7 @@ $schema: http://devicetree.org/meta-schemas/core.yaml#
title: Broadcom V3D GPU
maintainers:
- - Eric Anholt <eric@anholt.net>
+ - Maíra Canal <mcanal@igalia.com>
- Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
properties:
--
2.49.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v6 5/5] drm/v3d: Use V3D_SMS registers for power on/off and reset on V3D 7.x
2025-03-18 1:01 [PATCH v6 0/5] drm/v3d: Fix GPU reset issues on the Raspberry Pi 5 Maíra Canal
` (3 preceding siblings ...)
2025-03-18 1:01 ` [PATCH v6 4/5] dt-bindings: gpu: v3d: Add V3D driver maintainer as DT maintainer Maíra Canal
@ 2025-03-18 1:01 ` Maíra Canal
2025-03-27 10:57 ` Stefan Wahren
2025-03-23 14:45 ` [PATCH v6 0/5] drm/v3d: Fix GPU reset issues on the Raspberry Pi 5 Maíra Canal
5 siblings, 1 reply; 14+ messages in thread
From: Maíra Canal @ 2025-03-18 1:01 UTC (permalink / raw)
To: Melissa Wen, Iago Toral, Krzysztof Kozlowski, Conor Dooley,
Nicolas Saenz Julienne, Stefan Wahren, Florian Fainelli
Cc: Phil Elwell, dri-devel, devicetree, kernel-dev, Maíra Canal
In addition to the standard reset controller, V3D 7.x requires configuring
the V3D_SMS registers for proper power on/off and reset. Add the new
registers to `v3d_regs.h` and ensure they are properly configured during
device probing, removal, and reset.
This change fixes GPU reset issues on the Raspberry Pi 5 (BCM2712).
Without exposing these registers, a GPU reset causes the GPU to hang,
stopping any further job execution and freezing the desktop GUI. The same
issue occurs when unloading and loading the v3d driver.
Link: https://github.com/raspberrypi/linux/issues/6660
Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
Signed-off-by: Maíra Canal <mcanal@igalia.com>
---
drivers/gpu/drm/v3d/v3d_drv.c | 40 ++++++++++++++++++++++++++++++++++++++++
drivers/gpu/drm/v3d/v3d_drv.h | 11 +++++++++++
drivers/gpu/drm/v3d/v3d_gem.c | 17 +++++++++++++++++
drivers/gpu/drm/v3d/v3d_regs.h | 26 ++++++++++++++++++++++++++
4 files changed, 94 insertions(+)
diff --git a/drivers/gpu/drm/v3d/v3d_drv.c b/drivers/gpu/drm/v3d/v3d_drv.c
index c63f0ed1bd8a3d5511085e76ed2fbd6ee7df6f80..122848cdccc4a02039d9ea2e77aa2f377886b5d6 100644
--- a/drivers/gpu/drm/v3d/v3d_drv.c
+++ b/drivers/gpu/drm/v3d/v3d_drv.c
@@ -263,6 +263,36 @@ static const struct of_device_id v3d_of_match[] = {
};
MODULE_DEVICE_TABLE(of, v3d_of_match);
+static void
+v3d_idle_sms(struct v3d_dev *v3d)
+{
+ if (v3d->ver < V3D_GEN_71)
+ return;
+
+ V3D_SMS_WRITE(V3D_SMS_TEE_CS, V3D_SMS_CLEAR_POWER_OFF);
+
+ if (wait_for((V3D_GET_FIELD(V3D_SMS_READ(V3D_SMS_TEE_CS),
+ V3D_SMS_STATE) == V3D_SMS_IDLE), 100)) {
+ DRM_ERROR("Failed to power up SMS\n");
+ }
+
+ v3d_reset_sms(v3d);
+}
+
+static void
+v3d_power_off_sms(struct v3d_dev *v3d)
+{
+ if (v3d->ver < V3D_GEN_71)
+ return;
+
+ V3D_SMS_WRITE(V3D_SMS_TEE_CS, V3D_SMS_POWER_OFF);
+
+ if (wait_for((V3D_GET_FIELD(V3D_SMS_READ(V3D_SMS_TEE_CS),
+ V3D_SMS_STATE) == V3D_SMS_POWER_OFF_STATE), 100)) {
+ DRM_ERROR("Failed to power off SMS\n");
+ }
+}
+
static int
map_regs(struct v3d_dev *v3d, void __iomem **regs, const char *name)
{
@@ -300,6 +330,12 @@ static int v3d_platform_drm_probe(struct platform_device *pdev)
if (ret)
return ret;
+ if (v3d->ver >= V3D_GEN_71) {
+ ret = map_regs(v3d, &v3d->sms_regs, "sms");
+ if (ret)
+ return ret;
+ }
+
v3d->clk = devm_clk_get_optional(dev, NULL);
if (IS_ERR(v3d->clk))
return dev_err_probe(dev, PTR_ERR(v3d->clk), "Failed to get V3D clock\n");
@@ -310,6 +346,8 @@ static int v3d_platform_drm_probe(struct platform_device *pdev)
return ret;
}
+ v3d_idle_sms(v3d);
+
mmu_debug = V3D_READ(V3D_MMU_DEBUG_INFO);
mask = DMA_BIT_MASK(30 + V3D_GET_FIELD(mmu_debug, V3D_MMU_PA_WIDTH));
ret = dma_set_mask_and_coherent(dev, mask);
@@ -410,6 +448,8 @@ static void v3d_platform_drm_remove(struct platform_device *pdev)
dma_free_wc(v3d->drm.dev, 4096, v3d->mmu_scratch,
v3d->mmu_scratch_paddr);
+ v3d_power_off_sms(v3d);
+
clk_disable_unprepare(v3d->clk);
}
diff --git a/drivers/gpu/drm/v3d/v3d_drv.h b/drivers/gpu/drm/v3d/v3d_drv.h
index de4a9e18f6a9039edf57f406ab1cee9dad4c0a49..b51f0b648a08011f737317ec1841d5ab316355b2 100644
--- a/drivers/gpu/drm/v3d/v3d_drv.h
+++ b/drivers/gpu/drm/v3d/v3d_drv.h
@@ -118,6 +118,7 @@ struct v3d_dev {
void __iomem *core_regs[3];
void __iomem *bridge_regs;
void __iomem *gca_regs;
+ void __iomem *sms_regs;
struct clk *clk;
struct reset_control *reset;
@@ -268,6 +269,15 @@ to_v3d_fence(struct dma_fence *fence)
#define V3D_GCA_READ(offset) readl(v3d->gca_regs + offset)
#define V3D_GCA_WRITE(offset, val) writel(val, v3d->gca_regs + offset)
+#define V3D_SMS_IDLE 0x0
+#define V3D_SMS_ISOLATING_FOR_RESET 0xa
+#define V3D_SMS_RESETTING 0xb
+#define V3D_SMS_ISOLATING_FOR_POWER_OFF 0xc
+#define V3D_SMS_POWER_OFF_STATE 0xd
+
+#define V3D_SMS_READ(offset) readl(v3d->sms_regs + (offset))
+#define V3D_SMS_WRITE(offset, val) writel(val, v3d->sms_regs + (offset))
+
#define V3D_CORE_READ(core, offset) readl(v3d->core_regs[core] + offset)
#define V3D_CORE_WRITE(core, offset, val) writel(val, v3d->core_regs[core] + offset)
@@ -546,6 +556,7 @@ struct dma_fence *v3d_fence_create(struct v3d_dev *v3d, enum v3d_queue queue);
/* v3d_gem.c */
int v3d_gem_init(struct drm_device *dev);
void v3d_gem_destroy(struct drm_device *dev);
+void v3d_reset_sms(struct v3d_dev *v3d);
void v3d_reset(struct v3d_dev *v3d);
void v3d_invalidate_caches(struct v3d_dev *v3d);
void v3d_clean_caches(struct v3d_dev *v3d);
diff --git a/drivers/gpu/drm/v3d/v3d_gem.c b/drivers/gpu/drm/v3d/v3d_gem.c
index 1ea6d3832c2212d9cbbd90236478d18491f0ff14..d7d16da78db328f004d1d702731d1a1b5437a394 100644
--- a/drivers/gpu/drm/v3d/v3d_gem.c
+++ b/drivers/gpu/drm/v3d/v3d_gem.c
@@ -104,6 +104,22 @@ v3d_reset_v3d(struct v3d_dev *v3d)
v3d_init_hw_state(v3d);
}
+void
+v3d_reset_sms(struct v3d_dev *v3d)
+{
+ if (v3d->ver < V3D_GEN_71)
+ return;
+
+ V3D_SMS_WRITE(V3D_SMS_REE_CS, V3D_SET_FIELD(0x4, V3D_SMS_STATE));
+
+ if (wait_for(!(V3D_GET_FIELD(V3D_SMS_READ(V3D_SMS_REE_CS),
+ V3D_SMS_STATE) == V3D_SMS_ISOLATING_FOR_RESET) &&
+ !(V3D_GET_FIELD(V3D_SMS_READ(V3D_SMS_REE_CS),
+ V3D_SMS_STATE) == V3D_SMS_RESETTING), 100)) {
+ DRM_ERROR("Failed to wait for SMS reset\n");
+ }
+}
+
void
v3d_reset(struct v3d_dev *v3d)
{
@@ -119,6 +135,7 @@ v3d_reset(struct v3d_dev *v3d)
v3d_idle_axi(v3d, 0);
v3d_idle_gca(v3d);
+ v3d_reset_sms(v3d);
v3d_reset_v3d(v3d);
v3d_mmu_set_page_table(v3d);
diff --git a/drivers/gpu/drm/v3d/v3d_regs.h b/drivers/gpu/drm/v3d/v3d_regs.h
index 6da3c69082bd6d5954bf88bd9ff2543a5e4e04c4..c1870265eaeecc188afc4f09cf13a5201d3aa1c6 100644
--- a/drivers/gpu/drm/v3d/v3d_regs.h
+++ b/drivers/gpu/drm/v3d/v3d_regs.h
@@ -515,4 +515,30 @@
# define V3D_ERR_VPAERGS BIT(1)
# define V3D_ERR_VPAEABB BIT(0)
+#define V3D_SMS_REE_CS 0x00000
+#define V3D_SMS_TEE_CS 0x00400
+# define V3D_SMS_INTERRUPT BIT(31)
+# define V3D_SMS_POWER_OFF BIT(30)
+# define V3D_SMS_CLEAR_POWER_OFF BIT(29)
+# define V3D_SMS_LOCK BIT(28)
+# define V3D_SMS_CLEAR_LOCK BIT(27)
+# define V3D_SMS_SVP_MODE_EXIT BIT(26)
+# define V3D_SMS_CLEAR_SVP_MODE_EXIT BIT(25)
+# define V3D_SMS_SVP_MODE_ENTER BIT(24)
+# define V3D_SMS_CLEAR_SVP_MODE_ENTER BIT(23)
+# define V3D_SMS_THEIR_MODE_EXIT BIT(22)
+# define V3D_SMS_THEIR_MODE_ENTER BIT(21)
+# define V3D_SMS_OUR_MODE_EXIT BIT(20)
+# define V3D_SMS_CLEAR_OUR_MODE_EXIT BIT(19)
+# define V3D_SMS_SEQ_PC_MASK V3D_MASK(16, 10)
+# define V3D_SMS_SEQ_PC_SHIFT 10
+# define V3D_SMS_HUBCORE_STATUS_MASK V3D_MASK(9, 8)
+# define V3D_SMS_HUBCORE_STATUS_SHIFT 8
+# define V3D_SMS_NEW_MODE_MASK V3D_MASK(7, 6)
+# define V3D_SMS_NEW_MODE_SHIFT 6
+# define V3D_SMS_OLD_MODE_MASK V3D_MASK(5, 4)
+# define V3D_SMS_OLD_MODE_SHIFT 4
+# define V3D_SMS_STATE_MASK V3D_MASK(3, 0)
+# define V3D_SMS_STATE_SHIFT 0
+
#endif /* V3D_REGS_H */
--
2.49.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH v6 2/5] dt-bindings: gpu: v3d: Add per-compatible register restrictions
2025-03-18 1:01 ` [PATCH v6 2/5] dt-bindings: gpu: v3d: Add per-compatible register restrictions Maíra Canal
@ 2025-03-18 8:03 ` Krzysztof Kozlowski
0 siblings, 0 replies; 14+ messages in thread
From: Krzysztof Kozlowski @ 2025-03-18 8:03 UTC (permalink / raw)
To: Maíra Canal
Cc: Melissa Wen, Iago Toral, Krzysztof Kozlowski, Conor Dooley,
Nicolas Saenz Julienne, Stefan Wahren, Florian Fainelli,
Phil Elwell, dri-devel, devicetree, kernel-dev
On Mon, Mar 17, 2025 at 10:01:10PM -0300, Maíra Canal wrote:
> In order to enforce per-SoC register rules, add per-compatible
> restrictions. For example, V3D 3.3 (used in brcm,7268-v3d) has a cache
> controller (GCA), which is not present in other V3D generations. Declaring
> these differences helps ensure the DTB accurately reflect the hardware
> design.
>
> The example was using an incorrect order for the register names. This
> commit corrects that by enforcing the order established in the register
> items description.
>
> Signed-off-by: Maíra Canal <mcanal@igalia.com>
> ---
> .../devicetree/bindings/gpu/brcm,bcm-v3d.yaml | 86 ++++++++++++++++++----
> 1 file changed, 73 insertions(+), 13 deletions(-)
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v6 1/5] drm/v3d: Associate a V3D tech revision to all supported devices
2025-03-18 1:01 ` [PATCH v6 1/5] drm/v3d: Associate a V3D tech revision to all supported devices Maíra Canal
@ 2025-03-18 16:44 ` Stefan Wahren
2025-03-18 20:03 ` kernel test robot
1 sibling, 0 replies; 14+ messages in thread
From: Stefan Wahren @ 2025-03-18 16:44 UTC (permalink / raw)
To: Maíra Canal, Melissa Wen, Iago Toral, Krzysztof Kozlowski,
Conor Dooley, Nicolas Saenz Julienne, Florian Fainelli
Cc: Phil Elwell, dri-devel, devicetree, kernel-dev
Am 18.03.25 um 02:01 schrieb Maíra Canal:
> The V3D driver currently determines the GPU tech version (33, 41...)
> by reading a register. This approach has worked so far since this
> information wasn’t needed before powering on the GPU.
>
> V3D 7.1 introduces new registers that must be written to power on the
> GPU, requiring us to know the V3D version beforehand. To address this,
> associate each supported SoC with the corresponding VideoCore GPU version
> as part of the device data.
>
> To prevent possible mistakes, add an assertion to verify that the version
> specified in the device data matches the one reported by the hardware.
> If there is a mismatch, the kernel will trigger a warning.
>
> With the goal of maintaining consistency around the driver, use `enum
> v3d_gen` to assign values to `v3d->ver` and for comparisons with other
> V3D generations. Note that all mentions of unsupported or non-existing V3D
> generations (such as V3D 4.0) were removed by this commit and replaced
> with supported generations without functional changes.
>
> Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
> Signed-off-by: Maíra Canal <mcanal@igalia.com>
Reviewed-by: Stefan Wahren <wahrenst@gmx.net>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v6 1/5] drm/v3d: Associate a V3D tech revision to all supported devices
2025-03-18 1:01 ` [PATCH v6 1/5] drm/v3d: Associate a V3D tech revision to all supported devices Maíra Canal
2025-03-18 16:44 ` Stefan Wahren
@ 2025-03-18 20:03 ` kernel test robot
1 sibling, 0 replies; 14+ messages in thread
From: kernel test robot @ 2025-03-18 20:03 UTC (permalink / raw)
To: Maíra Canal, Melissa Wen, Iago Toral, Krzysztof Kozlowski,
Conor Dooley, Nicolas Saenz Julienne, Stefan Wahren,
Florian Fainelli
Cc: llvm, oe-kbuild-all, Phil Elwell, dri-devel, devicetree,
kernel-dev, Maíra Canal
Hi Maíra,
kernel test robot noticed the following build warnings:
[auto build test WARNING on 83a0237859bc5a9e0a716e1db8e7fd3cafd63259]
url: https://github.com/intel-lab-lkp/linux/commits/Ma-ra-Canal/drm-v3d-Associate-a-V3D-tech-revision-to-all-supported-devices/20250318-090556
base: 83a0237859bc5a9e0a716e1db8e7fd3cafd63259
patch link: https://lore.kernel.org/r/20250317-v3d-gpu-reset-fixes-v6-1-f3ee7717ed17%40igalia.com
patch subject: [PATCH v6 1/5] drm/v3d: Associate a V3D tech revision to all supported devices
config: x86_64-buildonly-randconfig-002-20250318 (https://download.01.org/0day-ci/archive/20250319/202503190317.nnVNkMGI-lkp@intel.com/config)
compiler: clang version 20.1.0 (https://github.com/llvm/llvm-project 24a30daaa559829ad079f2ff7f73eb4e18095f88)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250319/202503190317.nnVNkMGI-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202503190317.nnVNkMGI-lkp@intel.com/
All warnings (new ones prefixed by >>):
>> drivers/gpu/drm/v3d/v3d_drv.c:292:8: warning: cast to smaller integer type 'enum v3d_gen' from 'const void *' [-Wvoid-pointer-to-enum-cast]
292 | gen = (enum v3d_gen)of_device_get_match_data(dev);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 warning generated.
vim +292 drivers/gpu/drm/v3d/v3d_drv.c
272
273 static int v3d_platform_drm_probe(struct platform_device *pdev)
274 {
275 struct device *dev = &pdev->dev;
276 struct drm_device *drm;
277 struct v3d_dev *v3d;
278 enum v3d_gen gen;
279 int ret;
280 u32 mmu_debug;
281 u32 ident1, ident3;
282 u64 mask;
283
284 v3d = devm_drm_dev_alloc(dev, &v3d_drm_driver, struct v3d_dev, drm);
285 if (IS_ERR(v3d))
286 return PTR_ERR(v3d);
287
288 drm = &v3d->drm;
289
290 platform_set_drvdata(pdev, drm);
291
> 292 gen = (enum v3d_gen)of_device_get_match_data(dev);
293 v3d->ver = gen;
294
295 ret = map_regs(v3d, &v3d->hub_regs, "hub");
296 if (ret)
297 return ret;
298
299 ret = map_regs(v3d, &v3d->core_regs[0], "core0");
300 if (ret)
301 return ret;
302
303 v3d->clk = devm_clk_get_optional(dev, NULL);
304 if (IS_ERR(v3d->clk))
305 return dev_err_probe(dev, PTR_ERR(v3d->clk), "Failed to get V3D clock\n");
306
307 ret = clk_prepare_enable(v3d->clk);
308 if (ret) {
309 dev_err(&pdev->dev, "Couldn't enable the V3D clock\n");
310 return ret;
311 }
312
313 mmu_debug = V3D_READ(V3D_MMU_DEBUG_INFO);
314 mask = DMA_BIT_MASK(30 + V3D_GET_FIELD(mmu_debug, V3D_MMU_PA_WIDTH));
315 ret = dma_set_mask_and_coherent(dev, mask);
316 if (ret)
317 goto clk_disable;
318
319 v3d->va_width = 30 + V3D_GET_FIELD(mmu_debug, V3D_MMU_VA_WIDTH);
320
321 ident1 = V3D_READ(V3D_HUB_IDENT1);
322 v3d->ver = (V3D_GET_FIELD(ident1, V3D_HUB_IDENT1_TVER) * 10 +
323 V3D_GET_FIELD(ident1, V3D_HUB_IDENT1_REV));
324 /* Make sure that the V3D tech version retrieved from the HW is equal
325 * to the one advertised by the device tree.
326 */
327 WARN_ON(v3d->ver != gen);
328
329 v3d->cores = V3D_GET_FIELD(ident1, V3D_HUB_IDENT1_NCORES);
330 WARN_ON(v3d->cores > 1); /* multicore not yet implemented */
331
332 ident3 = V3D_READ(V3D_HUB_IDENT3);
333 v3d->rev = V3D_GET_FIELD(ident3, V3D_HUB_IDENT3_IPREV);
334
335 v3d_perfmon_init(v3d);
336
337 v3d->reset = devm_reset_control_get_exclusive(dev, NULL);
338 if (IS_ERR(v3d->reset)) {
339 ret = PTR_ERR(v3d->reset);
340
341 if (ret == -EPROBE_DEFER)
342 goto clk_disable;
343
344 v3d->reset = NULL;
345 ret = map_regs(v3d, &v3d->bridge_regs, "bridge");
346 if (ret) {
347 dev_err(dev,
348 "Failed to get reset control or bridge regs\n");
349 goto clk_disable;
350 }
351 }
352
353 if (v3d->ver < V3D_GEN_41) {
354 ret = map_regs(v3d, &v3d->gca_regs, "gca");
355 if (ret)
356 goto clk_disable;
357 }
358
359 v3d->mmu_scratch = dma_alloc_wc(dev, 4096, &v3d->mmu_scratch_paddr,
360 GFP_KERNEL | __GFP_NOWARN | __GFP_ZERO);
361 if (!v3d->mmu_scratch) {
362 dev_err(dev, "Failed to allocate MMU scratch page\n");
363 ret = -ENOMEM;
364 goto clk_disable;
365 }
366
367 ret = v3d_gem_init(drm);
368 if (ret)
369 goto dma_free;
370
371 ret = v3d_irq_init(v3d);
372 if (ret)
373 goto gem_destroy;
374
375 ret = drm_dev_register(drm, 0);
376 if (ret)
377 goto irq_disable;
378
379 ret = v3d_sysfs_init(dev);
380 if (ret)
381 goto drm_unregister;
382
383 return 0;
384
385 drm_unregister:
386 drm_dev_unregister(drm);
387 irq_disable:
388 v3d_irq_disable(v3d);
389 gem_destroy:
390 v3d_gem_destroy(drm);
391 dma_free:
392 dma_free_wc(dev, 4096, v3d->mmu_scratch, v3d->mmu_scratch_paddr);
393 clk_disable:
394 clk_disable_unprepare(v3d->clk);
395 return ret;
396 }
397
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v6 3/5] dt-bindings: gpu: v3d: Add SMS register to BCM2712 compatible
2025-03-18 1:01 ` [PATCH v6 3/5] dt-bindings: gpu: v3d: Add SMS register to BCM2712 compatible Maíra Canal
@ 2025-03-19 11:07 ` Stefan Wahren
0 siblings, 0 replies; 14+ messages in thread
From: Stefan Wahren @ 2025-03-19 11:07 UTC (permalink / raw)
To: Maíra Canal, Melissa Wen, Iago Toral, Krzysztof Kozlowski,
Conor Dooley, Nicolas Saenz Julienne, Florian Fainelli
Cc: Phil Elwell, dri-devel, devicetree, kernel-dev,
Krzysztof Kozlowski
Hi Maíra,
Am 18.03.25 um 02:01 schrieb Maíra Canal:
> V3D 7.1 exposes a new register block, called V3D_SMS. As BCM2712 has a
> V3D 7.1 core, add a new register item to its compatible. Similar to the
> GCA, which is specific for V3D 3.3, SMS should only be added for V3D 7.1
> variants (such as brcm,2712-v3d).
>
> Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
> Signed-off-by: Maíra Canal <mcanal@igalia.com>
> ---
> Documentation/devicetree/bindings/gpu/brcm,bcm-v3d.yaml | 2 ++
> 1 file changed, 2 insertions(+)
>
> diff --git a/Documentation/devicetree/bindings/gpu/brcm,bcm-v3d.yaml b/Documentation/devicetree/bindings/gpu/brcm,bcm-v3d.yaml
> index 6a1a09031983eda4691a939329ed159b32f77669..dd2cc63c9a51da11691e4e81b225b74fbe86d709 100644
> --- a/Documentation/devicetree/bindings/gpu/brcm,bcm-v3d.yaml
> +++ b/Documentation/devicetree/bindings/gpu/brcm,bcm-v3d.yaml
> @@ -77,10 +77,12 @@ allOf:
> items:
> - description: hub register
> - description: core0 register
> + - description: SMS state manager register
sorry, i still don't get what SMS means. What does the second S stand for?
Regards
> reg-names:
> items:
> - const: hub
> - const: core0
> + - const: sms
> - if:
> properties:
> compatible:
>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v6 0/5] drm/v3d: Fix GPU reset issues on the Raspberry Pi 5
2025-03-18 1:01 [PATCH v6 0/5] drm/v3d: Fix GPU reset issues on the Raspberry Pi 5 Maíra Canal
` (4 preceding siblings ...)
2025-03-18 1:01 ` [PATCH v6 5/5] drm/v3d: Use V3D_SMS registers for power on/off and reset on V3D 7.x Maíra Canal
@ 2025-03-23 14:45 ` Maíra Canal
5 siblings, 0 replies; 14+ messages in thread
From: Maíra Canal @ 2025-03-23 14:45 UTC (permalink / raw)
To: Melissa Wen, Iago Toral, Krzysztof Kozlowski, Conor Dooley,
Nicolas Saenz Julienne, Stefan Wahren, Florian Fainelli
Cc: Phil Elwell, dri-devel, devicetree, kernel-dev,
Krzysztof Kozlowski, Emma Anholt, Rob Herring (Arm)
On 17/03/25 22:01, Maíra Canal wrote:
> This series addresses GPU reset issues reported in [1], where running a
> long compute job would trigger repeated GPU resets, leading to a UI
> freeze.
>
> The patches that prevent the same faulty job from being resubmitted in a
> loop were merged in drm-misc/drm-misc-fixes in v4.
>
> However, those patches don't solve the issue entirely. Even with a single
> GPU reset, the UI still freezes on the Raspberry Pi 5, indicating a GPU
> hang. Patches #1, #3, and #5 address this by properly configuring the
> V3D_SMS registers, which are required for power management and resets
> in V3D 7.1.
>
> Patches #2 and #4 are associated changes related to the robustness
> of the DT bindings. Patch #3 added a new register bank to the DT binding
> and during the reviewing process, we identified points that could to be
> improved in the DT binding.
>
> Patch #2 started by adding per-compatible register restrictions to ensure
> that the DTB accurately reflects the hardware design and #5 updates the DT
> maintainership, replacing Emma with the current v3d driver maintainer.
>
> [1] https://github.com/raspberrypi/linux/issues/6660
>
> Best Regards,
> - Maíra
>
[...]
Applied to misc/kernel.git (drm-misc-next). Before applying PATCH 1/5, I
fixed the W=1 warning reported by the kernel test robot with the
following diff:
- gen = (enum v3d_gen)of_device_get_match_data(dev);
+ gen = (uintptr_t)of_device_get_match_data(dev);
Thanks for all involved in the reviewing process!
Best Regards,
- Maíra
> ---
> Maíra Canal (5):
> drm/v3d: Associate a V3D tech revision to all supported devices
> dt-bindings: gpu: v3d: Add per-compatible register restrictions
> dt-bindings: gpu: v3d: Add SMS register to BCM2712 compatible
> dt-bindings: gpu: v3d: Add V3D driver maintainer as DT maintainer
> drm/v3d: Use V3D_SMS registers for power on/off and reset on V3D 7.x
>
> .../devicetree/bindings/gpu/brcm,bcm-v3d.yaml | 90 ++++++++++++---
> drivers/gpu/drm/v3d/v3d_debugfs.c | 126 ++++++++++-----------
> drivers/gpu/drm/v3d/v3d_drv.c | 62 +++++++++-
> drivers/gpu/drm/v3d/v3d_drv.h | 22 +++-
> drivers/gpu/drm/v3d/v3d_gem.c | 27 ++++-
> drivers/gpu/drm/v3d/v3d_irq.c | 6 +-
> drivers/gpu/drm/v3d/v3d_perfmon.c | 4 +-
> drivers/gpu/drm/v3d/v3d_regs.h | 26 +++++
> drivers/gpu/drm/v3d/v3d_sched.c | 6 +-
> 9 files changed, 271 insertions(+), 98 deletions(-)
> ---
> base-commit: 83a0237859bc5a9e0a716e1db8e7fd3cafd63259
> change-id: 20250224-v3d-gpu-reset-fixes-2d21fc70711d
>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v6 5/5] drm/v3d: Use V3D_SMS registers for power on/off and reset on V3D 7.x
2025-03-18 1:01 ` [PATCH v6 5/5] drm/v3d: Use V3D_SMS registers for power on/off and reset on V3D 7.x Maíra Canal
@ 2025-03-27 10:57 ` Stefan Wahren
2025-03-27 13:52 ` Maíra Canal
0 siblings, 1 reply; 14+ messages in thread
From: Stefan Wahren @ 2025-03-27 10:57 UTC (permalink / raw)
To: Maíra Canal, Melissa Wen, Iago Toral, Krzysztof Kozlowski,
Conor Dooley, Nicolas Saenz Julienne, Florian Fainelli
Cc: Phil Elwell, dri-devel, devicetree, kernel-dev
Hi Maíra,
Am 18.03.25 um 02:01 schrieb Maíra Canal:
> In addition to the standard reset controller, V3D 7.x requires configuring
> the V3D_SMS registers for proper power on/off and reset. Add the new
> registers to `v3d_regs.h` and ensure they are properly configured during
> device probing, removal, and reset.
>
> This change fixes GPU reset issues on the Raspberry Pi 5 (BCM2712).
> Without exposing these registers, a GPU reset causes the GPU to hang,
> stopping any further job execution and freezing the desktop GUI. The same
> issue occurs when unloading and loading the v3d driver.
>
> Link: https://github.com/raspberrypi/linux/issues/6660
> Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
> Signed-off-by: Maíra Canal <mcanal@igalia.com>
> ---
> drivers/gpu/drm/v3d/v3d_drv.c | 40 ++++++++++++++++++++++++++++++++++++++++
> drivers/gpu/drm/v3d/v3d_drv.h | 11 +++++++++++
> drivers/gpu/drm/v3d/v3d_gem.c | 17 +++++++++++++++++
> drivers/gpu/drm/v3d/v3d_regs.h | 26 ++++++++++++++++++++++++++
> 4 files changed, 94 insertions(+)
>
> diff --git a/drivers/gpu/drm/v3d/v3d_drv.c b/drivers/gpu/drm/v3d/v3d_drv.c
> index c63f0ed1bd8a3d5511085e76ed2fbd6ee7df6f80..122848cdccc4a02039d9ea2e77aa2f377886b5d6 100644
> --- a/drivers/gpu/drm/v3d/v3d_drv.c
> +++ b/drivers/gpu/drm/v3d/v3d_drv.c
> @@ -263,6 +263,36 @@ static const struct of_device_id v3d_of_match[] = {
> };
> MODULE_DEVICE_TABLE(of, v3d_of_match);
>
> +static void
> +v3d_idle_sms(struct v3d_dev *v3d)
> +{
> + if (v3d->ver < V3D_GEN_71)
> + return;
> +
> + V3D_SMS_WRITE(V3D_SMS_TEE_CS, V3D_SMS_CLEAR_POWER_OFF);
> +
> + if (wait_for((V3D_GET_FIELD(V3D_SMS_READ(V3D_SMS_TEE_CS),
> + V3D_SMS_STATE) == V3D_SMS_IDLE), 100)) {
> + DRM_ERROR("Failed to power up SMS\n");
> + }
> +
> + v3d_reset_sms(v3d);
> +}
> +
> +static void
> +v3d_power_off_sms(struct v3d_dev *v3d)
> +{
> + if (v3d->ver < V3D_GEN_71)
> + return;
> +
> + V3D_SMS_WRITE(V3D_SMS_TEE_CS, V3D_SMS_POWER_OFF);
> +
> + if (wait_for((V3D_GET_FIELD(V3D_SMS_READ(V3D_SMS_TEE_CS),
> + V3D_SMS_STATE) == V3D_SMS_POWER_OFF_STATE), 100)) {
> + DRM_ERROR("Failed to power off SMS\n");
> + }
> +}
> +
> static int
> map_regs(struct v3d_dev *v3d, void __iomem **regs, const char *name)
> {
> @@ -300,6 +330,12 @@ static int v3d_platform_drm_probe(struct platform_device *pdev)
> if (ret)
> return ret;
>
> + if (v3d->ver >= V3D_GEN_71) {
> + ret = map_regs(v3d, &v3d->sms_regs, "sms");
> + if (ret)
> + return ret;
Is it correct, that BCM2712 now requires the SMS register and otherwise
the driver doesn't probe?
Just a note for the future: the devicetree is considered as an ABI [1],
so new kernels should still work with old DTB (no regression). For
Raspberry Pi OS, the kernel and DTB are always updated, but this doesn't
apply for Linux Mainline. AFAIK V3D doesn't work with Linux Mainline on
Raspberry Pi 5 yet, so this is just a theoretical problem.
Best regards
[1] - https://docs.kernel.org/devicetree/bindings/ABI.html
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v6 5/5] drm/v3d: Use V3D_SMS registers for power on/off and reset on V3D 7.x
2025-03-27 10:57 ` Stefan Wahren
@ 2025-03-27 13:52 ` Maíra Canal
2025-03-27 15:19 ` Stefan Wahren
0 siblings, 1 reply; 14+ messages in thread
From: Maíra Canal @ 2025-03-27 13:52 UTC (permalink / raw)
To: Stefan Wahren, Melissa Wen, Iago Toral, Krzysztof Kozlowski,
Conor Dooley, Nicolas Saenz Julienne, Florian Fainelli
Cc: Phil Elwell, dri-devel, devicetree, kernel-dev
Hi Stefan,
On 27/03/25 07:57, Stefan Wahren wrote:
> Hi Maíra,
>
> Am 18.03.25 um 02:01 schrieb Maíra Canal:
>> In addition to the standard reset controller, V3D 7.x requires
>> configuring
>> the V3D_SMS registers for proper power on/off and reset. Add the new
>> registers to `v3d_regs.h` and ensure they are properly configured during
>> device probing, removal, and reset.
>>
>> This change fixes GPU reset issues on the Raspberry Pi 5 (BCM2712).
>> Without exposing these registers, a GPU reset causes the GPU to hang,
>> stopping any further job execution and freezing the desktop GUI. The same
>> issue occurs when unloading and loading the v3d driver.
>>
>> Link: https://github.com/raspberrypi/linux/issues/6660
>> Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
>> Signed-off-by: Maíra Canal <mcanal@igalia.com>
>> ---
>> drivers/gpu/drm/v3d/v3d_drv.c | 40 ++++++++++++++++++++++++++++++++
>> ++++++++
>> drivers/gpu/drm/v3d/v3d_drv.h | 11 +++++++++++
>> drivers/gpu/drm/v3d/v3d_gem.c | 17 +++++++++++++++++
>> drivers/gpu/drm/v3d/v3d_regs.h | 26 ++++++++++++++++++++++++++
>> 4 files changed, 94 insertions(+)
>>
>> diff --git a/drivers/gpu/drm/v3d/v3d_drv.c b/drivers/gpu/drm/v3d/
>> v3d_drv.c
>> index
>> c63f0ed1bd8a3d5511085e76ed2fbd6ee7df6f80..122848cdccc4a02039d9ea2e77aa2f377886b5d6 100644
>> --- a/drivers/gpu/drm/v3d/v3d_drv.c
>> +++ b/drivers/gpu/drm/v3d/v3d_drv.c
>> @@ -263,6 +263,36 @@ static const struct of_device_id v3d_of_match[] = {
>> };
>> MODULE_DEVICE_TABLE(of, v3d_of_match);
>>
>> +static void
>> +v3d_idle_sms(struct v3d_dev *v3d)
>> +{
>> + if (v3d->ver < V3D_GEN_71)
>> + return;
>> +
>> + V3D_SMS_WRITE(V3D_SMS_TEE_CS, V3D_SMS_CLEAR_POWER_OFF);
>> +
>> + if (wait_for((V3D_GET_FIELD(V3D_SMS_READ(V3D_SMS_TEE_CS),
>> + V3D_SMS_STATE) == V3D_SMS_IDLE), 100)) {
>> + DRM_ERROR("Failed to power up SMS\n");
>> + }
>> +
>> + v3d_reset_sms(v3d);
>> +}
>> +
>> +static void
>> +v3d_power_off_sms(struct v3d_dev *v3d)
>> +{
>> + if (v3d->ver < V3D_GEN_71)
>> + return;
>> +
>> + V3D_SMS_WRITE(V3D_SMS_TEE_CS, V3D_SMS_POWER_OFF);
>> +
>> + if (wait_for((V3D_GET_FIELD(V3D_SMS_READ(V3D_SMS_TEE_CS),
>> + V3D_SMS_STATE) == V3D_SMS_POWER_OFF_STATE), 100)) {
>> + DRM_ERROR("Failed to power off SMS\n");
>> + }
>> +}
>> +
>> static int
>> map_regs(struct v3d_dev *v3d, void __iomem **regs, const char *name)
>> {
>> @@ -300,6 +330,12 @@ static int v3d_platform_drm_probe(struct
>> platform_device *pdev)
>> if (ret)
>> return ret;
>>
>> + if (v3d->ver >= V3D_GEN_71) {
>> + ret = map_regs(v3d, &v3d->sms_regs, "sms");
>> + if (ret)
>> + return ret;
> Is it correct, that BCM2712 now requires the SMS register and otherwise
> the driver doesn't probe?
Hum, yeah, it is correct, but I can send a patch to ensure backwards
compatibility. But keep in mind that you won't be able to reset the GPU
or unload/load (power on/off).
>
> Just a note for the future: the devicetree is considered as an ABI [1],
> so new kernels should still work with old DTB (no regression). For
> Raspberry Pi OS, the kernel and DTB are always updated, but this doesn't
> apply for Linux Mainline. AFAIK V3D doesn't work with Linux Mainline on
> Raspberry Pi 5 yet, so this is just a theoretical problem.
Yeah, I had that in mind, but due to the reason pointed in the end of
your comment, it was okay to do so and ensure that reset and power on/
off will work when RPi 5 reach upstream support.
But, I'm open to send a patch removing the requirement.
Best Regards,
- Maíra
>
> Best regards
>
> [1] - https://docs.kernel.org/devicetree/bindings/ABI.html
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v6 5/5] drm/v3d: Use V3D_SMS registers for power on/off and reset on V3D 7.x
2025-03-27 13:52 ` Maíra Canal
@ 2025-03-27 15:19 ` Stefan Wahren
0 siblings, 0 replies; 14+ messages in thread
From: Stefan Wahren @ 2025-03-27 15:19 UTC (permalink / raw)
To: Maíra Canal, Melissa Wen, Iago Toral, Krzysztof Kozlowski,
Conor Dooley, Nicolas Saenz Julienne, Florian Fainelli
Cc: Phil Elwell, dri-devel, devicetree, kernel-dev
Am 27.03.25 um 14:52 schrieb Maíra Canal:
> Hi Stefan,
>
> On 27/03/25 07:57, Stefan Wahren wrote:
>> Hi Maíra,
>>
>> Am 18.03.25 um 02:01 schrieb Maíra Canal:
>>> In addition to the standard reset controller, V3D 7.x requires
>>> configuring
>>> the V3D_SMS registers for proper power on/off and reset. Add the new
>>> registers to `v3d_regs.h` and ensure they are properly configured
>>> during
>>> device probing, removal, and reset.
>>>
>>> This change fixes GPU reset issues on the Raspberry Pi 5 (BCM2712).
>>> Without exposing these registers, a GPU reset causes the GPU to hang,
>>> stopping any further job execution and freezing the desktop GUI. The
>>> same
>>> issue occurs when unloading and loading the v3d driver.
>>>
>>> Link: https://github.com/raspberrypi/linux/issues/6660
>>> Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
>>> Signed-off-by: Maíra Canal <mcanal@igalia.com>
>>> ---
>>> drivers/gpu/drm/v3d/v3d_drv.c | 40
>>> ++++++++++++++++++++++++++++++++ ++++++++
>>> drivers/gpu/drm/v3d/v3d_drv.h | 11 +++++++++++
>>> drivers/gpu/drm/v3d/v3d_gem.c | 17 +++++++++++++++++
>>> drivers/gpu/drm/v3d/v3d_regs.h | 26 ++++++++++++++++++++++++++
>>> 4 files changed, 94 insertions(+)
>>>
>>> diff --git a/drivers/gpu/drm/v3d/v3d_drv.c b/drivers/gpu/drm/v3d/
>>> v3d_drv.c
>>> index
>>> c63f0ed1bd8a3d5511085e76ed2fbd6ee7df6f80..122848cdccc4a02039d9ea2e77aa2f377886b5d6
>>> 100644
>>> --- a/drivers/gpu/drm/v3d/v3d_drv.c
>>> +++ b/drivers/gpu/drm/v3d/v3d_drv.c
>>> @@ -263,6 +263,36 @@ static const struct of_device_id v3d_of_match[]
>>> = {
>>> };
>>> MODULE_DEVICE_TABLE(of, v3d_of_match);
>>>
>>> +static void
>>> +v3d_idle_sms(struct v3d_dev *v3d)
>>> +{
>>> + if (v3d->ver < V3D_GEN_71)
>>> + return;
>>> +
>>> + V3D_SMS_WRITE(V3D_SMS_TEE_CS, V3D_SMS_CLEAR_POWER_OFF);
>>> +
>>> + if (wait_for((V3D_GET_FIELD(V3D_SMS_READ(V3D_SMS_TEE_CS),
>>> + V3D_SMS_STATE) == V3D_SMS_IDLE), 100)) {
>>> + DRM_ERROR("Failed to power up SMS\n");
>>> + }
>>> +
>>> + v3d_reset_sms(v3d);
>>> +}
>>> +
>>> +static void
>>> +v3d_power_off_sms(struct v3d_dev *v3d)
>>> +{
>>> + if (v3d->ver < V3D_GEN_71)
>>> + return;
>>> +
>>> + V3D_SMS_WRITE(V3D_SMS_TEE_CS, V3D_SMS_POWER_OFF);
>>> +
>>> + if (wait_for((V3D_GET_FIELD(V3D_SMS_READ(V3D_SMS_TEE_CS),
>>> + V3D_SMS_STATE) == V3D_SMS_POWER_OFF_STATE),
>>> 100)) {
>>> + DRM_ERROR("Failed to power off SMS\n");
>>> + }
>>> +}
>>> +
>>> static int
>>> map_regs(struct v3d_dev *v3d, void __iomem **regs, const char *name)
>>> {
>>> @@ -300,6 +330,12 @@ static int v3d_platform_drm_probe(struct
>>> platform_device *pdev)
>>> if (ret)
>>> return ret;
>>>
>>> + if (v3d->ver >= V3D_GEN_71) {
>>> + ret = map_regs(v3d, &v3d->sms_regs, "sms");
>>> + if (ret)
>>> + return ret;
>> Is it correct, that BCM2712 now requires the SMS register and otherwise
>> the driver doesn't probe?
>
> Hum, yeah, it is correct, but I can send a patch to ensure backwards
> compatibility. But keep in mind that you won't be able to reset the GPU
> or unload/load (power on/off).
>
>>
>> Just a note for the future: the devicetree is considered as an ABI [1],
>> so new kernels should still work with old DTB (no regression). For
>> Raspberry Pi OS, the kernel and DTB are always updated, but this doesn't
>> apply for Linux Mainline. AFAIK V3D doesn't work with Linux Mainline on
>> Raspberry Pi 5 yet, so this is just a theoretical problem.
>
> Yeah, I had that in mind, but due to the reason pointed in the end of
> your comment, it was okay to do so and ensure that reset and power on/
> off will work when RPi 5 reach upstream support.
Fine :-)
>
> But, I'm open to send a patch removing the requirement.
I think, this is not necessary. There is no need to introduce such
"complexity".
>
> Best Regards,
> - Maíra
>
>>
>> Best regards
>>
>> [1] - https://docs.kernel.org/devicetree/bindings/ABI.html
>
^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2025-03-27 15:19 UTC | newest]
Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-03-18 1:01 [PATCH v6 0/5] drm/v3d: Fix GPU reset issues on the Raspberry Pi 5 Maíra Canal
2025-03-18 1:01 ` [PATCH v6 1/5] drm/v3d: Associate a V3D tech revision to all supported devices Maíra Canal
2025-03-18 16:44 ` Stefan Wahren
2025-03-18 20:03 ` kernel test robot
2025-03-18 1:01 ` [PATCH v6 2/5] dt-bindings: gpu: v3d: Add per-compatible register restrictions Maíra Canal
2025-03-18 8:03 ` Krzysztof Kozlowski
2025-03-18 1:01 ` [PATCH v6 3/5] dt-bindings: gpu: v3d: Add SMS register to BCM2712 compatible Maíra Canal
2025-03-19 11:07 ` Stefan Wahren
2025-03-18 1:01 ` [PATCH v6 4/5] dt-bindings: gpu: v3d: Add V3D driver maintainer as DT maintainer Maíra Canal
2025-03-18 1:01 ` [PATCH v6 5/5] drm/v3d: Use V3D_SMS registers for power on/off and reset on V3D 7.x Maíra Canal
2025-03-27 10:57 ` Stefan Wahren
2025-03-27 13:52 ` Maíra Canal
2025-03-27 15:19 ` Stefan Wahren
2025-03-23 14:45 ` [PATCH v6 0/5] drm/v3d: Fix GPU reset issues on the Raspberry Pi 5 Maíra Canal
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox