Skip to content

Commit 5f36d1c

Browse files
ifdumattrope
authored andcommitted
drm/xe/gt: Add L3 bank mask to GT topology
Generate the mask of enabled L3 banks for the GT. It is stored with the rest of the GT topology in a consistent representation across platforms. For now the L3 bank mask is just printed in the log for developers to easily figure out the fusing characteristics of machines that they are trying to debug issues on. Later it can be used to replace existing code in the driver that requires the L3 bank count (not mask). Also the mask can easily be exposed to user space in a new query if needed. v2: Better naming of variable and function (Matt Roper) Bspec: 52545, 52546, 62482 Cc: Matt Roper <matthew.d.roper@intel.com> Signed-off-by: Francois Dugast <francois.dugast@intel.com> Reviewed-by: Matt Roper <matthew.d.roper@intel.com> Signed-off-by: Matt Roper <matthew.d.roper@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20240410123723.7-2-francois.dugast@intel.com
1 parent 48b05e3 commit 5f36d1c

File tree

3 files changed

+124
-4
lines changed

3 files changed

+124
-4
lines changed

drivers/gpu/drm/xe/regs/xe_gt_regs.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,10 @@
165165
#define MIRROR_FUSE3 XE_REG(0x9118)
166166
#define XE2_NODE_ENABLE_MASK REG_GENMASK(31, 16)
167167
#define L3BANK_PAIR_COUNT 4
168+
#define XEHPC_GT_L3_MODE_MASK REG_GENMASK(7, 4)
169+
#define XE2_GT_L3_MODE_MASK REG_GENMASK(7, 4)
168170
#define L3BANK_MASK REG_GENMASK(3, 0)
171+
#define XELP_GT_L3_MODE_MASK REG_GENMASK(7, 0)
169172
/* on Xe_HP the same fuses indicates mslices instead of L3 banks */
170173
#define MAX_MSLICES 4
171174
#define MEML3_EN_MASK REG_GENMASK(3, 0)

drivers/gpu/drm/xe/xe_gt_topology.c

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include <linux/bitmap.h>
99

1010
#include "regs/xe_gt_regs.h"
11+
#include "xe_assert.h"
1112
#include "xe_gt.h"
1213
#include "xe_mmio.h"
1314

@@ -59,6 +60,114 @@ load_eu_mask(struct xe_gt *gt, xe_eu_mask_t mask)
5960
bitmap_from_arr32(mask, &val, XE_MAX_EU_FUSE_BITS);
6061
}
6162

63+
/**
64+
* gen_l3_mask_from_pattern - Replicate a bit pattern according to a mask
65+
*
66+
* It is used to compute the L3 bank masks in a generic format on
67+
* various platforms where the internal representation of L3 node
68+
* and masks from registers are different.
69+
*
70+
* @xe: device
71+
* @dst: destination
72+
* @pattern: pattern to replicate
73+
* @patternbits: size of the pattern, in bits
74+
* @mask: mask describing where to replicate the pattern
75+
*
76+
* Example 1:
77+
* ----------
78+
* @pattern = 0b1111
79+
* └┬─┘
80+
* @patternbits = 4 (bits)
81+
* @mask = 0b0101
82+
* ││││
83+
* │││└────────────────── 0b1111 (=1×0b1111)
84+
* ││└──────────── 0b0000 │ (=0×0b1111)
85+
* │└────── 0b1111 │ │ (=1×0b1111)
86+
* └ 0b0000 │ │ │ (=0×0b1111)
87+
* │ │ │ │
88+
* @dst = 0b0000 0b1111 0b0000 0b1111
89+
*
90+
* Example 2:
91+
* ----------
92+
* @pattern = 0b11111111
93+
* └┬─────┘
94+
* @patternbits = 8 (bits)
95+
* @mask = 0b10
96+
* ││
97+
* ││
98+
* ││
99+
* │└────────── 0b00000000 (=0×0b11111111)
100+
* └ 0b11111111 │ (=1×0b11111111)
101+
* │ │
102+
* @dst = 0b11111111 0b00000000
103+
*/
104+
static void
105+
gen_l3_mask_from_pattern(struct xe_device *xe, xe_l3_bank_mask_t dst,
106+
xe_l3_bank_mask_t pattern, int patternbits,
107+
unsigned long mask)
108+
{
109+
unsigned long bit;
110+
111+
xe_assert(xe, fls(mask) <= patternbits);
112+
for_each_set_bit(bit, &mask, 32) {
113+
xe_l3_bank_mask_t shifted_pattern = {};
114+
115+
bitmap_shift_left(shifted_pattern, pattern, bit * patternbits,
116+
XE_MAX_L3_BANK_MASK_BITS);
117+
bitmap_or(dst, dst, shifted_pattern, XE_MAX_L3_BANK_MASK_BITS);
118+
}
119+
}
120+
121+
static void
122+
load_l3_bank_mask(struct xe_gt *gt, xe_l3_bank_mask_t l3_bank_mask)
123+
{
124+
struct xe_device *xe = gt_to_xe(gt);
125+
u32 fuse3 = xe_mmio_read32(gt, MIRROR_FUSE3);
126+
127+
if (GRAPHICS_VER(xe) >= 20) {
128+
xe_l3_bank_mask_t per_node = {};
129+
u32 meml3_en = REG_FIELD_GET(XE2_NODE_ENABLE_MASK, fuse3);
130+
u32 bank_val = REG_FIELD_GET(XE2_GT_L3_MODE_MASK, fuse3);
131+
132+
bitmap_from_arr32(per_node, &bank_val, 32);
133+
gen_l3_mask_from_pattern(xe, l3_bank_mask, per_node, 4,
134+
meml3_en);
135+
} else if (GRAPHICS_VERx100(xe) >= 1270) {
136+
xe_l3_bank_mask_t per_node = {};
137+
xe_l3_bank_mask_t per_mask_bit = {};
138+
u32 meml3_en = REG_FIELD_GET(MEML3_EN_MASK, fuse3);
139+
u32 fuse4 = xe_mmio_read32(gt, XEHP_FUSE4);
140+
u32 bank_val = REG_FIELD_GET(GT_L3_EXC_MASK, fuse4);
141+
142+
bitmap_set_value8(per_mask_bit, 0x3, 0);
143+
gen_l3_mask_from_pattern(xe, per_node, per_mask_bit, 2, bank_val);
144+
gen_l3_mask_from_pattern(xe, l3_bank_mask, per_node, 4,
145+
meml3_en);
146+
} else if (xe->info.platform == XE_PVC) {
147+
xe_l3_bank_mask_t per_node = {};
148+
xe_l3_bank_mask_t per_mask_bit = {};
149+
u32 meml3_en = REG_FIELD_GET(MEML3_EN_MASK, fuse3);
150+
u32 bank_val = REG_FIELD_GET(XEHPC_GT_L3_MODE_MASK, fuse3);
151+
152+
bitmap_set_value8(per_mask_bit, 0xf, 0);
153+
gen_l3_mask_from_pattern(xe, per_node, per_mask_bit, 4,
154+
bank_val);
155+
gen_l3_mask_from_pattern(xe, l3_bank_mask, per_node, 16,
156+
meml3_en);
157+
} else if (xe->info.platform == XE_DG2) {
158+
xe_l3_bank_mask_t per_node = {};
159+
u32 mask = REG_FIELD_GET(MEML3_EN_MASK, fuse3);
160+
161+
bitmap_set_value8(per_node, 0xff, 0);
162+
gen_l3_mask_from_pattern(xe, l3_bank_mask, per_node, 8, mask);
163+
} else {
164+
/* 1:1 register bit to mask bit (inverted register bits) */
165+
u32 mask = REG_FIELD_GET(XELP_GT_L3_MODE_MASK, ~fuse3);
166+
167+
bitmap_from_arr32(l3_bank_mask, &mask, 32);
168+
}
169+
}
170+
62171
static void
63172
get_num_dss_regs(struct xe_device *xe, int *geometry_regs, int *compute_regs)
64173
{
@@ -103,6 +212,7 @@ xe_gt_topology_init(struct xe_gt *gt)
103212
XEHPC_GT_COMPUTE_DSS_ENABLE_EXT,
104213
XE2_GT_COMPUTE_DSS_2);
105214
load_eu_mask(gt, gt->fuse_topo.eu_mask_per_dss);
215+
load_l3_bank_mask(gt, gt->fuse_topo.l3_bank_mask);
106216

