|
@@ -641,6 +641,43 @@ unsigned int pcibios_assign_all_busses(void)
|
|
|
return (pci_probe & PCI_ASSIGN_ALL_BUSSES) ? 1 : 0;
|
|
|
}
|
|
|
|
|
|
+#if defined(CONFIG_X86_DEV_DMA_OPS) && defined(CONFIG_PCI_DOMAINS)
|
|
|
+static LIST_HEAD(dma_domain_list);
|
|
|
+static DEFINE_SPINLOCK(dma_domain_list_lock);
|
|
|
+
|
|
|
+void add_dma_domain(struct dma_domain *domain)
|
|
|
+{
|
|
|
+ spin_lock(&dma_domain_list_lock);
|
|
|
+ list_add(&domain->node, &dma_domain_list);
|
|
|
+ spin_unlock(&dma_domain_list_lock);
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(add_dma_domain);
|
|
|
+
|
|
|
+void del_dma_domain(struct dma_domain *domain)
|
|
|
+{
|
|
|
+ spin_lock(&dma_domain_list_lock);
|
|
|
+ list_del(&domain->node);
|
|
|
+ spin_unlock(&dma_domain_list_lock);
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(del_dma_domain);
|
|
|
+
|
|
|
+static void set_dma_domain_ops(struct pci_dev *pdev)
|
|
|
+{
|
|
|
+ struct dma_domain *domain;
|
|
|
+
|
|
|
+ spin_lock(&dma_domain_list_lock);
|
|
|
+ list_for_each_entry(domain, &dma_domain_list, node) {
|
|
|
+ if (pci_domain_nr(pdev->bus) == domain->domain_nr) {
|
|
|
+ pdev->dev.archdata.dma_ops = domain->dma_ops;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ spin_unlock(&dma_domain_list_lock);
|
|
|
+}
|
|
|
+#else
|
|
|
+static void set_dma_domain_ops(struct pci_dev *pdev) {}
|
|
|
+#endif
|
|
|
+
|
|
|
int pcibios_add_device(struct pci_dev *dev)
|
|
|
{
|
|
|
struct setup_data *data;
|
|
@@ -670,6 +707,7 @@ int pcibios_add_device(struct pci_dev *dev)
|
|
|
pa_data = data->next;
|
|
|
iounmap(data);
|
|
|
}
|
|
|
+ set_dma_domain_ops(dev);
|
|
|
return 0;
|
|
|
}
|
|
|
|