Skip to content

Commit 9798837

Browse files
mairacanalpelwell
authored andcommitted
drm/v3d: Associate a V3D tech revision to all supported devices
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. Signed-off-by: Maíra Canal <mcanal@igalia.com>
1 parent 1315642 commit 9798837

File tree

6 files changed

+106
-89
lines changed

6 files changed

+106
-89
lines changed

drivers/gpu/drm/v3d/v3d_debugfs.c

Lines changed: 64 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -22,74 +22,74 @@ struct v3d_reg_def {
2222
};
2323

2424
static const struct v3d_reg_def v3d_hub_reg_defs[] = {
25-
REGDEF(33, 42, V3D_HUB_AXICFG),
26-
REGDEF(33, 71, V3D_HUB_UIFCFG),
27-
REGDEF(33, 71, V3D_HUB_IDENT0),
28-
REGDEF(33, 71, V3D_HUB_IDENT1),
29-
REGDEF(33, 71, V3D_HUB_IDENT2),
30-
REGDEF(33, 71, V3D_HUB_IDENT3),
31-
REGDEF(33, 71, V3D_HUB_INT_STS),
32-
REGDEF(33, 71, V3D_HUB_INT_MSK_STS),
33-
34-
REGDEF(33, 71, V3D_MMU_CTL),
35-
REGDEF(33, 71, V3D_MMU_VIO_ADDR),
36-
REGDEF(33, 71, V3D_MMU_VIO_ID),
37-
REGDEF(33, 71, V3D_MMU_DEBUG_INFO),
38-
39-
REGDEF(71, 71, V3D_V7_GMP_STATUS),
40-
REGDEF(71, 71, V3D_V7_GMP_CFG),
41-
REGDEF(71, 71, V3D_V7_GMP_VIO_ADDR),
25+
REGDEF(V3D_GEN_33, V3D_GEN_42, V3D_HUB_AXICFG),
26+
REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_HUB_UIFCFG),
27+
REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_HUB_IDENT0),
28+
REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_HUB_IDENT1),
29+
REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_HUB_IDENT2),
30+
REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_HUB_IDENT3),
31+
REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_HUB_INT_STS),
32+
REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_HUB_INT_MSK_STS),
33+
34+
REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_MMU_CTL),
35+
REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_MMU_VIO_ADDR),
36+
REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_MMU_VIO_ID),
37+
REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_MMU_DEBUG_INFO),
38+
39+
REGDEF(V3D_GEN_71, V3D_GEN_71, V3D_V7_GMP_STATUS),
40+
REGDEF(V3D_GEN_71, V3D_GEN_71, V3D_V7_GMP_CFG),
41+
REGDEF(V3D_GEN_71, V3D_GEN_71, V3D_V7_GMP_VIO_ADDR),
4242
};
4343

4444
static const struct v3d_reg_def v3d_gca_reg_defs[] = {
45-
REGDEF(33, 33, V3D_GCA_SAFE_SHUTDOWN),
46-
REGDEF(33, 33, V3D_GCA_SAFE_SHUTDOWN_ACK),
45+
REGDEF(V3D_GEN_33, V3D_GEN_33, V3D_GCA_SAFE_SHUTDOWN),
46+
REGDEF(V3D_GEN_33, V3D_GEN_33, V3D_GCA_SAFE_SHUTDOWN_ACK),
4747
};
4848

