diff options
Diffstat (limited to 'arch/sparc/kernel/pci.c')
-rw-r--r-- | arch/sparc/kernel/pci.c | 42 |
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 | ||
248 | static 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 | |||
248 | static struct pci_dev *of_create_pci_dev(struct pci_pbm_info *pbm, | 260 | static 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 | ||
1007 | int 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 | |||
997 | static int __init pcibios_init(void) | 1027 | static int __init pcibios_init(void) |
998 | { | 1028 | { |
999 | pci_dfl_cache_line_size = 64 >> 2; | 1029 | pci_dfl_cache_line_size = 64 >> 2; |