mirror of
https://github.com/opnsense/src.git
synced 2026-06-09 00:32:25 -04:00
dmar: set acpi ivar domain on identify()
Reviewed by: jhb Sponsored by: Advanced Micro Devices (AMD) Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D47291
This commit is contained in:
parent
7dd1f0dcd1
commit
3f0289ea7f
1 changed files with 31 additions and 29 deletions
|
|
@ -160,6 +160,27 @@ dmar_count_iter(ACPI_DMAR_HEADER *dmarh, void *arg)
|
|||
return (1);
|
||||
}
|
||||
|
||||
/* Remapping Hardware Static Affinity Structure lookup */
|
||||
struct rhsa_iter_arg {
|
||||
uint64_t base;
|
||||
u_int proxim_dom;
|
||||
};
|
||||
|
||||
static int
|
||||
dmar_rhsa_iter(ACPI_DMAR_HEADER *dmarh, void *arg)
|
||||
{
|
||||
struct rhsa_iter_arg *ria;
|
||||
ACPI_DMAR_RHSA *adr;
|
||||
|
||||
if (dmarh->Type == ACPI_DMAR_TYPE_HARDWARE_AFFINITY) {
|
||||
ria = arg;
|
||||
adr = (ACPI_DMAR_RHSA *)dmarh;
|
||||
if (adr->BaseAddress == ria->base)
|
||||
ria->proxim_dom = adr->ProximityDomain;
|
||||
}
|
||||
return (1);
|
||||
}
|
||||
|
||||
int dmar_rmrr_enable = 1;
|
||||
|
||||
static int dmar_enable = 0;
|
||||
|
|
@ -168,6 +189,7 @@ dmar_identify(driver_t *driver, device_t parent)
|
|||
{
|
||||
ACPI_TABLE_DMAR *dmartbl;
|
||||
ACPI_DMAR_HARDWARE_UNIT *dmarh;
|
||||
struct rhsa_iter_arg ria;
|
||||
ACPI_STATUS status;
|
||||
int i, error;
|
||||
|
||||
|
|
@ -217,7 +239,15 @@ dmar_identify(driver_t *driver, device_t parent)
|
|||
i, (uintmax_t)dmarh->Address, error);
|
||||
device_delete_child(parent, dmar_devs[i]);
|
||||
dmar_devs[i] = NULL;
|
||||
continue;
|
||||
}
|
||||
|
||||
ria.base = dmarh->Address;
|
||||
ria.proxim_dom = -1;
|
||||
dmar_iterate_tbl(dmar_rhsa_iter, &ria);
|
||||
acpi_set_domain(dmar_devs[i], ria.proxim_dom == -1 ?
|
||||
ACPI_DEV_DOMAIN_UNKNOWN :
|
||||
acpi_map_pxm_to_vm_domainid(ria.proxim_dom));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -326,34 +356,12 @@ dmar_print_caps(device_t dev, struct dmar_unit *unit,
|
|||
DMAR_ECAP_IRO(unit->hw_ecap));
|
||||
}
|
||||
|
||||
/* Remapping Hardware Static Affinity Structure lookup */
|
||||
struct rhsa_iter_arg {
|
||||
uint64_t base;
|
||||
u_int proxim_dom;
|
||||
};
|
||||
|
||||
static int
|
||||
dmar_rhsa_iter(ACPI_DMAR_HEADER *dmarh, void *arg)
|
||||
{
|
||||
struct rhsa_iter_arg *ria;
|
||||
ACPI_DMAR_RHSA *adr;
|
||||
|
||||
if (dmarh->Type == ACPI_DMAR_TYPE_HARDWARE_AFFINITY) {
|
||||
ria = arg;
|
||||
adr = (ACPI_DMAR_RHSA *)dmarh;
|
||||
if (adr->BaseAddress == ria->base)
|
||||
ria->proxim_dom = adr->ProximityDomain;
|
||||
}
|
||||
return (1);
|
||||
}
|
||||
|
||||
static int
|
||||
dmar_attach(device_t dev)
|
||||
{
|
||||
struct dmar_unit *unit;
|
||||
ACPI_DMAR_HARDWARE_UNIT *dmaru;
|
||||
struct iommu_msi_data *dmd;
|
||||
struct rhsa_iter_arg ria;
|
||||
uint64_t timeout;
|
||||
int disable_pmr;
|
||||
int i, error;
|
||||
|
|
@ -381,13 +389,7 @@ dmar_attach(device_t dev)
|
|||
if (bootverbose)
|
||||
dmar_print_caps(dev, unit, dmaru);
|
||||
dmar_quirks_post_ident(unit);
|
||||
unit->memdomain = -1;
|
||||
ria.base = unit->base;
|
||||
ria.proxim_dom = -1;
|
||||
dmar_iterate_tbl(dmar_rhsa_iter, &ria);
|
||||
if (ria.proxim_dom != -1)
|
||||
unit->memdomain = acpi_map_pxm_to_vm_domainid(ria.proxim_dom);
|
||||
|
||||
unit->memdomain = acpi_get_domain(dev);
|
||||
timeout = dmar_get_timeout();
|
||||
TUNABLE_UINT64_FETCH("hw.iommu.dmar.timeout", &timeout);
|
||||
dmar_update_timeout(timeout);
|
||||
|
|
|
|||
Loading…
Reference in a new issue