4949
static const struct v3d_reg_def v3d_core_reg_defs[] = {
50-
REGDEF(33, 71, V3D_CTL_IDENT0),
51-
REGDEF(33, 71, V3D_CTL_IDENT1),
52-
REGDEF(33, 71, V3D_CTL_IDENT2),
53-
REGDEF(33, 71, V3D_CTL_MISCCFG),
54-
REGDEF(33, 71, V3D_CTL_INT_STS),
55-
REGDEF(33, 71, V3D_CTL_INT_MSK_STS),
56-
REGDEF(33, 71, V3D_CLE_CT0CS),
57-
REGDEF(33, 71, V3D_CLE_CT0CA),
58-
REGDEF(33, 71, V3D_CLE_CT0EA),
59-
REGDEF(33, 71, V3D_CLE_CT1CS),
60-
REGDEF(33, 71, V3D_CLE_CT1CA),
61-
REGDEF(33, 71, V3D_CLE_CT1EA),
62-
63-
REGDEF(33, 71, V3D_PTB_BPCA),
64-
REGDEF(33, 71, V3D_PTB_BPCS),
65-
66-
REGDEF(33, 41, V3D_GMP_STATUS),
67-
REGDEF(33, 41, V3D_GMP_CFG),
68-
REGDEF(33, 41, V3D_GMP_VIO_ADDR),
69-
70-
REGDEF(33, 71, V3D_ERR_FDBGO),
71-
REGDEF(33, 71, V3D_ERR_FDBGB),
72-
REGDEF(33, 71, V3D_ERR_FDBGS),
73-
REGDEF(33, 71, V3D_ERR_STAT),
50+
REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_CTL_IDENT0),
51+
REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_CTL_IDENT1),
52+
REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_CTL_IDENT2),
53+
REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_CTL_MISCCFG),
54+
REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_CTL_INT_STS),
55+
REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_CTL_INT_MSK_STS),
56+
REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_CLE_CT0CS),
57+
REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_CLE_CT0CA),
58+
REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_CLE_CT0EA),
59+
REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_CLE_CT1CS),
60+
REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_CLE_CT1CA),
61+
REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_CLE_CT1EA),
62+
63+
REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_PTB_BPCA),
64+
REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_PTB_BPCS),
65+
66+
REGDEF(V3D_GEN_33, V3D_GEN_41, V3D_GMP_STATUS),
67+
REGDEF(V3D_GEN_33, V3D_GEN_41, V3D_GMP_CFG),
68+
REGDEF(V3D_GEN_33, V3D_GEN_41, V3D_GMP_VIO_ADDR),
69+
70+
REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_ERR_FDBGO),
71+
REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_ERR_FDBGB),
72+
REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_ERR_FDBGS),
73+
REGDEF(V3D_GEN_33, V3D_GEN_71, V3D_ERR_STAT),
7474
};
7575

7676
static const struct v3d_reg_def v3d_csd_reg_defs[] = {
77-
REGDEF(41, 71, V3D_CSD_STATUS),
78-
REGDEF(41, 41, V3D_CSD_CURRENT_CFG0),
79-
REGDEF(41, 41, V3D_CSD_CURRENT_CFG1),
80-
REGDEF(41, 41, V3D_CSD_CURRENT_CFG2),
81-
REGDEF(41, 41, V3D_CSD_CURRENT_CFG3),
82-
REGDEF(41, 41, V3D_CSD_CURRENT_CFG4),
83-
REGDEF(41, 41, V3D_CSD_CURRENT_CFG5),
84-
REGDEF(41, 41, V3D_CSD_CURRENT_CFG6),
85-
REGDEF(71, 71, V3D_V7_CSD_CURRENT_CFG0),
86-
REGDEF(71, 71, V3D_V7_CSD_CURRENT_CFG1),
87-
REGDEF(71, 71, V3D_V7_CSD_CURRENT_CFG2),
88-
REGDEF(71, 71, V3D_V7_CSD_CURRENT_CFG3),
89-
REGDEF(71, 71, V3D_V7_CSD_CURRENT_CFG4),
90-
REGDEF(71, 71, V3D_V7_CSD_CURRENT_CFG5),
91-
REGDEF(71, 71, V3D_V7_CSD_CURRENT_CFG6),
92-
REGDEF(71, 71, V3D_V7_CSD_CURRENT_CFG7),
77+
REGDEF(V3D_GEN_41, V3D_GEN_71, V3D_CSD_STATUS),
78+
REGDEF(V3D_GEN_41, V3D_GEN_41, V3D_CSD_CURRENT_CFG0),
79+
REGDEF(V3D_GEN_41, V3D_GEN_41, V3D_CSD_CURRENT_CFG1),
80+
REGDEF(V3D_GEN_41, V3D_GEN_41, V3D_CSD_CURRENT_CFG2),
81+
REGDEF(V3D_GEN_41, V3D_GEN_41, V3D_CSD_CURRENT_CFG3),
82+
REGDEF(V3D_GEN_41, V3D_GEN_41, V3D_CSD_CURRENT_CFG4),
83+
REGDEF(V3D_GEN_41, V3D_GEN_41, V3D_CSD_CURRENT_CFG5),
84+
REGDEF(V3D_GEN_41, V3D_GEN_41, V3D_CSD_CURRENT_CFG6),
85+
REGDEF(V3D_GEN_71, V3D_GEN_71, V3D_V7_CSD_CURRENT_CFG0),
86+
REGDEF(V3D_GEN_71, V3D_GEN_71, V3D_V7_CSD_CURRENT_CFG1),
87+
REGDEF(V3D_GEN_71, V3D_GEN_71, V3D_V7_CSD_CURRENT_CFG2),
88+
REGDEF(V3D_GEN_71, V3D_GEN_71, V3D_V7_CSD_CURRENT_CFG3),
89+
REGDEF(V3D_GEN_71, V3D_GEN_71, V3D_V7_CSD_CURRENT_CFG4),
90+
REGDEF(V3D_GEN_71, V3D_GEN_71, V3D_V7_CSD_CURRENT_CFG5),
91+
REGDEF(V3D_GEN_71, V3D_GEN_71, V3D_V7_CSD_CURRENT_CFG6),
92+
REGDEF(V3D_GEN_71, V3D_GEN_71, V3D_V7_CSD_CURRENT_CFG7),
9393
};
9494

