Skip to content

Commit e75462f

Browse files
ZideChen0Peter Zijlstra
authored andcommitted
perf/x86/intel/uncore: Support per-platform discovery base devices
On DMR platforms, IMH discovery tables are enumerated via PCI, while CBB domains use MSRs, unlike earlier platforms which relied on either PCI or MSR exclusively. DMR also uses different MSRs and PCI devices, requiring support for multiple, platform-specific discovery bases. Introduce struct uncore_discovery_domain to hold the discovery base and other domain-specific configuration. Move uncore_units_ignore into uncore_discovery_domain so a single structure can be passed to uncore_discovery_[pci/msr]. No functional change intended. Co-developed-by: Dapeng Mi <dapeng1.mi@linux.intel.com> Signed-off-by: Dapeng Mi <dapeng1.mi@linux.intel.com> Signed-off-by: Zide Chen <zide.chen@intel.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Reviewed-by: Dapeng Mi <dapeng1.mi@linux.intel.com> Link: https://patch.msgid.link/20251231224233.113839-3-zide.chen@intel.com
1 parent 098fe55 commit e75462f

3 files changed

Lines changed: 68 additions & 35 deletions

File tree

arch/x86/events/intel/uncore.c

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1798,7 +1798,7 @@ static const struct uncore_plat_init lnl_uncore_init __initconst = {
17981798
static const struct uncore_plat_init ptl_uncore_init __initconst = {
17991799
.cpu_init = ptl_uncore_cpu_init,
18001800
.mmio_init = ptl_uncore_mmio_init,
1801-
.use_discovery = true,
1801+
.domain[0].discovery_base = UNCORE_DISCOVERY_MSR,
18021802
};
18031803

18041804
static const struct uncore_plat_init icx_uncore_init __initconst = {
@@ -1817,16 +1817,18 @@ static const struct uncore_plat_init spr_uncore_init __initconst = {
18171817
.cpu_init = spr_uncore_cpu_init,
18181818
.pci_init = spr_uncore_pci_init,
18191819
.mmio_init = spr_uncore_mmio_init,
1820-
.use_discovery = true,
1821-
.uncore_units_ignore = spr_uncore_units_ignore,
1820+
.domain[0].base_is_pci = true,
1821+
.domain[0].discovery_base = UNCORE_DISCOVERY_TABLE_DEVICE,
1822+
.domain[0].units_ignore = spr_uncore_units_ignore,
18221823
};
18231824

18241825
static const struct uncore_plat_init gnr_uncore_init __initconst = {
18251826
.cpu_init = gnr_uncore_cpu_init,
18261827
.pci_init = gnr_uncore_pci_init,
18271828
.mmio_init = gnr_uncore_mmio_init,
1828-
.use_discovery = true,
1829-
.uncore_units_ignore = gnr_uncore_units_ignore,
1829+
.domain[0].base_is_pci = true,
1830+
.domain[0].discovery_base = UNCORE_DISCOVERY_TABLE_DEVICE,
1831+
.domain[0].units_ignore = gnr_uncore_units_ignore,
18301832
};
18311833

18321834
static const struct uncore_plat_init generic_uncore_init __initconst = {
@@ -1897,6 +1899,16 @@ static const struct x86_cpu_id intel_uncore_match[] __initconst = {
18971899
};
18981900
MODULE_DEVICE_TABLE(x86cpu, intel_uncore_match);
18991901

1902+
static bool uncore_use_discovery(struct uncore_plat_init *config)
1903+
{
1904+
for (int i = 0; i < UNCORE_DISCOVERY_DOMAINS; i++) {
1905+
if (config->domain[i].discovery_base)
1906+
return true;
1907+
}
1908+
1909+
return false;
1910+
}
1911+
19001912
static int __init intel_uncore_init(void)
19011913
{
19021914
const struct x86_cpu_id *id;
@@ -1911,15 +1923,14 @@ static int __init intel_uncore_init(void)
19111923

19121924
id = x86_match_cpu(intel_uncore_match);
19131925
if (!id) {
1914-
if (!uncore_no_discover && uncore_discovery(NULL))
1915-
uncore_init = (struct uncore_plat_init *)&generic_uncore_init;
1916-
else
1926+
uncore_init = (struct uncore_plat_init *)&generic_uncore_init;
1927+
if (uncore_no_discover || !uncore_discovery(uncore_init))
19171928
return -ENODEV;
19181929
} else {
19191930
uncore_init = (struct uncore_plat_init *)id->driver_data;
1920-
if (uncore_no_discover && uncore_init->use_discovery)
1931+
if (uncore_no_discover && uncore_use_discovery(uncore_init))
19211932
return -ENODEV;
1922-
if (uncore_init->use_discovery &&
1933+
if (uncore_use_discovery(uncore_init) &&
19231934
!uncore_discovery(uncore_init))
19241935
return -ENODEV;
19251936
}

arch/x86/events/intel/uncore.h

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,14 +47,21 @@ struct uncore_event_desc;
4747
struct freerunning_counters;
4848
struct intel_uncore_topology;
4949

50+
struct uncore_discovery_domain {
51+
/* MSR address or PCI device used as the discovery base */
52+
u32 discovery_base;
53+
bool base_is_pci;
54+
/* The units in the discovery table should be ignored. */
55+
int *units_ignore;
56+
};
57+
58+
#define UNCORE_DISCOVERY_DOMAINS 2
5059
struct uncore_plat_init {
5160
void (*cpu_init)(void);
5261
int (*pci_init)(void);
5362
void (*mmio_init)(void);
54-
/* Discovery table is required */
55-
bool use_discovery;
56-
/* The units in the discovery table should be ignored. */
57-
int *uncore_units_ignore;
63+
64+
struct uncore_discovery_domain domain[UNCORE_DISCOVERY_DOMAINS];
5865
};
5966

6067
struct intel_uncore_type {

arch/x86/events/intel/uncore_discovery.c

Lines changed: 36 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -259,23 +259,24 @@ uncore_insert_box_info(struct uncore_unit_discovery *unit,
259259
}
260260

261261
static bool
262-
uncore_ignore_unit(struct uncore_unit_discovery *unit, int *ignore)
262+
uncore_ignore_unit(struct uncore_unit_discovery *unit,
263+
struct uncore_discovery_domain *domain)
263264
{
264265
int i;
265266

266-
if (!ignore)
267+
if (!domain || !domain->units_ignore)
267268
return false;
268269

269-
for (i = 0; ignore[i] != UNCORE_IGNORE_END ; i++) {
270-
if (unit->box_type == ignore[i])
270+
for (i = 0; domain->units_ignore[i] != UNCORE_IGNORE_END ; i++) {
271+
if (unit->box_type == domain->units_ignore[i])
271272
return true;
272273
}
273274

274275
return false;
275276
}
276277

277-
static int __parse_discovery_table(resource_size_t addr, int die,
278-
bool *parsed, int *ignore)
278+
static int __parse_discovery_table(struct uncore_discovery_domain *domain,
279+
resource_size_t addr, int die, bool *parsed)
279280
{
280281
struct uncore_global_discovery global;
281282
struct uncore_unit_discovery unit;
@@ -314,7 +315,7 @@ static int __parse_discovery_table(resource_size_t addr, int die,
314315
if (unit.access_type >= UNCORE_ACCESS_MAX)
315316
continue;
316317

317-
if (uncore_ignore_unit(&unit, ignore))
318+
if (uncore_ignore_unit(&unit, domain))
318319
continue;
319320

320321
uncore_insert_box_info(&unit, die);
@@ -325,9 +326,9 @@ static int __parse_discovery_table(resource_size_t addr, int die,
325326
return 0;
326327
}
327328

328-
static int parse_discovery_table(struct pci_dev *dev, int die,
329-
u32 bar_offset, bool *parsed,
330-
int *ignore)
329+
static int parse_discovery_table(struct uncore_discovery_domain *domain,
330+
struct pci_dev *dev, int die,
331+
u32 bar_offset, bool *parsed)
331332
{
332333
resource_size_t addr;
333334
u32 val;
@@ -347,17 +348,19 @@ static int parse_discovery_table(struct pci_dev *dev, int die,
347348
}
348349
#endif
349350

350-
return __parse_discovery_table(addr, die, parsed, ignore);
351+
return __parse_discovery_table(domain, addr, die, parsed);
351352
}
352353

353-
static bool uncore_discovery_pci(int *ignore)
354+
static bool uncore_discovery_pci(struct uncore_discovery_domain *domain)
354355
{
355356
u32 device, val, entry_id, bar_offset;
356357
int die, dvsec = 0, ret = true;
357358
struct pci_dev *dev = NULL;
358359
bool parsed = false;
359360

360-
if (has_generic_discovery_table())
361+
if (domain->discovery_base)
362+
device = domain->discovery_base;
363+
else if (has_generic_discovery_table())
361364
device = UNCORE_DISCOVERY_TABLE_DEVICE;
362365
else
363366
device = PCI_ANY_ID;
@@ -386,7 +389,7 @@ static bool uncore_discovery_pci(int *ignore)
386389
if (die < 0)
387390
continue;
388391

389-
parse_discovery_table(dev, die, bar_offset, &parsed, ignore);
392+
parse_discovery_table(domain, dev, die, bar_offset, &parsed);
390393
}
391394
}
392395

@@ -399,31 +402,34 @@ static bool uncore_discovery_pci(int *ignore)
399402
return ret;
400403
}
401404

402-
static bool uncore_discovery_msr(int *ignore)
405+
static bool uncore_discovery_msr(struct uncore_discovery_domain *domain)
403406
{
404407
unsigned long *die_mask;
405408
bool parsed = false;
406-
int cpu, die;
409+
int cpu, die, msr;
407410
u64 base;
408411

409412
die_mask = kcalloc(BITS_TO_LONGS(uncore_max_dies()),
410413
sizeof(unsigned long), GFP_KERNEL);
411414
if (!die_mask)
412415
return false;
413416

417+
msr = domain->discovery_base ?
418+
domain->discovery_base : UNCORE_DISCOVERY_MSR;
419+
414420
cpus_read_lock();
415421
for_each_online_cpu(cpu) {
416422
die = topology_logical_die_id(cpu);
417423
if (__test_and_set_bit(die, die_mask))
418424
continue;
419425

420-
if (rdmsrq_safe_on_cpu(cpu, UNCORE_DISCOVERY_MSR, &base))
426+
if (rdmsrq_safe_on_cpu(cpu, msr, &base))
421427
continue;
422428

423429
if (!base)
424430
continue;
425431

426-
__parse_discovery_table(base, die, &parsed, ignore);
432+
__parse_discovery_table(domain, base, die, &parsed);
427433
}
428434

429435
cpus_read_unlock();
@@ -434,10 +440,19 @@ static bool uncore_discovery_msr(int *ignore)
434440

435441
bool uncore_discovery(struct uncore_plat_init *init)
436442
{
437-
int *ignore = init ? init->uncore_units_ignore : NULL;
443+
struct uncore_discovery_domain *domain;
444+
bool ret = false;
445+
int i;
438446

439-
return uncore_discovery_msr(ignore) ||
440-
uncore_discovery_pci(ignore);
447+
for (i = 0; i < UNCORE_DISCOVERY_DOMAINS; i++) {
448+
domain = &init->domain[i];
449+
if (!domain->base_is_pci)
450+
ret |= uncore_discovery_msr(domain);
451+
else
452+
ret |= uncore_discovery_pci(domain);
453+
}
454+
455+
return ret;
441456
}
442457

443458
void intel_uncore_clear_discovery_tables(void)

0 commit comments

Comments
 (0)