107217
p = drm_dbg_printer(&gt_to_xe(gt)->drm, DRM_UT_DRIVER, "GT topology");
108218

@@ -120,6 +230,8 @@ xe_gt_topology_dump(struct xe_gt *gt, struct drm_printer *p)
120230
drm_printf(p, "EU mask per DSS: %*pb\n", XE_MAX_EU_FUSE_BITS,
121231
gt->fuse_topo.eu_mask_per_dss);
122232

233+
drm_printf(p, "L3 bank mask: %*pb\n", XE_MAX_L3_BANK_MASK_BITS,
234+
gt->fuse_topo.l3_bank_mask);
123235
}
124236

125237
/*

drivers/gpu/drm/xe/xe_gt_types.h

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,15 @@ enum xe_gt_type {
2525
XE_GT_TYPE_MEDIA,
2626
};
2727

28-
#define XE_MAX_DSS_FUSE_REGS 3
29-
#define XE_MAX_DSS_FUSE_BITS (32 * XE_MAX_DSS_FUSE_REGS)
30-
#define XE_MAX_EU_FUSE_REGS 1
31-
#define XE_MAX_EU_FUSE_BITS (32 * XE_MAX_EU_FUSE_REGS)
28+
#define XE_MAX_DSS_FUSE_REGS 3
29+
#define XE_MAX_DSS_FUSE_BITS (32 * XE_MAX_DSS_FUSE_REGS)
30+
#define XE_MAX_EU_FUSE_REGS 1
31+
#define XE_MAX_EU_FUSE_BITS (32 * XE_MAX_EU_FUSE_REGS)
32+
#define XE_MAX_L3_BANK_MASK_BITS 64
3233

3334
typedef unsigned long xe_dss_mask_t[BITS_TO_LONGS(XE_MAX_DSS_FUSE_BITS)];
3435
typedef unsigned long xe_eu_mask_t[BITS_TO_LONGS(XE_MAX_EU_FUSE_BITS)];
36+
typedef unsigned long xe_l3_bank_mask_t[BITS_TO_LONGS(XE_MAX_L3_BANK_MASK_BITS)];
3537

3638
struct xe_mmio_range {
3739
u32 start;
@@ -334,6 +336,9 @@ struct xe_gt {
334336

335337
/** @fuse_topo.eu_mask_per_dss: EU mask per DSS*/
336338
xe_eu_mask_t eu_mask_per_dss;
339+
340+
/** @fuse_topo.l3_bank_mask: L3 bank mask */
341+
xe_l3_bank_mask_t l3_bank_mask;
337342
} fuse_topo;
338343

339344
/** @steering: register steering for individual HW units */

0 commit comments

Comments
 (0)