9595
static int v3d_v3d_debugfs_regs(struct seq_file *m, void *unused)
@@ -165,7 +165,7 @@ static int v3d_v3d_debugfs_ident(struct seq_file *m, void *unused)
165165
str_yes_no(ident2 & V3D_HUB_IDENT2_WITH_MMU));
166166
seq_printf(m, "TFU: %s\n",
167167
str_yes_no(ident1 & V3D_HUB_IDENT1_WITH_TFU));
168-
if (v3d->ver <= 42) {
168+
if (v3d->ver <= V3D_GEN_42) {
169169
seq_printf(m, "TSY: %s\n",
170170
str_yes_no(ident1 & V3D_HUB_IDENT1_WITH_TSY));
171171
}
@@ -197,11 +197,11 @@ static int v3d_v3d_debugfs_ident(struct seq_file *m, void *unused)
197197
seq_printf(m, " QPUs: %d\n", nslc * qups);
198198
seq_printf(m, " Semaphores: %d\n",
199199
V3D_GET_FIELD(ident1, V3D_IDENT1_NSEM));
200-
if (v3d->ver <= 42) {
200+
if (v3d->ver <= V3D_GEN_42) {
201201
seq_printf(m, " BCG int: %d\n",
202202
(ident2 & V3D_IDENT2_BCG_INT) != 0);
203203
}
204-
if (v3d->ver < 40) {
204+
if (v3d->ver < V3D_GEN_41) {
205205
seq_printf(m, " Override TMU: %d\n",
206206
(misccfg & V3D_MISCCFG_OVRTMUOUT) != 0);
207207
}
@@ -311,8 +311,8 @@ static int v3d_measure_clock(struct seq_file *m, void *unused)
311311
int core = 0;
312312
int measure_ms = 1000;
313313

314-
if (v3d->ver >= 40) {
315-
int cycle_count_reg = v3d->ver < 71 ?
314+
if (v3d->ver >= V3D_GEN_41) {
315+
int cycle_count_reg = v3d->ver < V3D_GEN_71 ?
316316
V3D_PCTR_CYCLE_COUNT : V3D_V7_PCTR_CYCLE_COUNT;
317317
V3D_CORE_WRITE(core, V3D_V4_PCTR_0_SRC_0_3,
318318
V3D_SET_FIELD(cycle_count_reg,

drivers/gpu/drm/v3d/v3d_drv.c

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include <linux/dma-mapping.h>
1818
#include <linux/io.h>
1919
#include <linux/module.h>
20+
#include <linux/of.h>
2021
#include <linux/of_platform.h>
2122
#include <linux/platform_device.h>
2223
#include <linux/reset.h>
@@ -88,7 +89,7 @@ static int v3d_get_param_ioctl(struct drm_device *dev, void *data,
8889
args->value = 1;
8990
return 0;
9091
case DRM_V3D_PARAM_SUPPORTS_PERFMON:
91-
args->value = (v3d->ver >= 40);
92+
args->value = (v3d->ver >= V3D_GEN_41);
9293
return 0;
9394
case DRM_V3D_PARAM_SUPPORTS_MULTISYNC_EXT:
9495
args->value = 1;
@@ -189,10 +190,10 @@ static const struct drm_driver v3d_drm_driver = {
189190
};
190191

191192
static const struct of_device_id v3d_of_match[] = {
192-
{ .compatible = "brcm,2712-v3d" },
193-
{ .compatible = "brcm,2711-v3d" },
194-
{ .compatible = "brcm,7268-v3d" },
195-
{ .compatible = "brcm,7278-v3d" },
193+
{ .compatible = "brcm,2711-v3d", .data = (void *)V3D_GEN_42 },
194+
{ .compatible = "brcm,2712-v3d", .data = (void *)V3D_GEN_71 },
195+
{ .compatible = "brcm,7268-v3d", .data = (void *)V3D_GEN_33 },
196+
{ .compatible = "brcm,7278-v3d", .data = (void *)V3D_GEN_41 },
196197
{},
197198
};
198199
MODULE_DEVICE_TABLE(of, v3d_of_match);
@@ -211,6 +212,7 @@ static int v3d_platform_drm_probe(struct platform_device *pdev)
211212
struct device_node *node;
212213
struct drm_device *drm;
213214
struct v3d_dev *v3d;
215+
enum v3d_gen gen;
214216
int ret;
215217
u32 mmu_debug;
216218
u32 ident1;
@@ -224,6 +226,9 @@ static int v3d_platform_drm_probe(struct platform_device *pdev)
224226

225227
platform_set_drvdata(pdev, drm);
226228

229+
gen = (enum v3d_gen)of_device_get_match_data(dev);
230+
v3d->ver = gen;
231+
227232
ret = map_regs(v3d, &v3d->hub_regs, "hub");
228233
if (ret)
229234
return ret;
@@ -253,6 +258,11 @@ static int v3d_platform_drm_probe(struct platform_device *pdev)
253258
ident1 = V3D_READ(V3D_HUB_IDENT1);
254259
v3d->ver = (V3D_GET_FIELD(ident1, V3D_HUB_IDENT1_TVER) * 10 +
255260
V3D_GET_FIELD(ident1, V3D_HUB_IDENT1_REV));
261+
/* Make sure that the V3D tech version retrieved from the HW is equal
262+
* to the one advertised by the device tree.
263+
*/
264+
WARN_ON(v3d->ver != gen);
265+
256266
v3d->cores = V3D_GET_FIELD(ident1, V3D_HUB_IDENT1_NCORES);
257267
WARN_ON(v3d->cores > 1); /* multicore not yet implemented */
258268

@@ -297,7 +307,7 @@ static int v3d_platform_drm_probe(struct platform_device *pdev)
297307
v3d->clk_down_rate =
298308
(clk_get_rate(clk_get_parent(v3d->clk)) / (1 << 4)) + 10000;
299309

300-
if (v3d->ver < 41) {
310+
if (v3d->ver < V3D_GEN_41) {
301311
ret = map_regs(v3d, &v3d->gca_regs, "gca");
302312
if (ret)
303313
goto clk_disable;

drivers/gpu/drm/v3d/v3d_drv.h

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,13 +115,20 @@ struct v3d_perfmon {
115115
u64 values[];
116116
};
117117

118+
enum v3d_gen {
119+
V3D_GEN_33 = 33,
120+
V3D_GEN_41 = 41,
121+
V3D_GEN_42 = 42,
122+
V3D_GEN_71 = 71,
123+
};
124+
118125
struct v3d_dev {
119126
struct drm_device drm;
120127

121128
/* Short representation (e.g. 33, 41) of the V3D tech version
122129
* and revision.
123130
*/
124-
int ver;
131+
enum v3d_gen ver;
125132
bool single_irq_line;
126133

127134
void __iomem *hub_regs;
@@ -213,7 +220,7 @@ to_v3d_dev(struct drm_device *dev)
213220
static inline bool
214221
v3d_has_csd(struct v3d_dev *v3d)
215222
{
216-
return v3d->ver >= 41;
223+
return v3d->ver >= V3D_GEN_41;
217224
}
218225

219226
#define v3d_to_pdev(v3d) to_platform_device((v3d)->drm.dev)

drivers/gpu/drm/v3d/v3d_gem.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ v3d_init_core(struct v3d_dev *v3d, int core)
6969
* type. If you want the default behavior, you can still put
7070
* "2" in the indirect texture state's output_type field.
7171
*/
72-
if (v3d->ver < 40)
72+
if (v3d->ver < V3D_GEN_41)
7373
V3D_CORE_WRITE(core, V3D_CTL_MISCCFG, V3D_MISCCFG_OVRTMUOUT);
7474

7575
/* Whenever we flush the L2T cache, we always want to flush
@@ -89,7 +89,7 @@ v3d_init_hw_state(struct v3d_dev *v3d)
8989
static void
9090
v3d_idle_axi(struct v3d_dev *v3d, int core)
9191
{
92-
if (v3d->ver >= 71)
92+
if (v3d->ver >= V3D_GEN_71)
9393
return;
9494

9595
V3D_CORE_WRITE(core, V3D_GMP_CFG, V3D_GMP_CFG_STOP_REQ);
@@ -105,7 +105,7 @@ v3d_idle_axi(struct v3d_dev *v3d, int core)
105105
static void
106106
v3d_idle_gca(struct v3d_dev *v3d)
107107
{
108-
if (v3d->ver >= 41)
108+
if (v3d->ver >= V3D_GEN_41)
109109
return;
110110

111111
V3D_GCA_WRITE(V3D_GCA_SAFE_SHUTDOWN, V3D_GCA_SAFE_SHUTDOWN_EN);
@@ -179,13 +179,13 @@ v3d_reset(struct v3d_dev *v3d)
179179
static void
180180
v3d_flush_l3(struct v3d_dev *v3d)
181181
{
182-
if (v3d->ver < 41) {
182+
if (v3d->ver < V3D_GEN_41) {
183183
u32 gca_ctrl = V3D_GCA_READ(V3D_GCA_CACHE_CTRL);
184184

185185
V3D_GCA_WRITE(V3D_GCA_CACHE_CTRL,
186186
gca_ctrl | V3D_GCA_CACHE_CTRL_FLUSH);
187187

188-
if (v3d->ver < 33) {
188+
if (v3d->ver < V3D_GEN_33) {
189189
V3D_GCA_WRITE(V3D_GCA_CACHE_CTRL,
190190
gca_ctrl & ~V3D_GCA_CACHE_CTRL_FLUSH);
191191
}
@@ -198,7 +198,7 @@ v3d_flush_l3(struct v3d_dev *v3d)
198198
static void
199199
v3d_invalidate_l2c(struct v3d_dev *v3d, int core)
200200
{
201-
if (v3d->ver > 32)
201+
if (v3d->ver >= V3D_GEN_33)
202202
return;
203203

204204
V3D_CORE_WRITE(core, V3D_CTL_L2CACTL,

drivers/gpu/drm/v3d/v3d_irq.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -125,8 +125,8 @@ v3d_irq(int irq, void *arg)
125125
status = IRQ_HANDLED;
126126
}
127127

128-
if ((v3d->ver < 71 && (intsts & V3D_INT_CSDDONE)) ||
129-
(v3d->ver >= 71 && (intsts & V3D_V7_INT_CSDDONE))) {
128+
if ((v3d->ver < V3D_GEN_71 && (intsts & V3D_INT_CSDDONE)) ||
129+
(v3d->ver >= V3D_GEN_71 && (intsts & V3D_V7_INT_CSDDONE))) {
130130
struct v3d_fence *fence =
131131
to_v3d_fence(v3d->csd_job->base.irq_fence);
132132
v3d->gpu_queue_stats[V3D_CSD].last_exec_end = local_clock();
@@ -142,7 +142,7 @@ v3d_irq(int irq, void *arg)
142142
/* We shouldn't be triggering these if we have GMP in
143143
* always-allowed mode.
144144
*/
145-
if (v3d->ver < 71 && (intsts & V3D_INT_GMPV))
145+
if (v3d->ver < V3D_GEN_71 && (intsts & V3D_INT_GMPV))
146146
dev_err(v3d->drm.dev, "GMP violation\n");
147147

148148
/* V3D 4.2 wires the hub and core IRQs together, so if we &
@@ -200,7 +200,7 @@ v3d_hub_irq(int irq, void *arg)
200200

201201
V3D_WRITE(V3D_MMU_CTL, V3D_READ(V3D_MMU_CTL));
202202

203-
if (v3d->ver >= 41) {
203+
if (v3d->ver >= V3D_GEN_41) {
204204
axi_id = axi_id >> 5;
205205
if (axi_id < ARRAY_SIZE(v3d41_axi_ids))
206206
client = v3d41_axi_ids[axi_id];
@@ -219,7 +219,7 @@ v3d_hub_irq(int irq, void *arg)
219219
status = IRQ_HANDLED;
220220
}
221221

222-
if (v3d->ver >= 71 && intsts & V3D_V7_HUB_INT_GMPV) {
222+
if (v3d->ver >= V3D_GEN_71 && intsts & V3D_V7_HUB_INT_GMPV) {
223223
dev_err(v3d->drm.dev, "GMP Violation\n");
224224
status = IRQ_HANDLED;
225225
}

0 commit comments

Comments
 (0)