1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 * Copyright (C) 2006 Benjamin Herrenschmidt, IBM Corp. 4 * <benh@kernel.crashing.org> 5 * and Arnd Bergmann, IBM Corp. 6 */ 7 8 #undef DEBUG 9 10 #include <linux/string.h> 11 #include <linux/kernel.h> 12 #include <linux/init.h> 13 #include <linux/export.h> 14 #include <linux/mod_devicetable.h> 15 #include <linux/pci.h> 16 #include <linux/of.h> 17 #include <linux/of_device.h> 18 #include <linux/of_platform.h> 19 #include <linux/atomic.h> 20 21 #include <asm/errno.h> 22 #include <asm/topology.h> 23 #include <asm/pci-bridge.h> 24 #include <asm/ppc-pci.h> 25 #include <asm/eeh.h> 26 27 #ifdef CONFIG_PPC_OF_PLATFORM_PCI 28 29 /* The probing of PCI controllers from of_platform is currently 30 * 64 bits only, mostly due to gratuitous differences between 31 * the 32 and 64 bits PCI code on PowerPC and the 32 bits one 32 * lacking some bits needed here. 33 */ 34 35 static int of_pci_phb_probe(struct platform_device *dev) 36 { 37 struct pci_controller *phb; 38 39 /* Check if we can do that ... */ 40 if (ppc_md.pci_setup_phb == NULL) 41 return -ENODEV; 42 43 pr_info("Setting up PCI bus %pOF\n", dev->dev.of_node); 44 45 /* Alloc and setup PHB data structure */ 46 phb = pcibios_alloc_controller(dev->dev.of_node); 47 if (!phb) 48 return -ENODEV; 49 50 /* Setup parent in sysfs */ 51 phb->parent = &dev->dev; 52 53 /* Setup the PHB using arch provided callback */ 54 if (ppc_md.pci_setup_phb(phb)) { 55 pcibios_free_controller(phb); 56 return -ENODEV; 57 } 58 59 /* Process "ranges" property */ 60 pci_process_bridge_OF_ranges(phb, dev->dev.of_node, 0); 61 62 /* Init pci_dn data structures */ 63 pci_devs_phb_init_dynamic(phb); 64 65 /* Create EEH devices for the PHB */ 66 eeh_dev_phb_init_dynamic(phb); 67 68 /* Register devices with EEH */ 69 if (dev->dev.of_node->child) 70 eeh_add_device_tree_early(PCI_DN(dev->dev.of_node)); 71 72 /* Scan the bus */ 73 pcibios_scan_phb(phb); 74 if (phb->bus == NULL) 75 return -ENXIO; 76 77 /* Claim resources. This might need some rework as well depending 78 * whether we are doing probe-only or not, like assigning unassigned 79 * resources etc... 80 */ 81 pcibios_claim_one_bus(phb->bus); 82 83 /* Finish EEH setup */ 84 eeh_add_device_tree_late(phb->bus); 85 86 /* Add probed PCI devices to the device model */ 87 pci_bus_add_devices(phb->bus); 88 89 /* sysfs files should only be added after devices are added */ 90 eeh_add_sysfs_files(phb->bus); 91 92 return 0; 93 } 94 95 static const struct of_device_id of_pci_phb_ids[] = { 96 { .type = "pci", }, 97 { .type = "pcix", }, 98 { .type = "pcie", }, 99 { .type = "pciex", }, 100 { .type = "ht", }, 101 {} 102 }; 103 104 static struct platform_driver of_pci_phb_driver = { 105 .probe = of_pci_phb_probe, 106 .driver = { 107 .name = "of-pci", 108 .of_match_table = of_pci_phb_ids, 109 }, 110 }; 111 112 builtin_platform_driver(of_pci_phb_driver); 113 114 #endif /* CONFIG_PPC_OF_PLATFORM_PCI */ 115