aboutsummaryrefslogtreecommitdiffstats
path: root/arch/sparc/kernel/pci.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/sparc/kernel/pci.c')
-rw-r--r--arch/sparc/kernel/pci.c42
1 files changed, 36 insertions, 6 deletions
diff --git a/arch/sparc/kernel/pci.c b/arch/sparc/kernel/pci.c
index badf0951d73c..c2b202d763a1 100644
--- a/arch/sparc/kernel/pci.c
+++ b/arch/sparc/kernel/pci.c
@@ -245,6 +245,18 @@ static void pci_parse_of_addrs(struct platform_device *op,
245 } 245 }
246} 246}
247 247
248static void pci_init_dev_archdata(struct dev_archdata *sd, void *iommu,
249 void *stc, void *host_controller,
250 struct platform_device *op,
251 int numa_node)
252{
253 sd->iommu = iommu;
254 sd->stc = stc;
255 sd->host_controller = host_controller;
256 sd->op = op;
257 sd->numa_node = numa_node;
258}
259
248static struct pci_dev *of_create_pci_dev(struct pci_pbm_info *pbm, 260static struct pci_dev *of_create_pci_dev(struct pci_pbm_info *pbm,
249 struct device_node *node, 261 struct device_node *node,
250 struct pci_bus *bus, int devfn) 262 struct pci_bus *bus, int devfn)
@@ -259,13 +271,10 @@ static struct pci_dev *of_create_pci_dev(struct pci_pbm_info *pbm,
259 if (!dev) 271 if (!dev)
260 return NULL; 272 return NULL;
261 273
274 op = of_find_device_by_node(node);
262 sd = &dev->dev.archdata; 275 sd = &dev->dev.archdata;
263 sd->iommu = pbm->iommu; 276 pci_init_dev_archdata(sd, pbm->iommu, &pbm->stc, pbm, op,
264 sd->stc = &pbm->stc; 277 pbm->numa_node);
265 sd->host_controller = pbm;
266 sd->op = op = of_find_device_by_node(node);
267 sd->numa_node = pbm->numa_node;
268
269 sd = &op->dev.archdata; 278 sd = &op->dev.archdata;
270 sd->iommu = pbm->iommu; 279 sd->iommu = pbm->iommu;
271 sd->stc = &pbm->stc; 280 sd->stc = &pbm->stc;
@@ -994,6 +1003,27 @@ void pcibios_set_master(struct pci_dev *dev)
994 /* No special bus mastering setup handling */ 1003 /* No special bus mastering setup handling */
995} 1004}
996 1005
1006#ifdef CONFIG_PCI_IOV
1007int pcibios_add_device(struct pci_dev *dev)
1008{
1009 struct pci_dev *pdev;
1010
1011 /* Add sriov arch specific initialization here.
1012 * Copy dev_archdata from PF to VF
1013 */
1014 if (dev->is_virtfn) {
1015 struct dev_archdata *psd;
1016
1017 pdev = dev->physfn;
1018 psd = &pdev->dev.archdata;
1019 pci_init_dev_archdata(&dev->dev.archdata, psd->iommu,
1020 psd->stc, psd->host_controller, NULL,
1021 psd->numa_node);
1022 }
1023 return 0;
1024}
1025#endif /* CONFIG_PCI_IOV */
1026
997static int __init pcibios_init(void) 1027static int __init pcibios_init(void)
998{ 1028{
999 pci_dfl_cache_line_size = 64 >> 2; 1029 pci_dfl_cache_line_size = 64 >> 2;