diff options
| -rw-r--r-- | drivers/pci/dmar.c | 24 | ||||
| -rw-r--r-- | include/linux/intel-iommu.h | 1 | 
2 files changed, 24 insertions, 1 deletions
diff --git a/drivers/pci/dmar.c b/drivers/pci/dmar.c index 22b02c6df85..577956566a0 100644 --- a/drivers/pci/dmar.c +++ b/drivers/pci/dmar.c @@ -348,6 +348,26 @@ found:  }  #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  dmar_table_print_dmar_entry(struct acpi_dmar_header *header)  { @@ -467,7 +487,7 @@ parse_dmar_table(void)  #endif  			break;  		case ACPI_DMAR_HARDWARE_AFFINITY: -			/* We don't do anything with RHSA (yet?) */ +			ret = dmar_parse_one_rhsa(entry_header);  			break;  		default:  			printk(KERN_WARNING PREFIX @@ -677,6 +697,8 @@ int alloc_iommu(struct dmar_drhd_unit *drhd)  	iommu->agaw = agaw;  	iommu->msagaw = msagaw; +	iommu->node = -1; +  	/* the registers might be more than one page */  	map_size = max_t(int, ecap_max_iotlb_offset(iommu->ecap),  		cap_max_fault_reg_offset(iommu->cap)); diff --git a/include/linux/intel-iommu.h b/include/linux/intel-iommu.h index 4f0a72a9740..9310c699a37 100644 --- a/include/linux/intel-iommu.h +++ b/include/linux/intel-iommu.h @@ -332,6 +332,7 @@ struct intel_iommu {  #ifdef CONFIG_INTR_REMAP  	struct ir_table *ir_table;	/* Interrupt remapping info */  #endif +	int		node;  };  static inline void __iommu_flush_cache(  |