static const struct uncore_plat_init ptl_uncore_init __initconst = {
.cpu_init = ptl_uncore_cpu_init,
.mmio_init = ptl_uncore_mmio_init,
- .use_discovery = true,
+ .domain[0].discovery_base = UNCORE_DISCOVERY_MSR,
};
static const struct uncore_plat_init icx_uncore_init __initconst = {
.cpu_init = spr_uncore_cpu_init,
.pci_init = spr_uncore_pci_init,
.mmio_init = spr_uncore_mmio_init,
- .use_discovery = true,
- .uncore_units_ignore = spr_uncore_units_ignore,
+ .domain[0].base_is_pci = true,
+ .domain[0].discovery_base = UNCORE_DISCOVERY_TABLE_DEVICE,
+ .domain[0].units_ignore = spr_uncore_units_ignore,
};
static const struct uncore_plat_init gnr_uncore_init __initconst = {
.cpu_init = gnr_uncore_cpu_init,
.pci_init = gnr_uncore_pci_init,
.mmio_init = gnr_uncore_mmio_init,
- .use_discovery = true,
- .uncore_units_ignore = gnr_uncore_units_ignore,
+ .domain[0].base_is_pci = true,
+ .domain[0].discovery_base = UNCORE_DISCOVERY_TABLE_DEVICE,
+ .domain[0].units_ignore = gnr_uncore_units_ignore,
};
static const struct uncore_plat_init generic_uncore_init __initconst = {
};
MODULE_DEVICE_TABLE(x86cpu, intel_uncore_match);
+static bool uncore_use_discovery(struct uncore_plat_init *config)
+{
+ for (int i = 0; i < UNCORE_DISCOVERY_DOMAINS; i++) {
+ if (config->domain[i].discovery_base)
+ return true;
+ }
+
+ return false;
+}
+
static int __init intel_uncore_init(void)
{
const struct x86_cpu_id *id;
id = x86_match_cpu(intel_uncore_match);
if (!id) {
- if (!uncore_no_discover && uncore_discovery(NULL))
- uncore_init = (struct uncore_plat_init *)&generic_uncore_init;
- else
+ uncore_init = (struct uncore_plat_init *)&generic_uncore_init;
+ if (uncore_no_discover || !uncore_discovery(uncore_init))
return -ENODEV;
} else {
uncore_init = (struct uncore_plat_init *)id->driver_data;
- if (uncore_no_discover && uncore_init->use_discovery)
+ if (uncore_no_discover && uncore_use_discovery(uncore_init))
return -ENODEV;
- if (uncore_init->use_discovery &&
+ if (uncore_use_discovery(uncore_init) &&
!uncore_discovery(uncore_init))
return -ENODEV;
}
}
static bool
-uncore_ignore_unit(struct uncore_unit_discovery *unit, int *ignore)
+uncore_ignore_unit(struct uncore_unit_discovery *unit,
+ struct uncore_discovery_domain *domain)
{
int i;
- if (!ignore)
+ if (!domain || !domain->units_ignore)
return false;
- for (i = 0; ignore[i] != UNCORE_IGNORE_END ; i++) {
- if (unit->box_type == ignore[i])
+ for (i = 0; domain->units_ignore[i] != UNCORE_IGNORE_END ; i++) {
+ if (unit->box_type == domain->units_ignore[i])
return true;
}
return false;
}
-static int __parse_discovery_table(resource_size_t addr, int die,
- bool *parsed, int *ignore)
+static int __parse_discovery_table(struct uncore_discovery_domain *domain,
+ resource_size_t addr, int die, bool *parsed)
{
struct uncore_global_discovery global;
struct uncore_unit_discovery unit;
if (unit.access_type >= UNCORE_ACCESS_MAX)
continue;
- if (uncore_ignore_unit(&unit, ignore))
+ if (uncore_ignore_unit(&unit, domain))
continue;
uncore_insert_box_info(&unit, die);
return 0;
}
-static int parse_discovery_table(struct pci_dev *dev, int die,
- u32 bar_offset, bool *parsed,
- int *ignore)
+static int parse_discovery_table(struct uncore_discovery_domain *domain,
+ struct pci_dev *dev, int die,
+ u32 bar_offset, bool *parsed)
{
resource_size_t addr;
u32 val;
}
#endif
- return __parse_discovery_table(addr, die, parsed, ignore);
+ return __parse_discovery_table(domain, addr, die, parsed);
}
-static bool uncore_discovery_pci(int *ignore)
+static bool uncore_discovery_pci(struct uncore_discovery_domain *domain)
{
u32 device, val, entry_id, bar_offset;
int die, dvsec = 0, ret = true;
struct pci_dev *dev = NULL;
bool parsed = false;
- if (has_generic_discovery_table())
+ if (domain->discovery_base)
+ device = domain->discovery_base;
+ else if (has_generic_discovery_table())
device = UNCORE_DISCOVERY_TABLE_DEVICE;
else
device = PCI_ANY_ID;
if (die < 0)
continue;
- parse_discovery_table(dev, die, bar_offset, &parsed, ignore);
+ parse_discovery_table(domain, dev, die, bar_offset, &parsed);
}
}
return ret;
}
-static bool uncore_discovery_msr(int *ignore)
+static bool uncore_discovery_msr(struct uncore_discovery_domain *domain)
{
unsigned long *die_mask;
bool parsed = false;
- int cpu, die;
+ int cpu, die, msr;
u64 base;
die_mask = kcalloc(BITS_TO_LONGS(uncore_max_dies()),
if (!die_mask)
return false;
+ msr = domain->discovery_base ?
+ domain->discovery_base : UNCORE_DISCOVERY_MSR;
+
cpus_read_lock();
for_each_online_cpu(cpu) {
die = topology_logical_die_id(cpu);
if (__test_and_set_bit(die, die_mask))
continue;
- if (rdmsrq_safe_on_cpu(cpu, UNCORE_DISCOVERY_MSR, &base))
+ if (rdmsrq_safe_on_cpu(cpu, msr, &base))
continue;
if (!base)
continue;
- __parse_discovery_table(base, die, &parsed, ignore);
+ __parse_discovery_table(domain, base, die, &parsed);
}
cpus_read_unlock();
bool uncore_discovery(struct uncore_plat_init *init)
{
- int *ignore = init ? init->uncore_units_ignore : NULL;
+ struct uncore_discovery_domain *domain;
+ bool ret = false;
+ int i;
- return uncore_discovery_msr(ignore) ||
- uncore_discovery_pci(ignore);
+ for (i = 0; i < UNCORE_DISCOVERY_DOMAINS; i++) {
+ domain = &init->domain[i];
+ if (!domain->base_is_pci)
+ ret |= uncore_discovery_msr(domain);
+ else
+ ret |= uncore_discovery_pci(domain);
+ }
+
+ return ret;
}
void intel_uncore_clear_discovery_tables(void)