|
@@ -348,6 +348,26 @@ found:
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
|
+static int __init
|
|
|
|
+dmar_parse_one_rhsa(struct acpi_dmar_header *header)
|
|
|
|
+{
|
|
|
|
+ struct acpi_dmar_rhsa *rhsa;
|
|
|
|
+ struct dmar_drhd_unit *drhd;
|
|
|
|
+
|
|
|
|
+ rhsa = (struct acpi_dmar_rhsa *)header;
|
|
|
|
+ for_each_drhd_unit(drhd)
|
|
|
|
+ if (drhd->reg_base_addr == rhsa->base_address) {
|
|
|
|
+ int node = acpi_map_pxm_to_node(rhsa->proximity_domain);
|
|
|
|
+
|
|
|
|
+ if (!node_online(node))
|
|
|
|
+ node = -1;
|
|
|
|
+ drhd->iommu->node = node;
|
|
|
|
+ return 0;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return -ENODEV;
|
|
|
|
+}
|
|
|
|
+
|
|
static void __init
|
|
static void __init
|
|
dmar_table_print_dmar_entry(struct acpi_dmar_header *header)
|
|
dmar_table_print_dmar_entry(struct acpi_dmar_header *header)
|
|
{
|
|
{
|
|
@@ -467,7 +487,7 @@ parse_dmar_table(void)
|
|
#endif
|
|
#endif
|
|
break;
|
|
break;
|
|
case ACPI_DMAR_HARDWARE_AFFINITY:
|
|
case ACPI_DMAR_HARDWARE_AFFINITY:
|
|
- /* We don't do anything with RHSA (yet?) */
|
|
|
|
|
|
+ ret = dmar_parse_one_rhsa(entry_header);
|
|
break;
|
|
break;
|
|
default:
|
|
default:
|
|
printk(KERN_WARNING PREFIX
|
|
printk(KERN_WARNING PREFIX
|
|
@@ -677,6 +697,8 @@ int alloc_iommu(struct dmar_drhd_unit *drhd)
|
|
iommu->agaw = agaw;
|
|
iommu->agaw = agaw;
|
|
iommu->msagaw = msagaw;
|
|
iommu->msagaw = msagaw;
|
|
|
|
|
|
|
|
+ iommu->node = -1;
|
|
|
|
+
|
|
/* the registers might be more than one page */
|
|
/* the registers might be more than one page */
|
|
map_size = max_t(int, ecap_max_iotlb_offset(iommu->ecap),
|
|
map_size = max_t(int, ecap_max_iotlb_offset(iommu->ecap),
|
|
cap_max_fault_reg_offset(iommu->cap));
|
|
cap_max_fault_reg_offset(iommu->cap));
|