Interfaces for when a new domain in the crashdump kernel needs some
values from the panicked kernel's context entries.

Signed-off-by: Bill Sumner <billsumnerli...@gmail.com>
Signed-off-by: Li, Zhen-Hua <zhen-h...@hp.com>
---
 drivers/iommu/intel-iommu.c | 62 +++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 62 insertions(+)

diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
index 5ce2850..c0bebd6 100644
--- a/drivers/iommu/intel-iommu.c
+++ b/drivers/iommu/intel-iommu.c
@@ -381,6 +381,13 @@ struct domain_values_entry {
                                           2 == 1GiB, 3 == 512GiB, 4 == 1TiB */
 };
 
+static struct domain_values_entry *intel_iommu_did_to_domain_values_entry(
+               int did, struct intel_iommu *iommu);
+
+static int intel_iommu_get_dids_from_old_kernel(struct intel_iommu *iommu);
+
+static int device_to_domain_id(struct intel_iommu *iommu, u8 bus, u8 devfn);
+
 #endif /* CONFIG_CRASH_DUMP */
 
 /*
@@ -4832,3 +4839,58 @@ static void __init check_tylersburg_isoch(void)
        printk(KERN_WARNING "DMAR: Recommended TLB entries for ISOCH unit is 
16; your BIOS set %d\n",
               vtisochctrl);
 }
+
+#ifdef CONFIG_CRASH_DUMP
+
+/*
+ * Interfaces for when a new domain in the crashdump kernel needs some
+ * values from the panicked kernel's context entries
+ *
+ */
+static struct domain_values_entry *intel_iommu_did_to_domain_values_entry(
+               int did, struct intel_iommu *iommu)
+{
+       struct domain_values_entry *dve;        /* iterator */
+
+       list_for_each_entry(dve, &domain_values_list[iommu->seq_id], link)
+               if (dve->did == did)
+                       return dve;
+       return NULL;
+}
+
+/* Mark domain-id's from old kernel as in-use on this iommu so that a new
+ * domain-id is allocated in the case where there is a device in the new kernel
+ * that was not in the old kernel -- and therefore a new domain-id is needed.
+ */
+static int intel_iommu_get_dids_from_old_kernel(struct intel_iommu *iommu)
+{
+       struct domain_values_entry *dve;        /* iterator */
+
+       pr_info("IOMMU:%d Domain ids from panicked kernel:\n", iommu->seq_id);
+
+       list_for_each_entry(dve, &domain_values_list[iommu->seq_id], link) {
+               set_bit(dve->did, iommu->domain_ids);
+               pr_info("DID did:%d(0x%4.4x)\n", dve->did, dve->did);
+       }
+
+       pr_info("----------------------------------------\n");
+       return 0;
+}
+
+static int device_to_domain_id(struct intel_iommu *iommu, u8 bus, u8 devfn)
+{
+       int did = -1;                   /* domain-id returned */
+       struct root_entry *root;
+       struct context_entry *context;
+       unsigned long flags;
+
+       spin_lock_irqsave(&iommu->lock, flags);
+       root = &iommu->root_entry[bus];
+       context = get_context_addr_from_root(root);
+       if (context && context_present(context+devfn))
+               did = context_domain_id(context+devfn);
+       spin_unlock_irqrestore(&iommu->lock, flags);
+       return did;
+}
+
+#endif /* CONFIG_CRASH_DUMP */
-- 
2.0.0-rc0

_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

Reply via email to