return false;
 }
 
-struct intel_iommu *device_to_iommu(struct device *dev, u8 *bus, u8 *devfn)
+static struct intel_iommu *device_lookup_iommu(struct device *dev, u8 *bus, u8 *devfn)
 {
        struct dmar_drhd_unit *drhd = NULL;
        struct pci_dev *pdev = NULL;
 static int
 domain_context_mapping(struct dmar_domain *domain, struct device *dev)
 {
+       struct device_domain_info *info = dev_iommu_priv_get(dev);
        struct domain_context_mapping_data data;
+       struct intel_iommu *iommu = info->iommu;
+       u8 bus = info->bus, devfn = info->devfn;
        struct pasid_table *table;
-       struct intel_iommu *iommu;
-       u8 bus, devfn;
-
-       iommu = device_to_iommu(dev, &bus, &devfn);
-       if (!iommu)
-               return -ENODEV;
 
        table = intel_pasid_get_table(dev);
 
                                     struct device *dev)
 {
        struct device_domain_info *info = dev_iommu_priv_get(dev);
-       struct intel_iommu *iommu;
+       struct intel_iommu *iommu = info->iommu;
        unsigned long flags;
-       u8 bus, devfn;
        int ret;
 
-       iommu = device_to_iommu(dev, &bus, &devfn);
-       if (!iommu)
-               return -ENODEV;
-
        ret = domain_attach_iommu(domain, iommu);
        if (ret)
                return ret;
 int prepare_domain_attach_device(struct iommu_domain *domain,
                                 struct device *dev)
 {
+       struct device_domain_info *info = dev_iommu_priv_get(dev);
        struct dmar_domain *dmar_domain = to_dmar_domain(domain);
-       struct intel_iommu *iommu;
+       struct intel_iommu *iommu = info->iommu;
        int addr_width;
 
-       iommu = device_to_iommu(dev, NULL, NULL);
-       if (!iommu)
-               return -ENODEV;
-
        if (dmar_domain->force_snooping && !ecap_sc_support(iommu->ecap))
                return -EINVAL;
 
        u8 bus, devfn;
        int ret;
 
-       iommu = device_to_iommu(dev, &bus, &devfn);
+       iommu = device_lookup_iommu(dev, &bus, &devfn);
        if (!iommu || !iommu->iommu.ops)
                return ERR_PTR(-ENODEV);
 
 
 static void intel_iommu_remove_dev_pasid(struct device *dev, ioasid_t pasid)
 {
-       struct intel_iommu *iommu = device_to_iommu(dev, NULL, NULL);
+       struct device_domain_info *info = dev_iommu_priv_get(dev);
        struct dev_pasid_info *curr, *dev_pasid = NULL;
+       struct intel_iommu *iommu = info->iommu;
        struct dmar_domain *dmar_domain;
        struct iommu_domain *domain;
        unsigned long flags;
 
 void intel_svm_remove_dev_pasid(struct device *dev, u32 pasid)
 {
        struct intel_svm_dev *sdev;
-       struct intel_iommu *iommu;
        struct intel_svm *svm;
        struct mm_struct *mm;
 
-       iommu = device_to_iommu(dev, NULL, NULL);
-       if (!iommu)
-               return;
-
        if (pasid_to_svm_sdev(dev, pasid, &svm, &sdev))
                return;
        mm = svm->mm;
                            struct iommu_fault_event *evt,
                            struct iommu_page_response *msg)
 {
+       struct device_domain_info *info = dev_iommu_priv_get(dev);
+       struct intel_iommu *iommu = info->iommu;
+       u8 bus = info->bus, devfn = info->devfn;
        struct iommu_fault_page_request *prm;
-       struct intel_iommu *iommu;
        bool private_present;
        bool pasid_present;
        bool last_page;
-       u8 bus, devfn;
        int ret = 0;
        u16 sid;
 
-       if (!dev || !dev_is_pci(dev))
-               return -ENODEV;
-
-       iommu = device_to_iommu(dev, &bus, &devfn);
-       if (!iommu)
-               return -ENODEV;
-
-       if (!msg || !evt)
-               return -EINVAL;
-
        prm = &evt->fault.prm;
        sid = PCI_DEVID(bus, devfn);
        pasid_present = prm->flags & IOMMU_FAULT_PAGE_REQUEST_PASID_VALID;