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 {
 
 
        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);
        }
 
 
                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)
 
 #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. */