[PATCH] drm/v3d: Fix performance counter source settings on V3D 7.x
Christian Gmeiner
cgmeiner at igalia.com
Thu Nov 7 08:29:47 UTC 2024
> 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: 0ad5bc1ce463 ("drm/v3d: fix up register addresses for V3D 7.x")
> Signed-off-by: Maíra Canal <mcanal at igalia.com>
Reviewed-by: Christian Gmeiner <cgmeiner at igalia.com>
> ---
> drivers/gpu/drm/v3d/v3d_debugfs.c | 4 ++--
> drivers/gpu/drm/v3d/v3d_perfmon.c | 15 ++++++++-------
> drivers/gpu/drm/v3d/v3d_regs.h | 29 +++++++++++++++++------------
> 3 files changed, 27 insertions(+), 21 deletions(-)
>
> diff --git a/drivers/gpu/drm/v3d/v3d_debugfs.c b/drivers/gpu/drm/v3d/v3d_debugfs.c
> index 19e3ee7ac897..76816f2551c1 100644
> --- a/drivers/gpu/drm/v3d/v3d_debugfs.c
> +++ b/drivers/gpu/drm/v3d/v3d_debugfs.c
> @@ -237,8 +237,8 @@ static int v3d_measure_clock(struct seq_file *m, void *unused)
> if (v3d->ver >= 40) {
> int cycle_count_reg = V3D_PCTR_CYCLE_COUNT(v3d->ver);
> V3D_CORE_WRITE(core, V3D_V4_PCTR_0_SRC_0_3,
> - V3D_SET_FIELD(cycle_count_reg,
> - V3D_PCTR_S0));
> + V3D_SET_FIELD_VER(cycle_count_reg,
> + V3D_PCTR_S0, v3d->ver));
> V3D_CORE_WRITE(core, V3D_V4_PCTR_0_CLR, 1);
> V3D_CORE_WRITE(core, V3D_V4_PCTR_0_EN, 1);
> } else {
> diff --git a/drivers/gpu/drm/v3d/v3d_perfmon.c b/drivers/gpu/drm/v3d/v3d_perfmon.c
> index 156be13ab2ef..7df6dd933c63 100644
> --- a/drivers/gpu/drm/v3d/v3d_perfmon.c
> +++ b/drivers/gpu/drm/v3d/v3d_perfmon.c
> @@ -240,17 +240,18 @@ void v3d_perfmon_start(struct v3d_dev *v3d, struct v3d_perfmon *perfmon)
>
> for (i = 0; i < ncounters; i++) {
> u32 source = i / 4;
> - u32 channel = V3D_SET_FIELD(perfmon->counters[i], V3D_PCTR_S0);
> + u32 channel = V3D_SET_FIELD_VER(perfmon->counters[i], V3D_PCTR_S0,
> + v3d->ver);
>
> i++;
> - channel |= V3D_SET_FIELD(i < ncounters ? perfmon->counters[i] : 0,
> - V3D_PCTR_S1);
> + channel |= V3D_SET_FIELD_VER(i < ncounters ? perfmon->counters[i] : 0,
> + V3D_PCTR_S1, v3d->ver);
> i++;
> - channel |= V3D_SET_FIELD(i < ncounters ? perfmon->counters[i] : 0,
> - V3D_PCTR_S2);
> + channel |= V3D_SET_FIELD_VER(i < ncounters ? perfmon->counters[i] : 0,
> + V3D_PCTR_S2, v3d->ver);
> i++;
> - channel |= V3D_SET_FIELD(i < ncounters ? perfmon->counters[i] : 0,
> - V3D_PCTR_S3);
> + channel |= V3D_SET_FIELD_VER(i < ncounters ? perfmon->counters[i] : 0,
> + V3D_PCTR_S3, v3d->ver);
> V3D_CORE_WRITE(0, V3D_V4_PCTR_0_SRC_X(source), channel);
> }
>
> diff --git a/drivers/gpu/drm/v3d/v3d_regs.h b/drivers/gpu/drm/v3d/v3d_regs.h
> index 1b1a62ad9585..6da3c69082bd 100644
> --- a/drivers/gpu/drm/v3d/v3d_regs.h
> +++ b/drivers/gpu/drm/v3d/v3d_regs.h
> @@ -15,6 +15,14 @@
> fieldval & field##_MASK; \
> })
>
> +#define V3D_SET_FIELD_VER(value, field, ver) \
> + ({ \
> + typeof(ver) _ver = (ver); \
> + u32 fieldval = (value) << field##_SHIFT(_ver); \
> + WARN_ON((fieldval & ~field##_MASK(_ver)) != 0); \
> + fieldval & field##_MASK(_ver); \
> + })
> +
> #define V3D_GET_FIELD(word, field) (((word) & field##_MASK) >> \
> field##_SHIFT)
>
> @@ -354,18 +362,15 @@
> #define V3D_V4_PCTR_0_SRC_28_31 0x0067c
> #define V3D_V4_PCTR_0_SRC_X(x) (V3D_V4_PCTR_0_SRC_0_3 + \
> 4 * (x))
> -# define V3D_PCTR_S0_MASK V3D_MASK(6, 0)
> -# define V3D_V7_PCTR_S0_MASK V3D_MASK(7, 0)
> -# define V3D_PCTR_S0_SHIFT 0
> -# define V3D_PCTR_S1_MASK V3D_MASK(14, 8)
> -# define V3D_V7_PCTR_S1_MASK V3D_MASK(15, 8)
> -# define V3D_PCTR_S1_SHIFT 8
> -# define V3D_PCTR_S2_MASK V3D_MASK(22, 16)
> -# define V3D_V7_PCTR_S2_MASK V3D_MASK(23, 16)
> -# define V3D_PCTR_S2_SHIFT 16
> -# define V3D_PCTR_S3_MASK V3D_MASK(30, 24)
> -# define V3D_V7_PCTR_S3_MASK V3D_MASK(31, 24)
> -# define V3D_PCTR_S3_SHIFT 24
> +# define V3D_PCTR_S0_MASK(ver) (((ver) >= 71) ? V3D_MASK(7, 0) : V3D_MASK(6, 0))
> +# define V3D_PCTR_S0_SHIFT(ver) 0
> +# define V3D_PCTR_S1_MASK(ver) (((ver) >= 71) ? V3D_MASK(15, 8) : V3D_MASK(14, 8))
> +# define V3D_PCTR_S1_SHIFT(ver) 8
> +# define V3D_PCTR_S2_MASK(ver) (((ver) >= 71) ? V3D_MASK(23, 16) : V3D_MASK(22, 16))
> +# define V3D_PCTR_S2_SHIFT(ver) 16
> +# define V3D_PCTR_S3_MASK(ver) (((ver) >= 71) ? V3D_MASK(31, 24) : V3D_MASK(30, 24))
> +# define V3D_PCTR_S3_SHIFT(ver) 24
> +
> #define V3D_PCTR_CYCLE_COUNT(ver) ((ver >= 71) ? 0 : 32)
>
> /* Output values of the counters. */
More information about the dri-devel
mailing list