]> Pileus Git - ~andy/linux/commitdiff
iommu/amd: Extend IVRS special device data structure
authorJoerg Roedel <joro@8bytes.org>
Tue, 9 Apr 2013 14:53:58 +0000 (16:53 +0200)
committerJoerg Roedel <joro@8bytes.org>
Fri, 19 Apr 2013 18:48:43 +0000 (20:48 +0200)
This patch extends the devid_map data structure to allow
ioapic and hpet entries in ivrs to be overridden on the
kernel command line.

Reviewed-by: Shuah Khan <shuahkhan@gmail.com>
Signed-off-by: Joerg Roedel <joro@8bytes.org>
drivers/iommu/amd_iommu_init.c
drivers/iommu/amd_iommu_types.h

index ea94ee6449893555414ca159dbc4bf733d3084fe..3a210f0c1b3f6031599cf1f2c4a23bbbbe38824e 100644 (file)
@@ -703,25 +703,35 @@ static void __init set_dev_entry_from_acpi(struct amd_iommu *iommu,
        set_iommu_for_device(iommu, devid);
 }
 
-static int __init add_special_device(u8 type, u8 id, u16 devid)
+static int __init add_special_device(u8 type, u8 id, u16 devid, bool cmd_line)
 {
        struct devid_map *entry;
        struct list_head *list;
 
-       if (type != IVHD_SPECIAL_IOAPIC && type != IVHD_SPECIAL_HPET)
+       if (type == IVHD_SPECIAL_IOAPIC)
+               list = &ioapic_map;
+       else if (type == IVHD_SPECIAL_HPET)
+               list = &hpet_map;
+       else
                return -EINVAL;
 
+       list_for_each_entry(entry, list, list) {
+               if (!(entry->id == id && entry->cmd_line))
+                       continue;
+
+               pr_info("AMD-Vi: Command-line override present for %s id %d - ignoring\n",
+                       type == IVHD_SPECIAL_IOAPIC ? "IOAPIC" : "HPET", id);
+
+               return 0;
+       }
+
        entry = kzalloc(sizeof(*entry), GFP_KERNEL);
        if (!entry)
                return -ENOMEM;
 
-       entry->id    = id;
-       entry->devid = devid;
-
-       if (type == IVHD_SPECIAL_IOAPIC)
-               list = &ioapic_map;
-       else
-               list = &hpet_map;
+       entry->id       = id;
+       entry->devid    = devid;
+       entry->cmd_line = cmd_line;
 
        list_add_tail(&entry->list, list);
 
@@ -929,7 +939,7 @@ static int __init init_iommu_from_acpi(struct amd_iommu *iommu,
                                    PCI_FUNC(devid));
 
                        set_dev_entry_from_acpi(iommu, devid, e->flags, 0);
-                       ret = add_special_device(type, handle, devid);
+                       ret = add_special_device(type, handle, devid, false);
                        if (ret)
                                return ret;
                        break;
index 083f98c0488b676849e64eaa1006a14b4bab6406..b81153fb9e6061849fd93f7c57a30ab53213ae1d 100644 (file)
@@ -592,6 +592,7 @@ struct devid_map {
        struct list_head list;
        u8 id;
        u16 devid;
+       bool cmd_line;
 };
 
 /* Map HPET and IOAPIC ids to the devid used by the IOMMU */