|
@@ -426,11 +426,18 @@ static void set_dev_entry_bit(u16 devid, u8 bit)
|
|
|
amd_iommu_dev_table[devid].data[i] |= (1 << _bit);
|
|
|
}
|
|
|
|
|
|
+/* Writes the specific IOMMU for a device into the rlookup table */
|
|
|
+static void __init set_iommu_for_device(struct amd_iommu *iommu, u16 devid)
|
|
|
+{
|
|
|
+ amd_iommu_rlookup_table[devid] = iommu;
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* This function takes the device specific flags read from the ACPI
|
|
|
* table and sets up the device table entry with that information
|
|
|
*/
|
|
|
-static void __init set_dev_entry_from_acpi(u16 devid, u32 flags, u32 ext_flags)
|
|
|
+static void __init set_dev_entry_from_acpi(struct amd_iommu *iommu,
|
|
|
+ u16 devid, u32 flags, u32 ext_flags)
|
|
|
{
|
|
|
if (flags & ACPI_DEVFLAG_INITPASS)
|
|
|
set_dev_entry_bit(devid, DEV_ENTRY_INIT_PASS);
|
|
@@ -446,12 +453,8 @@ static void __init set_dev_entry_from_acpi(u16 devid, u32 flags, u32 ext_flags)
|
|
|
set_dev_entry_bit(devid, DEV_ENTRY_LINT0_PASS);
|
|
|
if (flags & ACPI_DEVFLAG_LINT1)
|
|
|
set_dev_entry_bit(devid, DEV_ENTRY_LINT1_PASS);
|
|
|
-}
|
|
|
|
|
|
-/* Writes the specific IOMMU for a device into the rlookup table */
|
|
|
-static void __init set_iommu_for_device(struct amd_iommu *iommu, u16 devid)
|
|
|
-{
|
|
|
- amd_iommu_rlookup_table[devid] = iommu;
|
|
|
+ set_iommu_for_device(iommu, devid);
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -550,11 +553,12 @@ static void __init init_iommu_from_acpi(struct amd_iommu *iommu,
|
|
|
case IVHD_DEV_ALL:
|
|
|
for (dev_i = iommu->first_device;
|
|
|
dev_i <= iommu->last_device; ++dev_i)
|
|
|
- set_dev_entry_from_acpi(dev_i, e->flags, 0);
|
|
|
+ set_dev_entry_from_acpi(iommu, dev_i,
|
|
|
+ e->flags, 0);
|
|
|
break;
|
|
|
case IVHD_DEV_SELECT:
|
|
|
devid = e->devid;
|
|
|
- set_dev_entry_from_acpi(devid, e->flags, 0);
|
|
|
+ set_dev_entry_from_acpi(iommu, devid, e->flags, 0);
|
|
|
break;
|
|
|
case IVHD_DEV_SELECT_RANGE_START:
|
|
|
devid_start = e->devid;
|
|
@@ -565,7 +569,7 @@ static void __init init_iommu_from_acpi(struct amd_iommu *iommu,
|
|
|
case IVHD_DEV_ALIAS:
|
|
|
devid = e->devid;
|
|
|
devid_to = e->ext >> 8;
|
|
|
- set_dev_entry_from_acpi(devid, e->flags, 0);
|
|
|
+ set_dev_entry_from_acpi(iommu, devid, e->flags, 0);
|
|
|
amd_iommu_alias_table[devid] = devid_to;
|
|
|
break;
|
|
|
case IVHD_DEV_ALIAS_RANGE:
|
|
@@ -577,7 +581,8 @@ static void __init init_iommu_from_acpi(struct amd_iommu *iommu,
|
|
|
break;
|
|
|
case IVHD_DEV_EXT_SELECT:
|
|
|
devid = e->devid;
|
|
|
- set_dev_entry_from_acpi(devid, e->flags, e->ext);
|
|
|
+ set_dev_entry_from_acpi(iommu, devid, e->flags,
|
|
|
+ e->ext);
|
|
|
break;
|
|
|
case IVHD_DEV_EXT_SELECT_RANGE:
|
|
|
devid_start = e->devid;
|
|
@@ -590,7 +595,7 @@ static void __init init_iommu_from_acpi(struct amd_iommu *iommu,
|
|
|
for (dev_i = devid_start; dev_i <= devid; ++dev_i) {
|
|
|
if (alias)
|
|
|
amd_iommu_alias_table[dev_i] = devid_to;
|
|
|
- set_dev_entry_from_acpi(
|
|
|
+ set_dev_entry_from_acpi(iommu,
|
|
|
amd_iommu_alias_table[dev_i],
|
|
|
flags, ext_flags);
|
|
|
}
|