Skip to content

Commit 63e66eb

Browse files
mairacanalpopcornmix
authored andcommitted
drm/v3d: Fix performance counter source settings on V3D 7.x
Commit e987e22 upstream When the new register addresses were introduced for V3D 7.x, we added new masks for performance counter sources on V3D 7.x. Nevertheless, we never apply these new masks when setting the sources. Fix the performance counter source settings on V3D 7.x by introducing a new macro, `V3D_SET_FIELD_VER`, which allows fields setting to vary by version. Using this macro, we can provide different values for source mask based on the V3D version, ensuring that sources are correctly configure on V3D 7.x. Fixes: 0ad5bc1 ("drm/v3d: fix up register addresses for V3D 7.x") Signed-off-by: Maíra Canal <mcanal@igalia.com> Reviewed-by: Iago Toral Quiroga <itoral@igalia.com> Reviewed-by: Christian Gmeiner <cgmeiner@igalia.com> Link: https://patchwork.freedesktop.org/patch/msgid/20241106121736.5707-1-mcanal@igalia.com
1 parent e9d9eb7 commit 63e66eb

File tree

3 files changed

+27
-21
lines changed

3 files changed

+27
-21
lines changed

drivers/gpu/drm/v3d/v3d_debugfs.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -237,8 +237,8 @@ static int v3d_measure_clock(struct seq_file *m, void *unused)
237237
if (v3d->ver >= 40) {
238238
int cycle_count_reg = V3D_PCTR_CYCLE_COUNT(v3d->ver);
239239
V3D_CORE_WRITE(core, V3D_V4_PCTR_0_SRC_0_3,
240-
V3D_SET_FIELD(cycle_count_reg,
241-
V3D_PCTR_S0));
240+
V3D_SET_FIELD_VER(cycle_count_reg,
241+
V3D_PCTR_S0, v3d->ver));
242242
V3D_CORE_WRITE(core, V3D_V4_PCTR_0_CLR, 1);
243243
V3D_CORE_WRITE(core, V3D_V4_PCTR_0_EN, 1);
244244
} else {

drivers/gpu/drm/v3d/v3d_perfmon.c

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -240,17 +240,18 @@ void v3d_perfmon_start(struct v3d_dev *v3d, struct v3d_perfmon *perfmon)
240240

241241
for (i = 0; i < ncounters; i++) {
242242
u32 source = i / 4;
243-
u32 channel = V3D_SET_FIELD(perfmon->counters[i], V3D_PCTR_S0);
243+
u32 channel = V3D_SET_FIELD_VER(perfmon->counters[i], V3D_PCTR_S0,
244+
v3d->ver);
244245

245246
i++;
246-
channel |= V3D_SET_FIELD(i < ncounters ? perfmon->counters[i] : 0,
247-
V3D_PCTR_S1);
247+
channel |= V3D_SET_FIELD_VER(i < ncounters ? perfmon->counters[i] : 0,
248+
V3D_PCTR_S1, v3d->ver);
248249
i++;
249-
channel |= V3D_SET_FIELD(i < ncounters ? perfmon->counters[i] : 0,
250-
V3D_PCTR_S2);
250+
channel |= V3D_SET_FIELD_VER(i < ncounters ? perfmon->counters[i] : 0,
251+
V3D_PCTR_S2, v3d->ver);
251252
i++;
252-
channel |= V3D_SET_FIELD(i < ncounters ? perfmon->counters[i] : 0,
253-
V3D_PCTR_S3);
253+
channel |= V3D_SET_FIELD_VER(i < ncounters ? perfmon->counters[i] : 0,
254+
V3D_PCTR_S3, v3d->ver);
254255
V3D_CORE_WRITE(0, V3D_V4_PCTR_0_SRC_X(source), channel);
255256
}
256257

drivers/gpu/drm/v3d/v3d_regs.h

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,14 @@
1515
fieldval & field##_MASK; \
1616
})
1717

18+
#define V3D_SET_FIELD_VER(value, field, ver) \
19+
({ \
20+
typeof(ver) _ver = (ver); \
21+
u32 fieldval = (value) << field##_SHIFT(_ver); \
22+
WARN_ON((fieldval & ~field##_MASK(_ver)) != 0); \
23+
fieldval & field##_MASK(_ver); \
24+
})
25+
1826
#define V3D_GET_FIELD(word, field) (((word) & field##_MASK) >> \
1927
field##_SHIFT)
2028

@@ -354,18 +362,15 @@
354362
#define V3D_V4_PCTR_0_SRC_28_31 0x0067c
355363
#define V3D_V4_PCTR_0_SRC_X(x) (V3D_V4_PCTR_0_SRC_0_3 + \
356364
4 * (x))
357-
# define V3D_PCTR_S0_MASK V3D_MASK(6, 0)
358-
# define V3D_V7_PCTR_S0_MASK V3D_MASK(7, 0)
359-
# define V3D_PCTR_S0_SHIFT 0
360-
# define V3D_PCTR_S1_MASK V3D_MASK(14, 8)
361-
# define V3D_V7_PCTR_S1_MASK V3D_MASK(15, 8)
362-
# define V3D_PCTR_S1_SHIFT 8
363-
# define V3D_PCTR_S2_MASK V3D_MASK(22, 16)
364-
# define V3D_V7_PCTR_S2_MASK V3D_MASK(23, 16)
365-
# define V3D_PCTR_S2_SHIFT 16
366-
# define V3D_PCTR_S3_MASK V3D_MASK(30, 24)
367-
# define V3D_V7_PCTR_S3_MASK V3D_MASK(31, 24)
368-
# define V3D_PCTR_S3_SHIFT 24
365+
# define V3D_PCTR_S0_MASK(ver) (((ver) >= 71) ? V3D_MASK(7, 0) : V3D_MASK(6, 0))
366+
# define V3D_PCTR_S0_SHIFT(ver) 0
367+
# define V3D_PCTR_S1_MASK(ver) (((ver) >= 71) ? V3D_MASK(15, 8) : V3D_MASK(14, 8))
368+
# define V3D_PCTR_S1_SHIFT(ver) 8
369+
# define V3D_PCTR_S2_MASK(ver) (((ver) >= 71) ? V3D_MASK(23, 16) : V3D_MASK(22, 16))
370+
# define V3D_PCTR_S2_SHIFT(ver) 16
371+
# define V3D_PCTR_S3_MASK(ver) (((ver) >= 71) ? V3D_MASK(31, 24) : V3D_MASK(30, 24))
372+
# define V3D_PCTR_S3_SHIFT(ver) 24
373+
369374
#define V3D_PCTR_CYCLE_COUNT(ver) ((ver >= 71) ? 0 : 32)
370375

371376
/* Output values of the counters. */

0 commit comments

Comments
 (0)