162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * PCI detection and setup code 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#include <linux/kernel.h> 762306a36Sopenharmony_ci#include <linux/delay.h> 862306a36Sopenharmony_ci#include <linux/init.h> 962306a36Sopenharmony_ci#include <linux/pci.h> 1062306a36Sopenharmony_ci#include <linux/msi.h> 1162306a36Sopenharmony_ci#include <linux/of_pci.h> 1262306a36Sopenharmony_ci#include <linux/pci_hotplug.h> 1362306a36Sopenharmony_ci#include <linux/slab.h> 1462306a36Sopenharmony_ci#include <linux/module.h> 1562306a36Sopenharmony_ci#include <linux/cpumask.h> 1662306a36Sopenharmony_ci#include <linux/aer.h> 1762306a36Sopenharmony_ci#include <linux/acpi.h> 1862306a36Sopenharmony_ci#include <linux/hypervisor.h> 1962306a36Sopenharmony_ci#include <linux/irqdomain.h> 2062306a36Sopenharmony_ci#include <linux/pm_runtime.h> 2162306a36Sopenharmony_ci#include <linux/bitfield.h> 2262306a36Sopenharmony_ci#include "pci.h" 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci#define CARDBUS_LATENCY_TIMER 176 /* secondary latency timer */ 2562306a36Sopenharmony_ci#define CARDBUS_RESERVE_BUSNR 3 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_cistatic struct resource busn_resource = { 2862306a36Sopenharmony_ci .name = "PCI busn", 2962306a36Sopenharmony_ci .start = 0, 3062306a36Sopenharmony_ci .end = 255, 3162306a36Sopenharmony_ci .flags = IORESOURCE_BUS, 3262306a36Sopenharmony_ci}; 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci/* Ugh. Need to stop exporting this to modules. */ 3562306a36Sopenharmony_ciLIST_HEAD(pci_root_buses); 3662306a36Sopenharmony_ciEXPORT_SYMBOL(pci_root_buses); 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_cistatic LIST_HEAD(pci_domain_busn_res_list); 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_cistruct pci_domain_busn_res { 4162306a36Sopenharmony_ci struct list_head list; 4262306a36Sopenharmony_ci struct resource res; 4362306a36Sopenharmony_ci int domain_nr; 4462306a36Sopenharmony_ci}; 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_cistatic struct resource *get_pci_domain_busn_res(int domain_nr) 4762306a36Sopenharmony_ci{ 4862306a36Sopenharmony_ci struct pci_domain_busn_res *r; 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci list_for_each_entry(r, &pci_domain_busn_res_list, list) 5162306a36Sopenharmony_ci if (r->domain_nr == domain_nr) 5262306a36Sopenharmony_ci return &r->res; 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci r = kzalloc(sizeof(*r), GFP_KERNEL); 5562306a36Sopenharmony_ci if (!r) 5662306a36Sopenharmony_ci return NULL; 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci r->domain_nr = domain_nr; 5962306a36Sopenharmony_ci r->res.start = 0; 6062306a36Sopenharmony_ci r->res.end = 0xff; 6162306a36Sopenharmony_ci r->res.flags = IORESOURCE_BUS | IORESOURCE_PCI_FIXED; 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci list_add_tail(&r->list, &pci_domain_busn_res_list); 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci return &r->res; 6662306a36Sopenharmony_ci} 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci/* 6962306a36Sopenharmony_ci * Some device drivers need know if PCI is initiated. 7062306a36Sopenharmony_ci * Basically, we think PCI is not initiated when there 7162306a36Sopenharmony_ci * is no device to be found on the pci_bus_type. 7262306a36Sopenharmony_ci */ 7362306a36Sopenharmony_ciint no_pci_devices(void) 7462306a36Sopenharmony_ci{ 7562306a36Sopenharmony_ci struct device *dev; 7662306a36Sopenharmony_ci int no_devices; 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci dev = bus_find_next_device(&pci_bus_type, NULL); 7962306a36Sopenharmony_ci no_devices = (dev == NULL); 8062306a36Sopenharmony_ci put_device(dev); 8162306a36Sopenharmony_ci return no_devices; 8262306a36Sopenharmony_ci} 8362306a36Sopenharmony_ciEXPORT_SYMBOL(no_pci_devices); 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci/* 8662306a36Sopenharmony_ci * PCI Bus Class 8762306a36Sopenharmony_ci */ 8862306a36Sopenharmony_cistatic void release_pcibus_dev(struct device *dev) 8962306a36Sopenharmony_ci{ 9062306a36Sopenharmony_ci struct pci_bus *pci_bus = to_pci_bus(dev); 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ci put_device(pci_bus->bridge); 9362306a36Sopenharmony_ci pci_bus_remove_resources(pci_bus); 9462306a36Sopenharmony_ci pci_release_bus_of_node(pci_bus); 9562306a36Sopenharmony_ci kfree(pci_bus); 9662306a36Sopenharmony_ci} 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_cistatic struct class pcibus_class = { 9962306a36Sopenharmony_ci .name = "pci_bus", 10062306a36Sopenharmony_ci .dev_release = &release_pcibus_dev, 10162306a36Sopenharmony_ci .dev_groups = pcibus_groups, 10262306a36Sopenharmony_ci}; 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_cistatic int __init pcibus_class_init(void) 10562306a36Sopenharmony_ci{ 10662306a36Sopenharmony_ci return class_register(&pcibus_class); 10762306a36Sopenharmony_ci} 10862306a36Sopenharmony_cipostcore_initcall(pcibus_class_init); 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_cistatic u64 pci_size(u64 base, u64 maxbase, u64 mask) 11162306a36Sopenharmony_ci{ 11262306a36Sopenharmony_ci u64 size = mask & maxbase; /* Find the significant bits */ 11362306a36Sopenharmony_ci if (!size) 11462306a36Sopenharmony_ci return 0; 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_ci /* 11762306a36Sopenharmony_ci * Get the lowest of them to find the decode size, and from that 11862306a36Sopenharmony_ci * the extent. 11962306a36Sopenharmony_ci */ 12062306a36Sopenharmony_ci size = size & ~(size-1); 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ci /* 12362306a36Sopenharmony_ci * base == maxbase can be valid only if the BAR has already been 12462306a36Sopenharmony_ci * programmed with all 1s. 12562306a36Sopenharmony_ci */ 12662306a36Sopenharmony_ci if (base == maxbase && ((base | (size - 1)) & mask) != mask) 12762306a36Sopenharmony_ci return 0; 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_ci return size; 13062306a36Sopenharmony_ci} 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_cistatic inline unsigned long decode_bar(struct pci_dev *dev, u32 bar) 13362306a36Sopenharmony_ci{ 13462306a36Sopenharmony_ci u32 mem_type; 13562306a36Sopenharmony_ci unsigned long flags; 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_ci if ((bar & PCI_BASE_ADDRESS_SPACE) == PCI_BASE_ADDRESS_SPACE_IO) { 13862306a36Sopenharmony_ci flags = bar & ~PCI_BASE_ADDRESS_IO_MASK; 13962306a36Sopenharmony_ci flags |= IORESOURCE_IO; 14062306a36Sopenharmony_ci return flags; 14162306a36Sopenharmony_ci } 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_ci flags = bar & ~PCI_BASE_ADDRESS_MEM_MASK; 14462306a36Sopenharmony_ci flags |= IORESOURCE_MEM; 14562306a36Sopenharmony_ci if (flags & PCI_BASE_ADDRESS_MEM_PREFETCH) 14662306a36Sopenharmony_ci flags |= IORESOURCE_PREFETCH; 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_ci mem_type = bar & PCI_BASE_ADDRESS_MEM_TYPE_MASK; 14962306a36Sopenharmony_ci switch (mem_type) { 15062306a36Sopenharmony_ci case PCI_BASE_ADDRESS_MEM_TYPE_32: 15162306a36Sopenharmony_ci break; 15262306a36Sopenharmony_ci case PCI_BASE_ADDRESS_MEM_TYPE_1M: 15362306a36Sopenharmony_ci /* 1M mem BAR treated as 32-bit BAR */ 15462306a36Sopenharmony_ci break; 15562306a36Sopenharmony_ci case PCI_BASE_ADDRESS_MEM_TYPE_64: 15662306a36Sopenharmony_ci flags |= IORESOURCE_MEM_64; 15762306a36Sopenharmony_ci break; 15862306a36Sopenharmony_ci default: 15962306a36Sopenharmony_ci /* mem unknown type treated as 32-bit BAR */ 16062306a36Sopenharmony_ci break; 16162306a36Sopenharmony_ci } 16262306a36Sopenharmony_ci return flags; 16362306a36Sopenharmony_ci} 16462306a36Sopenharmony_ci 16562306a36Sopenharmony_ci#define PCI_COMMAND_DECODE_ENABLE (PCI_COMMAND_MEMORY | PCI_COMMAND_IO) 16662306a36Sopenharmony_ci 16762306a36Sopenharmony_ci/** 16862306a36Sopenharmony_ci * __pci_read_base - Read a PCI BAR 16962306a36Sopenharmony_ci * @dev: the PCI device 17062306a36Sopenharmony_ci * @type: type of the BAR 17162306a36Sopenharmony_ci * @res: resource buffer to be filled in 17262306a36Sopenharmony_ci * @pos: BAR position in the config space 17362306a36Sopenharmony_ci * 17462306a36Sopenharmony_ci * Returns 1 if the BAR is 64-bit, or 0 if 32-bit. 17562306a36Sopenharmony_ci */ 17662306a36Sopenharmony_ciint __pci_read_base(struct pci_dev *dev, enum pci_bar_type type, 17762306a36Sopenharmony_ci struct resource *res, unsigned int pos) 17862306a36Sopenharmony_ci{ 17962306a36Sopenharmony_ci u32 l = 0, sz = 0, mask; 18062306a36Sopenharmony_ci u64 l64, sz64, mask64; 18162306a36Sopenharmony_ci u16 orig_cmd; 18262306a36Sopenharmony_ci struct pci_bus_region region, inverted_region; 18362306a36Sopenharmony_ci 18462306a36Sopenharmony_ci mask = type ? PCI_ROM_ADDRESS_MASK : ~0; 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_ci /* No printks while decoding is disabled! */ 18762306a36Sopenharmony_ci if (!dev->mmio_always_on) { 18862306a36Sopenharmony_ci pci_read_config_word(dev, PCI_COMMAND, &orig_cmd); 18962306a36Sopenharmony_ci if (orig_cmd & PCI_COMMAND_DECODE_ENABLE) { 19062306a36Sopenharmony_ci pci_write_config_word(dev, PCI_COMMAND, 19162306a36Sopenharmony_ci orig_cmd & ~PCI_COMMAND_DECODE_ENABLE); 19262306a36Sopenharmony_ci } 19362306a36Sopenharmony_ci } 19462306a36Sopenharmony_ci 19562306a36Sopenharmony_ci res->name = pci_name(dev); 19662306a36Sopenharmony_ci 19762306a36Sopenharmony_ci pci_read_config_dword(dev, pos, &l); 19862306a36Sopenharmony_ci pci_write_config_dword(dev, pos, l | mask); 19962306a36Sopenharmony_ci pci_read_config_dword(dev, pos, &sz); 20062306a36Sopenharmony_ci pci_write_config_dword(dev, pos, l); 20162306a36Sopenharmony_ci 20262306a36Sopenharmony_ci /* 20362306a36Sopenharmony_ci * All bits set in sz means the device isn't working properly. 20462306a36Sopenharmony_ci * If the BAR isn't implemented, all bits must be 0. If it's a 20562306a36Sopenharmony_ci * memory BAR or a ROM, bit 0 must be clear; if it's an io BAR, bit 20662306a36Sopenharmony_ci * 1 must be clear. 20762306a36Sopenharmony_ci */ 20862306a36Sopenharmony_ci if (PCI_POSSIBLE_ERROR(sz)) 20962306a36Sopenharmony_ci sz = 0; 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_ci /* 21262306a36Sopenharmony_ci * I don't know how l can have all bits set. Copied from old code. 21362306a36Sopenharmony_ci * Maybe it fixes a bug on some ancient platform. 21462306a36Sopenharmony_ci */ 21562306a36Sopenharmony_ci if (PCI_POSSIBLE_ERROR(l)) 21662306a36Sopenharmony_ci l = 0; 21762306a36Sopenharmony_ci 21862306a36Sopenharmony_ci if (type == pci_bar_unknown) { 21962306a36Sopenharmony_ci res->flags = decode_bar(dev, l); 22062306a36Sopenharmony_ci res->flags |= IORESOURCE_SIZEALIGN; 22162306a36Sopenharmony_ci if (res->flags & IORESOURCE_IO) { 22262306a36Sopenharmony_ci l64 = l & PCI_BASE_ADDRESS_IO_MASK; 22362306a36Sopenharmony_ci sz64 = sz & PCI_BASE_ADDRESS_IO_MASK; 22462306a36Sopenharmony_ci mask64 = PCI_BASE_ADDRESS_IO_MASK & (u32)IO_SPACE_LIMIT; 22562306a36Sopenharmony_ci } else { 22662306a36Sopenharmony_ci l64 = l & PCI_BASE_ADDRESS_MEM_MASK; 22762306a36Sopenharmony_ci sz64 = sz & PCI_BASE_ADDRESS_MEM_MASK; 22862306a36Sopenharmony_ci mask64 = (u32)PCI_BASE_ADDRESS_MEM_MASK; 22962306a36Sopenharmony_ci } 23062306a36Sopenharmony_ci } else { 23162306a36Sopenharmony_ci if (l & PCI_ROM_ADDRESS_ENABLE) 23262306a36Sopenharmony_ci res->flags |= IORESOURCE_ROM_ENABLE; 23362306a36Sopenharmony_ci l64 = l & PCI_ROM_ADDRESS_MASK; 23462306a36Sopenharmony_ci sz64 = sz & PCI_ROM_ADDRESS_MASK; 23562306a36Sopenharmony_ci mask64 = PCI_ROM_ADDRESS_MASK; 23662306a36Sopenharmony_ci } 23762306a36Sopenharmony_ci 23862306a36Sopenharmony_ci if (res->flags & IORESOURCE_MEM_64) { 23962306a36Sopenharmony_ci pci_read_config_dword(dev, pos + 4, &l); 24062306a36Sopenharmony_ci pci_write_config_dword(dev, pos + 4, ~0); 24162306a36Sopenharmony_ci pci_read_config_dword(dev, pos + 4, &sz); 24262306a36Sopenharmony_ci pci_write_config_dword(dev, pos + 4, l); 24362306a36Sopenharmony_ci 24462306a36Sopenharmony_ci l64 |= ((u64)l << 32); 24562306a36Sopenharmony_ci sz64 |= ((u64)sz << 32); 24662306a36Sopenharmony_ci mask64 |= ((u64)~0 << 32); 24762306a36Sopenharmony_ci } 24862306a36Sopenharmony_ci 24962306a36Sopenharmony_ci if (!dev->mmio_always_on && (orig_cmd & PCI_COMMAND_DECODE_ENABLE)) 25062306a36Sopenharmony_ci pci_write_config_word(dev, PCI_COMMAND, orig_cmd); 25162306a36Sopenharmony_ci 25262306a36Sopenharmony_ci if (!sz64) 25362306a36Sopenharmony_ci goto fail; 25462306a36Sopenharmony_ci 25562306a36Sopenharmony_ci sz64 = pci_size(l64, sz64, mask64); 25662306a36Sopenharmony_ci if (!sz64) { 25762306a36Sopenharmony_ci pci_info(dev, FW_BUG "reg 0x%x: invalid BAR (can't size)\n", 25862306a36Sopenharmony_ci pos); 25962306a36Sopenharmony_ci goto fail; 26062306a36Sopenharmony_ci } 26162306a36Sopenharmony_ci 26262306a36Sopenharmony_ci if (res->flags & IORESOURCE_MEM_64) { 26362306a36Sopenharmony_ci if ((sizeof(pci_bus_addr_t) < 8 || sizeof(resource_size_t) < 8) 26462306a36Sopenharmony_ci && sz64 > 0x100000000ULL) { 26562306a36Sopenharmony_ci res->flags |= IORESOURCE_UNSET | IORESOURCE_DISABLED; 26662306a36Sopenharmony_ci res->start = 0; 26762306a36Sopenharmony_ci res->end = 0; 26862306a36Sopenharmony_ci pci_err(dev, "reg 0x%x: can't handle BAR larger than 4GB (size %#010llx)\n", 26962306a36Sopenharmony_ci pos, (unsigned long long)sz64); 27062306a36Sopenharmony_ci goto out; 27162306a36Sopenharmony_ci } 27262306a36Sopenharmony_ci 27362306a36Sopenharmony_ci if ((sizeof(pci_bus_addr_t) < 8) && l) { 27462306a36Sopenharmony_ci /* Above 32-bit boundary; try to reallocate */ 27562306a36Sopenharmony_ci res->flags |= IORESOURCE_UNSET; 27662306a36Sopenharmony_ci res->start = 0; 27762306a36Sopenharmony_ci res->end = sz64 - 1; 27862306a36Sopenharmony_ci pci_info(dev, "reg 0x%x: can't handle BAR above 4GB (bus address %#010llx)\n", 27962306a36Sopenharmony_ci pos, (unsigned long long)l64); 28062306a36Sopenharmony_ci goto out; 28162306a36Sopenharmony_ci } 28262306a36Sopenharmony_ci } 28362306a36Sopenharmony_ci 28462306a36Sopenharmony_ci region.start = l64; 28562306a36Sopenharmony_ci region.end = l64 + sz64 - 1; 28662306a36Sopenharmony_ci 28762306a36Sopenharmony_ci pcibios_bus_to_resource(dev->bus, res, ®ion); 28862306a36Sopenharmony_ci pcibios_resource_to_bus(dev->bus, &inverted_region, res); 28962306a36Sopenharmony_ci 29062306a36Sopenharmony_ci /* 29162306a36Sopenharmony_ci * If "A" is a BAR value (a bus address), "bus_to_resource(A)" is 29262306a36Sopenharmony_ci * the corresponding resource address (the physical address used by 29362306a36Sopenharmony_ci * the CPU. Converting that resource address back to a bus address 29462306a36Sopenharmony_ci * should yield the original BAR value: 29562306a36Sopenharmony_ci * 29662306a36Sopenharmony_ci * resource_to_bus(bus_to_resource(A)) == A 29762306a36Sopenharmony_ci * 29862306a36Sopenharmony_ci * If it doesn't, CPU accesses to "bus_to_resource(A)" will not 29962306a36Sopenharmony_ci * be claimed by the device. 30062306a36Sopenharmony_ci */ 30162306a36Sopenharmony_ci if (inverted_region.start != region.start) { 30262306a36Sopenharmony_ci res->flags |= IORESOURCE_UNSET; 30362306a36Sopenharmony_ci res->start = 0; 30462306a36Sopenharmony_ci res->end = region.end - region.start; 30562306a36Sopenharmony_ci pci_info(dev, "reg 0x%x: initial BAR value %#010llx invalid\n", 30662306a36Sopenharmony_ci pos, (unsigned long long)region.start); 30762306a36Sopenharmony_ci } 30862306a36Sopenharmony_ci 30962306a36Sopenharmony_ci goto out; 31062306a36Sopenharmony_ci 31162306a36Sopenharmony_ci 31262306a36Sopenharmony_cifail: 31362306a36Sopenharmony_ci res->flags = 0; 31462306a36Sopenharmony_ciout: 31562306a36Sopenharmony_ci if (res->flags) 31662306a36Sopenharmony_ci pci_info(dev, "reg 0x%x: %pR\n", pos, res); 31762306a36Sopenharmony_ci 31862306a36Sopenharmony_ci return (res->flags & IORESOURCE_MEM_64) ? 1 : 0; 31962306a36Sopenharmony_ci} 32062306a36Sopenharmony_ci 32162306a36Sopenharmony_cistatic void pci_read_bases(struct pci_dev *dev, unsigned int howmany, int rom) 32262306a36Sopenharmony_ci{ 32362306a36Sopenharmony_ci unsigned int pos, reg; 32462306a36Sopenharmony_ci 32562306a36Sopenharmony_ci if (dev->non_compliant_bars) 32662306a36Sopenharmony_ci return; 32762306a36Sopenharmony_ci 32862306a36Sopenharmony_ci /* Per PCIe r4.0, sec 9.3.4.1.11, the VF BARs are all RO Zero */ 32962306a36Sopenharmony_ci if (dev->is_virtfn) 33062306a36Sopenharmony_ci return; 33162306a36Sopenharmony_ci 33262306a36Sopenharmony_ci for (pos = 0; pos < howmany; pos++) { 33362306a36Sopenharmony_ci struct resource *res = &dev->resource[pos]; 33462306a36Sopenharmony_ci reg = PCI_BASE_ADDRESS_0 + (pos << 2); 33562306a36Sopenharmony_ci pos += __pci_read_base(dev, pci_bar_unknown, res, reg); 33662306a36Sopenharmony_ci } 33762306a36Sopenharmony_ci 33862306a36Sopenharmony_ci if (rom) { 33962306a36Sopenharmony_ci struct resource *res = &dev->resource[PCI_ROM_RESOURCE]; 34062306a36Sopenharmony_ci dev->rom_base_reg = rom; 34162306a36Sopenharmony_ci res->flags = IORESOURCE_MEM | IORESOURCE_PREFETCH | 34262306a36Sopenharmony_ci IORESOURCE_READONLY | IORESOURCE_SIZEALIGN; 34362306a36Sopenharmony_ci __pci_read_base(dev, pci_bar_mem32, res, rom); 34462306a36Sopenharmony_ci } 34562306a36Sopenharmony_ci} 34662306a36Sopenharmony_ci 34762306a36Sopenharmony_cistatic void pci_read_bridge_windows(struct pci_dev *bridge) 34862306a36Sopenharmony_ci{ 34962306a36Sopenharmony_ci u16 io; 35062306a36Sopenharmony_ci u32 pmem, tmp; 35162306a36Sopenharmony_ci 35262306a36Sopenharmony_ci pci_read_config_word(bridge, PCI_IO_BASE, &io); 35362306a36Sopenharmony_ci if (!io) { 35462306a36Sopenharmony_ci pci_write_config_word(bridge, PCI_IO_BASE, 0xe0f0); 35562306a36Sopenharmony_ci pci_read_config_word(bridge, PCI_IO_BASE, &io); 35662306a36Sopenharmony_ci pci_write_config_word(bridge, PCI_IO_BASE, 0x0); 35762306a36Sopenharmony_ci } 35862306a36Sopenharmony_ci if (io) 35962306a36Sopenharmony_ci bridge->io_window = 1; 36062306a36Sopenharmony_ci 36162306a36Sopenharmony_ci /* 36262306a36Sopenharmony_ci * DECchip 21050 pass 2 errata: the bridge may miss an address 36362306a36Sopenharmony_ci * disconnect boundary by one PCI data phase. Workaround: do not 36462306a36Sopenharmony_ci * use prefetching on this device. 36562306a36Sopenharmony_ci */ 36662306a36Sopenharmony_ci if (bridge->vendor == PCI_VENDOR_ID_DEC && bridge->device == 0x0001) 36762306a36Sopenharmony_ci return; 36862306a36Sopenharmony_ci 36962306a36Sopenharmony_ci pci_read_config_dword(bridge, PCI_PREF_MEMORY_BASE, &pmem); 37062306a36Sopenharmony_ci if (!pmem) { 37162306a36Sopenharmony_ci pci_write_config_dword(bridge, PCI_PREF_MEMORY_BASE, 37262306a36Sopenharmony_ci 0xffe0fff0); 37362306a36Sopenharmony_ci pci_read_config_dword(bridge, PCI_PREF_MEMORY_BASE, &pmem); 37462306a36Sopenharmony_ci pci_write_config_dword(bridge, PCI_PREF_MEMORY_BASE, 0x0); 37562306a36Sopenharmony_ci } 37662306a36Sopenharmony_ci if (!pmem) 37762306a36Sopenharmony_ci return; 37862306a36Sopenharmony_ci 37962306a36Sopenharmony_ci bridge->pref_window = 1; 38062306a36Sopenharmony_ci 38162306a36Sopenharmony_ci if ((pmem & PCI_PREF_RANGE_TYPE_MASK) == PCI_PREF_RANGE_TYPE_64) { 38262306a36Sopenharmony_ci 38362306a36Sopenharmony_ci /* 38462306a36Sopenharmony_ci * Bridge claims to have a 64-bit prefetchable memory 38562306a36Sopenharmony_ci * window; verify that the upper bits are actually 38662306a36Sopenharmony_ci * writable. 38762306a36Sopenharmony_ci */ 38862306a36Sopenharmony_ci pci_read_config_dword(bridge, PCI_PREF_BASE_UPPER32, &pmem); 38962306a36Sopenharmony_ci pci_write_config_dword(bridge, PCI_PREF_BASE_UPPER32, 39062306a36Sopenharmony_ci 0xffffffff); 39162306a36Sopenharmony_ci pci_read_config_dword(bridge, PCI_PREF_BASE_UPPER32, &tmp); 39262306a36Sopenharmony_ci pci_write_config_dword(bridge, PCI_PREF_BASE_UPPER32, pmem); 39362306a36Sopenharmony_ci if (tmp) 39462306a36Sopenharmony_ci bridge->pref_64_window = 1; 39562306a36Sopenharmony_ci } 39662306a36Sopenharmony_ci} 39762306a36Sopenharmony_ci 39862306a36Sopenharmony_cistatic void pci_read_bridge_io(struct pci_bus *child) 39962306a36Sopenharmony_ci{ 40062306a36Sopenharmony_ci struct pci_dev *dev = child->self; 40162306a36Sopenharmony_ci u8 io_base_lo, io_limit_lo; 40262306a36Sopenharmony_ci unsigned long io_mask, io_granularity, base, limit; 40362306a36Sopenharmony_ci struct pci_bus_region region; 40462306a36Sopenharmony_ci struct resource *res; 40562306a36Sopenharmony_ci 40662306a36Sopenharmony_ci io_mask = PCI_IO_RANGE_MASK; 40762306a36Sopenharmony_ci io_granularity = 0x1000; 40862306a36Sopenharmony_ci if (dev->io_window_1k) { 40962306a36Sopenharmony_ci /* Support 1K I/O space granularity */ 41062306a36Sopenharmony_ci io_mask = PCI_IO_1K_RANGE_MASK; 41162306a36Sopenharmony_ci io_granularity = 0x400; 41262306a36Sopenharmony_ci } 41362306a36Sopenharmony_ci 41462306a36Sopenharmony_ci res = child->resource[0]; 41562306a36Sopenharmony_ci pci_read_config_byte(dev, PCI_IO_BASE, &io_base_lo); 41662306a36Sopenharmony_ci pci_read_config_byte(dev, PCI_IO_LIMIT, &io_limit_lo); 41762306a36Sopenharmony_ci base = (io_base_lo & io_mask) << 8; 41862306a36Sopenharmony_ci limit = (io_limit_lo & io_mask) << 8; 41962306a36Sopenharmony_ci 42062306a36Sopenharmony_ci if ((io_base_lo & PCI_IO_RANGE_TYPE_MASK) == PCI_IO_RANGE_TYPE_32) { 42162306a36Sopenharmony_ci u16 io_base_hi, io_limit_hi; 42262306a36Sopenharmony_ci 42362306a36Sopenharmony_ci pci_read_config_word(dev, PCI_IO_BASE_UPPER16, &io_base_hi); 42462306a36Sopenharmony_ci pci_read_config_word(dev, PCI_IO_LIMIT_UPPER16, &io_limit_hi); 42562306a36Sopenharmony_ci base |= ((unsigned long) io_base_hi << 16); 42662306a36Sopenharmony_ci limit |= ((unsigned long) io_limit_hi << 16); 42762306a36Sopenharmony_ci } 42862306a36Sopenharmony_ci 42962306a36Sopenharmony_ci if (base <= limit) { 43062306a36Sopenharmony_ci res->flags = (io_base_lo & PCI_IO_RANGE_TYPE_MASK) | IORESOURCE_IO; 43162306a36Sopenharmony_ci region.start = base; 43262306a36Sopenharmony_ci region.end = limit + io_granularity - 1; 43362306a36Sopenharmony_ci pcibios_bus_to_resource(dev->bus, res, ®ion); 43462306a36Sopenharmony_ci pci_info(dev, " bridge window %pR\n", res); 43562306a36Sopenharmony_ci } 43662306a36Sopenharmony_ci} 43762306a36Sopenharmony_ci 43862306a36Sopenharmony_cistatic void pci_read_bridge_mmio(struct pci_bus *child) 43962306a36Sopenharmony_ci{ 44062306a36Sopenharmony_ci struct pci_dev *dev = child->self; 44162306a36Sopenharmony_ci u16 mem_base_lo, mem_limit_lo; 44262306a36Sopenharmony_ci unsigned long base, limit; 44362306a36Sopenharmony_ci struct pci_bus_region region; 44462306a36Sopenharmony_ci struct resource *res; 44562306a36Sopenharmony_ci 44662306a36Sopenharmony_ci res = child->resource[1]; 44762306a36Sopenharmony_ci pci_read_config_word(dev, PCI_MEMORY_BASE, &mem_base_lo); 44862306a36Sopenharmony_ci pci_read_config_word(dev, PCI_MEMORY_LIMIT, &mem_limit_lo); 44962306a36Sopenharmony_ci base = ((unsigned long) mem_base_lo & PCI_MEMORY_RANGE_MASK) << 16; 45062306a36Sopenharmony_ci limit = ((unsigned long) mem_limit_lo & PCI_MEMORY_RANGE_MASK) << 16; 45162306a36Sopenharmony_ci if (base <= limit) { 45262306a36Sopenharmony_ci res->flags = (mem_base_lo & PCI_MEMORY_RANGE_TYPE_MASK) | IORESOURCE_MEM; 45362306a36Sopenharmony_ci region.start = base; 45462306a36Sopenharmony_ci region.end = limit + 0xfffff; 45562306a36Sopenharmony_ci pcibios_bus_to_resource(dev->bus, res, ®ion); 45662306a36Sopenharmony_ci pci_info(dev, " bridge window %pR\n", res); 45762306a36Sopenharmony_ci } 45862306a36Sopenharmony_ci} 45962306a36Sopenharmony_ci 46062306a36Sopenharmony_cistatic void pci_read_bridge_mmio_pref(struct pci_bus *child) 46162306a36Sopenharmony_ci{ 46262306a36Sopenharmony_ci struct pci_dev *dev = child->self; 46362306a36Sopenharmony_ci u16 mem_base_lo, mem_limit_lo; 46462306a36Sopenharmony_ci u64 base64, limit64; 46562306a36Sopenharmony_ci pci_bus_addr_t base, limit; 46662306a36Sopenharmony_ci struct pci_bus_region region; 46762306a36Sopenharmony_ci struct resource *res; 46862306a36Sopenharmony_ci 46962306a36Sopenharmony_ci res = child->resource[2]; 47062306a36Sopenharmony_ci pci_read_config_word(dev, PCI_PREF_MEMORY_BASE, &mem_base_lo); 47162306a36Sopenharmony_ci pci_read_config_word(dev, PCI_PREF_MEMORY_LIMIT, &mem_limit_lo); 47262306a36Sopenharmony_ci base64 = (mem_base_lo & PCI_PREF_RANGE_MASK) << 16; 47362306a36Sopenharmony_ci limit64 = (mem_limit_lo & PCI_PREF_RANGE_MASK) << 16; 47462306a36Sopenharmony_ci 47562306a36Sopenharmony_ci if ((mem_base_lo & PCI_PREF_RANGE_TYPE_MASK) == PCI_PREF_RANGE_TYPE_64) { 47662306a36Sopenharmony_ci u32 mem_base_hi, mem_limit_hi; 47762306a36Sopenharmony_ci 47862306a36Sopenharmony_ci pci_read_config_dword(dev, PCI_PREF_BASE_UPPER32, &mem_base_hi); 47962306a36Sopenharmony_ci pci_read_config_dword(dev, PCI_PREF_LIMIT_UPPER32, &mem_limit_hi); 48062306a36Sopenharmony_ci 48162306a36Sopenharmony_ci /* 48262306a36Sopenharmony_ci * Some bridges set the base > limit by default, and some 48362306a36Sopenharmony_ci * (broken) BIOSes do not initialize them. If we find 48462306a36Sopenharmony_ci * this, just assume they are not being used. 48562306a36Sopenharmony_ci */ 48662306a36Sopenharmony_ci if (mem_base_hi <= mem_limit_hi) { 48762306a36Sopenharmony_ci base64 |= (u64) mem_base_hi << 32; 48862306a36Sopenharmony_ci limit64 |= (u64) mem_limit_hi << 32; 48962306a36Sopenharmony_ci } 49062306a36Sopenharmony_ci } 49162306a36Sopenharmony_ci 49262306a36Sopenharmony_ci base = (pci_bus_addr_t) base64; 49362306a36Sopenharmony_ci limit = (pci_bus_addr_t) limit64; 49462306a36Sopenharmony_ci 49562306a36Sopenharmony_ci if (base != base64) { 49662306a36Sopenharmony_ci pci_err(dev, "can't handle bridge window above 4GB (bus address %#010llx)\n", 49762306a36Sopenharmony_ci (unsigned long long) base64); 49862306a36Sopenharmony_ci return; 49962306a36Sopenharmony_ci } 50062306a36Sopenharmony_ci 50162306a36Sopenharmony_ci if (base <= limit) { 50262306a36Sopenharmony_ci res->flags = (mem_base_lo & PCI_PREF_RANGE_TYPE_MASK) | 50362306a36Sopenharmony_ci IORESOURCE_MEM | IORESOURCE_PREFETCH; 50462306a36Sopenharmony_ci if (res->flags & PCI_PREF_RANGE_TYPE_64) 50562306a36Sopenharmony_ci res->flags |= IORESOURCE_MEM_64; 50662306a36Sopenharmony_ci region.start = base; 50762306a36Sopenharmony_ci region.end = limit + 0xfffff; 50862306a36Sopenharmony_ci pcibios_bus_to_resource(dev->bus, res, ®ion); 50962306a36Sopenharmony_ci pci_info(dev, " bridge window %pR\n", res); 51062306a36Sopenharmony_ci } 51162306a36Sopenharmony_ci} 51262306a36Sopenharmony_ci 51362306a36Sopenharmony_civoid pci_read_bridge_bases(struct pci_bus *child) 51462306a36Sopenharmony_ci{ 51562306a36Sopenharmony_ci struct pci_dev *dev = child->self; 51662306a36Sopenharmony_ci struct resource *res; 51762306a36Sopenharmony_ci int i; 51862306a36Sopenharmony_ci 51962306a36Sopenharmony_ci if (pci_is_root_bus(child)) /* It's a host bus, nothing to read */ 52062306a36Sopenharmony_ci return; 52162306a36Sopenharmony_ci 52262306a36Sopenharmony_ci pci_info(dev, "PCI bridge to %pR%s\n", 52362306a36Sopenharmony_ci &child->busn_res, 52462306a36Sopenharmony_ci dev->transparent ? " (subtractive decode)" : ""); 52562306a36Sopenharmony_ci 52662306a36Sopenharmony_ci pci_bus_remove_resources(child); 52762306a36Sopenharmony_ci for (i = 0; i < PCI_BRIDGE_RESOURCE_NUM; i++) 52862306a36Sopenharmony_ci child->resource[i] = &dev->resource[PCI_BRIDGE_RESOURCES+i]; 52962306a36Sopenharmony_ci 53062306a36Sopenharmony_ci pci_read_bridge_io(child); 53162306a36Sopenharmony_ci pci_read_bridge_mmio(child); 53262306a36Sopenharmony_ci pci_read_bridge_mmio_pref(child); 53362306a36Sopenharmony_ci 53462306a36Sopenharmony_ci if (dev->transparent) { 53562306a36Sopenharmony_ci pci_bus_for_each_resource(child->parent, res) { 53662306a36Sopenharmony_ci if (res && res->flags) { 53762306a36Sopenharmony_ci pci_bus_add_resource(child, res, 53862306a36Sopenharmony_ci PCI_SUBTRACTIVE_DECODE); 53962306a36Sopenharmony_ci pci_info(dev, " bridge window %pR (subtractive decode)\n", 54062306a36Sopenharmony_ci res); 54162306a36Sopenharmony_ci } 54262306a36Sopenharmony_ci } 54362306a36Sopenharmony_ci } 54462306a36Sopenharmony_ci} 54562306a36Sopenharmony_ci 54662306a36Sopenharmony_cistatic struct pci_bus *pci_alloc_bus(struct pci_bus *parent) 54762306a36Sopenharmony_ci{ 54862306a36Sopenharmony_ci struct pci_bus *b; 54962306a36Sopenharmony_ci 55062306a36Sopenharmony_ci b = kzalloc(sizeof(*b), GFP_KERNEL); 55162306a36Sopenharmony_ci if (!b) 55262306a36Sopenharmony_ci return NULL; 55362306a36Sopenharmony_ci 55462306a36Sopenharmony_ci INIT_LIST_HEAD(&b->node); 55562306a36Sopenharmony_ci INIT_LIST_HEAD(&b->children); 55662306a36Sopenharmony_ci INIT_LIST_HEAD(&b->devices); 55762306a36Sopenharmony_ci INIT_LIST_HEAD(&b->slots); 55862306a36Sopenharmony_ci INIT_LIST_HEAD(&b->resources); 55962306a36Sopenharmony_ci b->max_bus_speed = PCI_SPEED_UNKNOWN; 56062306a36Sopenharmony_ci b->cur_bus_speed = PCI_SPEED_UNKNOWN; 56162306a36Sopenharmony_ci#ifdef CONFIG_PCI_DOMAINS_GENERIC 56262306a36Sopenharmony_ci if (parent) 56362306a36Sopenharmony_ci b->domain_nr = parent->domain_nr; 56462306a36Sopenharmony_ci#endif 56562306a36Sopenharmony_ci return b; 56662306a36Sopenharmony_ci} 56762306a36Sopenharmony_ci 56862306a36Sopenharmony_cistatic void pci_release_host_bridge_dev(struct device *dev) 56962306a36Sopenharmony_ci{ 57062306a36Sopenharmony_ci struct pci_host_bridge *bridge = to_pci_host_bridge(dev); 57162306a36Sopenharmony_ci 57262306a36Sopenharmony_ci if (bridge->release_fn) 57362306a36Sopenharmony_ci bridge->release_fn(bridge); 57462306a36Sopenharmony_ci 57562306a36Sopenharmony_ci pci_free_resource_list(&bridge->windows); 57662306a36Sopenharmony_ci pci_free_resource_list(&bridge->dma_ranges); 57762306a36Sopenharmony_ci kfree(bridge); 57862306a36Sopenharmony_ci} 57962306a36Sopenharmony_ci 58062306a36Sopenharmony_cistatic void pci_init_host_bridge(struct pci_host_bridge *bridge) 58162306a36Sopenharmony_ci{ 58262306a36Sopenharmony_ci INIT_LIST_HEAD(&bridge->windows); 58362306a36Sopenharmony_ci INIT_LIST_HEAD(&bridge->dma_ranges); 58462306a36Sopenharmony_ci 58562306a36Sopenharmony_ci /* 58662306a36Sopenharmony_ci * We assume we can manage these PCIe features. Some systems may 58762306a36Sopenharmony_ci * reserve these for use by the platform itself, e.g., an ACPI BIOS 58862306a36Sopenharmony_ci * may implement its own AER handling and use _OSC to prevent the 58962306a36Sopenharmony_ci * OS from interfering. 59062306a36Sopenharmony_ci */ 59162306a36Sopenharmony_ci bridge->native_aer = 1; 59262306a36Sopenharmony_ci bridge->native_pcie_hotplug = 1; 59362306a36Sopenharmony_ci bridge->native_shpc_hotplug = 1; 59462306a36Sopenharmony_ci bridge->native_pme = 1; 59562306a36Sopenharmony_ci bridge->native_ltr = 1; 59662306a36Sopenharmony_ci bridge->native_dpc = 1; 59762306a36Sopenharmony_ci bridge->domain_nr = PCI_DOMAIN_NR_NOT_SET; 59862306a36Sopenharmony_ci bridge->native_cxl_error = 1; 59962306a36Sopenharmony_ci 60062306a36Sopenharmony_ci device_initialize(&bridge->dev); 60162306a36Sopenharmony_ci} 60262306a36Sopenharmony_ci 60362306a36Sopenharmony_cistruct pci_host_bridge *pci_alloc_host_bridge(size_t priv) 60462306a36Sopenharmony_ci{ 60562306a36Sopenharmony_ci struct pci_host_bridge *bridge; 60662306a36Sopenharmony_ci 60762306a36Sopenharmony_ci bridge = kzalloc(sizeof(*bridge) + priv, GFP_KERNEL); 60862306a36Sopenharmony_ci if (!bridge) 60962306a36Sopenharmony_ci return NULL; 61062306a36Sopenharmony_ci 61162306a36Sopenharmony_ci pci_init_host_bridge(bridge); 61262306a36Sopenharmony_ci bridge->dev.release = pci_release_host_bridge_dev; 61362306a36Sopenharmony_ci 61462306a36Sopenharmony_ci return bridge; 61562306a36Sopenharmony_ci} 61662306a36Sopenharmony_ciEXPORT_SYMBOL(pci_alloc_host_bridge); 61762306a36Sopenharmony_ci 61862306a36Sopenharmony_cistatic void devm_pci_alloc_host_bridge_release(void *data) 61962306a36Sopenharmony_ci{ 62062306a36Sopenharmony_ci pci_free_host_bridge(data); 62162306a36Sopenharmony_ci} 62262306a36Sopenharmony_ci 62362306a36Sopenharmony_cistruct pci_host_bridge *devm_pci_alloc_host_bridge(struct device *dev, 62462306a36Sopenharmony_ci size_t priv) 62562306a36Sopenharmony_ci{ 62662306a36Sopenharmony_ci int ret; 62762306a36Sopenharmony_ci struct pci_host_bridge *bridge; 62862306a36Sopenharmony_ci 62962306a36Sopenharmony_ci bridge = pci_alloc_host_bridge(priv); 63062306a36Sopenharmony_ci if (!bridge) 63162306a36Sopenharmony_ci return NULL; 63262306a36Sopenharmony_ci 63362306a36Sopenharmony_ci bridge->dev.parent = dev; 63462306a36Sopenharmony_ci 63562306a36Sopenharmony_ci ret = devm_add_action_or_reset(dev, devm_pci_alloc_host_bridge_release, 63662306a36Sopenharmony_ci bridge); 63762306a36Sopenharmony_ci if (ret) 63862306a36Sopenharmony_ci return NULL; 63962306a36Sopenharmony_ci 64062306a36Sopenharmony_ci ret = devm_of_pci_bridge_init(dev, bridge); 64162306a36Sopenharmony_ci if (ret) 64262306a36Sopenharmony_ci return NULL; 64362306a36Sopenharmony_ci 64462306a36Sopenharmony_ci return bridge; 64562306a36Sopenharmony_ci} 64662306a36Sopenharmony_ciEXPORT_SYMBOL(devm_pci_alloc_host_bridge); 64762306a36Sopenharmony_ci 64862306a36Sopenharmony_civoid pci_free_host_bridge(struct pci_host_bridge *bridge) 64962306a36Sopenharmony_ci{ 65062306a36Sopenharmony_ci put_device(&bridge->dev); 65162306a36Sopenharmony_ci} 65262306a36Sopenharmony_ciEXPORT_SYMBOL(pci_free_host_bridge); 65362306a36Sopenharmony_ci 65462306a36Sopenharmony_ci/* Indexed by PCI_X_SSTATUS_FREQ (secondary bus mode and frequency) */ 65562306a36Sopenharmony_cistatic const unsigned char pcix_bus_speed[] = { 65662306a36Sopenharmony_ci PCI_SPEED_UNKNOWN, /* 0 */ 65762306a36Sopenharmony_ci PCI_SPEED_66MHz_PCIX, /* 1 */ 65862306a36Sopenharmony_ci PCI_SPEED_100MHz_PCIX, /* 2 */ 65962306a36Sopenharmony_ci PCI_SPEED_133MHz_PCIX, /* 3 */ 66062306a36Sopenharmony_ci PCI_SPEED_UNKNOWN, /* 4 */ 66162306a36Sopenharmony_ci PCI_SPEED_66MHz_PCIX_ECC, /* 5 */ 66262306a36Sopenharmony_ci PCI_SPEED_100MHz_PCIX_ECC, /* 6 */ 66362306a36Sopenharmony_ci PCI_SPEED_133MHz_PCIX_ECC, /* 7 */ 66462306a36Sopenharmony_ci PCI_SPEED_UNKNOWN, /* 8 */ 66562306a36Sopenharmony_ci PCI_SPEED_66MHz_PCIX_266, /* 9 */ 66662306a36Sopenharmony_ci PCI_SPEED_100MHz_PCIX_266, /* A */ 66762306a36Sopenharmony_ci PCI_SPEED_133MHz_PCIX_266, /* B */ 66862306a36Sopenharmony_ci PCI_SPEED_UNKNOWN, /* C */ 66962306a36Sopenharmony_ci PCI_SPEED_66MHz_PCIX_533, /* D */ 67062306a36Sopenharmony_ci PCI_SPEED_100MHz_PCIX_533, /* E */ 67162306a36Sopenharmony_ci PCI_SPEED_133MHz_PCIX_533 /* F */ 67262306a36Sopenharmony_ci}; 67362306a36Sopenharmony_ci 67462306a36Sopenharmony_ci/* Indexed by PCI_EXP_LNKCAP_SLS, PCI_EXP_LNKSTA_CLS */ 67562306a36Sopenharmony_ciconst unsigned char pcie_link_speed[] = { 67662306a36Sopenharmony_ci PCI_SPEED_UNKNOWN, /* 0 */ 67762306a36Sopenharmony_ci PCIE_SPEED_2_5GT, /* 1 */ 67862306a36Sopenharmony_ci PCIE_SPEED_5_0GT, /* 2 */ 67962306a36Sopenharmony_ci PCIE_SPEED_8_0GT, /* 3 */ 68062306a36Sopenharmony_ci PCIE_SPEED_16_0GT, /* 4 */ 68162306a36Sopenharmony_ci PCIE_SPEED_32_0GT, /* 5 */ 68262306a36Sopenharmony_ci PCIE_SPEED_64_0GT, /* 6 */ 68362306a36Sopenharmony_ci PCI_SPEED_UNKNOWN, /* 7 */ 68462306a36Sopenharmony_ci PCI_SPEED_UNKNOWN, /* 8 */ 68562306a36Sopenharmony_ci PCI_SPEED_UNKNOWN, /* 9 */ 68662306a36Sopenharmony_ci PCI_SPEED_UNKNOWN, /* A */ 68762306a36Sopenharmony_ci PCI_SPEED_UNKNOWN, /* B */ 68862306a36Sopenharmony_ci PCI_SPEED_UNKNOWN, /* C */ 68962306a36Sopenharmony_ci PCI_SPEED_UNKNOWN, /* D */ 69062306a36Sopenharmony_ci PCI_SPEED_UNKNOWN, /* E */ 69162306a36Sopenharmony_ci PCI_SPEED_UNKNOWN /* F */ 69262306a36Sopenharmony_ci}; 69362306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(pcie_link_speed); 69462306a36Sopenharmony_ci 69562306a36Sopenharmony_ciconst char *pci_speed_string(enum pci_bus_speed speed) 69662306a36Sopenharmony_ci{ 69762306a36Sopenharmony_ci /* Indexed by the pci_bus_speed enum */ 69862306a36Sopenharmony_ci static const char *speed_strings[] = { 69962306a36Sopenharmony_ci "33 MHz PCI", /* 0x00 */ 70062306a36Sopenharmony_ci "66 MHz PCI", /* 0x01 */ 70162306a36Sopenharmony_ci "66 MHz PCI-X", /* 0x02 */ 70262306a36Sopenharmony_ci "100 MHz PCI-X", /* 0x03 */ 70362306a36Sopenharmony_ci "133 MHz PCI-X", /* 0x04 */ 70462306a36Sopenharmony_ci NULL, /* 0x05 */ 70562306a36Sopenharmony_ci NULL, /* 0x06 */ 70662306a36Sopenharmony_ci NULL, /* 0x07 */ 70762306a36Sopenharmony_ci NULL, /* 0x08 */ 70862306a36Sopenharmony_ci "66 MHz PCI-X 266", /* 0x09 */ 70962306a36Sopenharmony_ci "100 MHz PCI-X 266", /* 0x0a */ 71062306a36Sopenharmony_ci "133 MHz PCI-X 266", /* 0x0b */ 71162306a36Sopenharmony_ci "Unknown AGP", /* 0x0c */ 71262306a36Sopenharmony_ci "1x AGP", /* 0x0d */ 71362306a36Sopenharmony_ci "2x AGP", /* 0x0e */ 71462306a36Sopenharmony_ci "4x AGP", /* 0x0f */ 71562306a36Sopenharmony_ci "8x AGP", /* 0x10 */ 71662306a36Sopenharmony_ci "66 MHz PCI-X 533", /* 0x11 */ 71762306a36Sopenharmony_ci "100 MHz PCI-X 533", /* 0x12 */ 71862306a36Sopenharmony_ci "133 MHz PCI-X 533", /* 0x13 */ 71962306a36Sopenharmony_ci "2.5 GT/s PCIe", /* 0x14 */ 72062306a36Sopenharmony_ci "5.0 GT/s PCIe", /* 0x15 */ 72162306a36Sopenharmony_ci "8.0 GT/s PCIe", /* 0x16 */ 72262306a36Sopenharmony_ci "16.0 GT/s PCIe", /* 0x17 */ 72362306a36Sopenharmony_ci "32.0 GT/s PCIe", /* 0x18 */ 72462306a36Sopenharmony_ci "64.0 GT/s PCIe", /* 0x19 */ 72562306a36Sopenharmony_ci }; 72662306a36Sopenharmony_ci 72762306a36Sopenharmony_ci if (speed < ARRAY_SIZE(speed_strings)) 72862306a36Sopenharmony_ci return speed_strings[speed]; 72962306a36Sopenharmony_ci return "Unknown"; 73062306a36Sopenharmony_ci} 73162306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(pci_speed_string); 73262306a36Sopenharmony_ci 73362306a36Sopenharmony_civoid pcie_update_link_speed(struct pci_bus *bus, u16 linksta) 73462306a36Sopenharmony_ci{ 73562306a36Sopenharmony_ci bus->cur_bus_speed = pcie_link_speed[linksta & PCI_EXP_LNKSTA_CLS]; 73662306a36Sopenharmony_ci} 73762306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(pcie_update_link_speed); 73862306a36Sopenharmony_ci 73962306a36Sopenharmony_cistatic unsigned char agp_speeds[] = { 74062306a36Sopenharmony_ci AGP_UNKNOWN, 74162306a36Sopenharmony_ci AGP_1X, 74262306a36Sopenharmony_ci AGP_2X, 74362306a36Sopenharmony_ci AGP_4X, 74462306a36Sopenharmony_ci AGP_8X 74562306a36Sopenharmony_ci}; 74662306a36Sopenharmony_ci 74762306a36Sopenharmony_cistatic enum pci_bus_speed agp_speed(int agp3, int agpstat) 74862306a36Sopenharmony_ci{ 74962306a36Sopenharmony_ci int index = 0; 75062306a36Sopenharmony_ci 75162306a36Sopenharmony_ci if (agpstat & 4) 75262306a36Sopenharmony_ci index = 3; 75362306a36Sopenharmony_ci else if (agpstat & 2) 75462306a36Sopenharmony_ci index = 2; 75562306a36Sopenharmony_ci else if (agpstat & 1) 75662306a36Sopenharmony_ci index = 1; 75762306a36Sopenharmony_ci else 75862306a36Sopenharmony_ci goto out; 75962306a36Sopenharmony_ci 76062306a36Sopenharmony_ci if (agp3) { 76162306a36Sopenharmony_ci index += 2; 76262306a36Sopenharmony_ci if (index == 5) 76362306a36Sopenharmony_ci index = 0; 76462306a36Sopenharmony_ci } 76562306a36Sopenharmony_ci 76662306a36Sopenharmony_ci out: 76762306a36Sopenharmony_ci return agp_speeds[index]; 76862306a36Sopenharmony_ci} 76962306a36Sopenharmony_ci 77062306a36Sopenharmony_cistatic void pci_set_bus_speed(struct pci_bus *bus) 77162306a36Sopenharmony_ci{ 77262306a36Sopenharmony_ci struct pci_dev *bridge = bus->self; 77362306a36Sopenharmony_ci int pos; 77462306a36Sopenharmony_ci 77562306a36Sopenharmony_ci pos = pci_find_capability(bridge, PCI_CAP_ID_AGP); 77662306a36Sopenharmony_ci if (!pos) 77762306a36Sopenharmony_ci pos = pci_find_capability(bridge, PCI_CAP_ID_AGP3); 77862306a36Sopenharmony_ci if (pos) { 77962306a36Sopenharmony_ci u32 agpstat, agpcmd; 78062306a36Sopenharmony_ci 78162306a36Sopenharmony_ci pci_read_config_dword(bridge, pos + PCI_AGP_STATUS, &agpstat); 78262306a36Sopenharmony_ci bus->max_bus_speed = agp_speed(agpstat & 8, agpstat & 7); 78362306a36Sopenharmony_ci 78462306a36Sopenharmony_ci pci_read_config_dword(bridge, pos + PCI_AGP_COMMAND, &agpcmd); 78562306a36Sopenharmony_ci bus->cur_bus_speed = agp_speed(agpstat & 8, agpcmd & 7); 78662306a36Sopenharmony_ci } 78762306a36Sopenharmony_ci 78862306a36Sopenharmony_ci pos = pci_find_capability(bridge, PCI_CAP_ID_PCIX); 78962306a36Sopenharmony_ci if (pos) { 79062306a36Sopenharmony_ci u16 status; 79162306a36Sopenharmony_ci enum pci_bus_speed max; 79262306a36Sopenharmony_ci 79362306a36Sopenharmony_ci pci_read_config_word(bridge, pos + PCI_X_BRIDGE_SSTATUS, 79462306a36Sopenharmony_ci &status); 79562306a36Sopenharmony_ci 79662306a36Sopenharmony_ci if (status & PCI_X_SSTATUS_533MHZ) { 79762306a36Sopenharmony_ci max = PCI_SPEED_133MHz_PCIX_533; 79862306a36Sopenharmony_ci } else if (status & PCI_X_SSTATUS_266MHZ) { 79962306a36Sopenharmony_ci max = PCI_SPEED_133MHz_PCIX_266; 80062306a36Sopenharmony_ci } else if (status & PCI_X_SSTATUS_133MHZ) { 80162306a36Sopenharmony_ci if ((status & PCI_X_SSTATUS_VERS) == PCI_X_SSTATUS_V2) 80262306a36Sopenharmony_ci max = PCI_SPEED_133MHz_PCIX_ECC; 80362306a36Sopenharmony_ci else 80462306a36Sopenharmony_ci max = PCI_SPEED_133MHz_PCIX; 80562306a36Sopenharmony_ci } else { 80662306a36Sopenharmony_ci max = PCI_SPEED_66MHz_PCIX; 80762306a36Sopenharmony_ci } 80862306a36Sopenharmony_ci 80962306a36Sopenharmony_ci bus->max_bus_speed = max; 81062306a36Sopenharmony_ci bus->cur_bus_speed = pcix_bus_speed[ 81162306a36Sopenharmony_ci (status & PCI_X_SSTATUS_FREQ) >> 6]; 81262306a36Sopenharmony_ci 81362306a36Sopenharmony_ci return; 81462306a36Sopenharmony_ci } 81562306a36Sopenharmony_ci 81662306a36Sopenharmony_ci if (pci_is_pcie(bridge)) { 81762306a36Sopenharmony_ci u32 linkcap; 81862306a36Sopenharmony_ci u16 linksta; 81962306a36Sopenharmony_ci 82062306a36Sopenharmony_ci pcie_capability_read_dword(bridge, PCI_EXP_LNKCAP, &linkcap); 82162306a36Sopenharmony_ci bus->max_bus_speed = pcie_link_speed[linkcap & PCI_EXP_LNKCAP_SLS]; 82262306a36Sopenharmony_ci 82362306a36Sopenharmony_ci pcie_capability_read_word(bridge, PCI_EXP_LNKSTA, &linksta); 82462306a36Sopenharmony_ci pcie_update_link_speed(bus, linksta); 82562306a36Sopenharmony_ci } 82662306a36Sopenharmony_ci} 82762306a36Sopenharmony_ci 82862306a36Sopenharmony_cistatic struct irq_domain *pci_host_bridge_msi_domain(struct pci_bus *bus) 82962306a36Sopenharmony_ci{ 83062306a36Sopenharmony_ci struct irq_domain *d; 83162306a36Sopenharmony_ci 83262306a36Sopenharmony_ci /* If the host bridge driver sets a MSI domain of the bridge, use it */ 83362306a36Sopenharmony_ci d = dev_get_msi_domain(bus->bridge); 83462306a36Sopenharmony_ci 83562306a36Sopenharmony_ci /* 83662306a36Sopenharmony_ci * Any firmware interface that can resolve the msi_domain 83762306a36Sopenharmony_ci * should be called from here. 83862306a36Sopenharmony_ci */ 83962306a36Sopenharmony_ci if (!d) 84062306a36Sopenharmony_ci d = pci_host_bridge_of_msi_domain(bus); 84162306a36Sopenharmony_ci if (!d) 84262306a36Sopenharmony_ci d = pci_host_bridge_acpi_msi_domain(bus); 84362306a36Sopenharmony_ci 84462306a36Sopenharmony_ci /* 84562306a36Sopenharmony_ci * If no IRQ domain was found via the OF tree, try looking it up 84662306a36Sopenharmony_ci * directly through the fwnode_handle. 84762306a36Sopenharmony_ci */ 84862306a36Sopenharmony_ci if (!d) { 84962306a36Sopenharmony_ci struct fwnode_handle *fwnode = pci_root_bus_fwnode(bus); 85062306a36Sopenharmony_ci 85162306a36Sopenharmony_ci if (fwnode) 85262306a36Sopenharmony_ci d = irq_find_matching_fwnode(fwnode, 85362306a36Sopenharmony_ci DOMAIN_BUS_PCI_MSI); 85462306a36Sopenharmony_ci } 85562306a36Sopenharmony_ci 85662306a36Sopenharmony_ci return d; 85762306a36Sopenharmony_ci} 85862306a36Sopenharmony_ci 85962306a36Sopenharmony_cistatic void pci_set_bus_msi_domain(struct pci_bus *bus) 86062306a36Sopenharmony_ci{ 86162306a36Sopenharmony_ci struct irq_domain *d; 86262306a36Sopenharmony_ci struct pci_bus *b; 86362306a36Sopenharmony_ci 86462306a36Sopenharmony_ci /* 86562306a36Sopenharmony_ci * The bus can be a root bus, a subordinate bus, or a virtual bus 86662306a36Sopenharmony_ci * created by an SR-IOV device. Walk up to the first bridge device 86762306a36Sopenharmony_ci * found or derive the domain from the host bridge. 86862306a36Sopenharmony_ci */ 86962306a36Sopenharmony_ci for (b = bus, d = NULL; !d && !pci_is_root_bus(b); b = b->parent) { 87062306a36Sopenharmony_ci if (b->self) 87162306a36Sopenharmony_ci d = dev_get_msi_domain(&b->self->dev); 87262306a36Sopenharmony_ci } 87362306a36Sopenharmony_ci 87462306a36Sopenharmony_ci if (!d) 87562306a36Sopenharmony_ci d = pci_host_bridge_msi_domain(b); 87662306a36Sopenharmony_ci 87762306a36Sopenharmony_ci dev_set_msi_domain(&bus->dev, d); 87862306a36Sopenharmony_ci} 87962306a36Sopenharmony_ci 88062306a36Sopenharmony_cistatic int pci_register_host_bridge(struct pci_host_bridge *bridge) 88162306a36Sopenharmony_ci{ 88262306a36Sopenharmony_ci struct device *parent = bridge->dev.parent; 88362306a36Sopenharmony_ci struct resource_entry *window, *next, *n; 88462306a36Sopenharmony_ci struct pci_bus *bus, *b; 88562306a36Sopenharmony_ci resource_size_t offset, next_offset; 88662306a36Sopenharmony_ci LIST_HEAD(resources); 88762306a36Sopenharmony_ci struct resource *res, *next_res; 88862306a36Sopenharmony_ci char addr[64], *fmt; 88962306a36Sopenharmony_ci const char *name; 89062306a36Sopenharmony_ci int err; 89162306a36Sopenharmony_ci 89262306a36Sopenharmony_ci bus = pci_alloc_bus(NULL); 89362306a36Sopenharmony_ci if (!bus) 89462306a36Sopenharmony_ci return -ENOMEM; 89562306a36Sopenharmony_ci 89662306a36Sopenharmony_ci bridge->bus = bus; 89762306a36Sopenharmony_ci 89862306a36Sopenharmony_ci bus->sysdata = bridge->sysdata; 89962306a36Sopenharmony_ci bus->ops = bridge->ops; 90062306a36Sopenharmony_ci bus->number = bus->busn_res.start = bridge->busnr; 90162306a36Sopenharmony_ci#ifdef CONFIG_PCI_DOMAINS_GENERIC 90262306a36Sopenharmony_ci if (bridge->domain_nr == PCI_DOMAIN_NR_NOT_SET) 90362306a36Sopenharmony_ci bus->domain_nr = pci_bus_find_domain_nr(bus, parent); 90462306a36Sopenharmony_ci else 90562306a36Sopenharmony_ci bus->domain_nr = bridge->domain_nr; 90662306a36Sopenharmony_ci if (bus->domain_nr < 0) { 90762306a36Sopenharmony_ci err = bus->domain_nr; 90862306a36Sopenharmony_ci goto free; 90962306a36Sopenharmony_ci } 91062306a36Sopenharmony_ci#endif 91162306a36Sopenharmony_ci 91262306a36Sopenharmony_ci b = pci_find_bus(pci_domain_nr(bus), bridge->busnr); 91362306a36Sopenharmony_ci if (b) { 91462306a36Sopenharmony_ci /* Ignore it if we already got here via a different bridge */ 91562306a36Sopenharmony_ci dev_dbg(&b->dev, "bus already known\n"); 91662306a36Sopenharmony_ci err = -EEXIST; 91762306a36Sopenharmony_ci goto free; 91862306a36Sopenharmony_ci } 91962306a36Sopenharmony_ci 92062306a36Sopenharmony_ci dev_set_name(&bridge->dev, "pci%04x:%02x", pci_domain_nr(bus), 92162306a36Sopenharmony_ci bridge->busnr); 92262306a36Sopenharmony_ci 92362306a36Sopenharmony_ci err = pcibios_root_bridge_prepare(bridge); 92462306a36Sopenharmony_ci if (err) 92562306a36Sopenharmony_ci goto free; 92662306a36Sopenharmony_ci 92762306a36Sopenharmony_ci /* Temporarily move resources off the list */ 92862306a36Sopenharmony_ci list_splice_init(&bridge->windows, &resources); 92962306a36Sopenharmony_ci err = device_add(&bridge->dev); 93062306a36Sopenharmony_ci if (err) { 93162306a36Sopenharmony_ci put_device(&bridge->dev); 93262306a36Sopenharmony_ci goto free; 93362306a36Sopenharmony_ci } 93462306a36Sopenharmony_ci bus->bridge = get_device(&bridge->dev); 93562306a36Sopenharmony_ci device_enable_async_suspend(bus->bridge); 93662306a36Sopenharmony_ci pci_set_bus_of_node(bus); 93762306a36Sopenharmony_ci pci_set_bus_msi_domain(bus); 93862306a36Sopenharmony_ci if (bridge->msi_domain && !dev_get_msi_domain(&bus->dev) && 93962306a36Sopenharmony_ci !pci_host_of_has_msi_map(parent)) 94062306a36Sopenharmony_ci bus->bus_flags |= PCI_BUS_FLAGS_NO_MSI; 94162306a36Sopenharmony_ci 94262306a36Sopenharmony_ci if (!parent) 94362306a36Sopenharmony_ci set_dev_node(bus->bridge, pcibus_to_node(bus)); 94462306a36Sopenharmony_ci 94562306a36Sopenharmony_ci bus->dev.class = &pcibus_class; 94662306a36Sopenharmony_ci bus->dev.parent = bus->bridge; 94762306a36Sopenharmony_ci 94862306a36Sopenharmony_ci dev_set_name(&bus->dev, "%04x:%02x", pci_domain_nr(bus), bus->number); 94962306a36Sopenharmony_ci name = dev_name(&bus->dev); 95062306a36Sopenharmony_ci 95162306a36Sopenharmony_ci err = device_register(&bus->dev); 95262306a36Sopenharmony_ci if (err) 95362306a36Sopenharmony_ci goto unregister; 95462306a36Sopenharmony_ci 95562306a36Sopenharmony_ci pcibios_add_bus(bus); 95662306a36Sopenharmony_ci 95762306a36Sopenharmony_ci if (bus->ops->add_bus) { 95862306a36Sopenharmony_ci err = bus->ops->add_bus(bus); 95962306a36Sopenharmony_ci if (WARN_ON(err < 0)) 96062306a36Sopenharmony_ci dev_err(&bus->dev, "failed to add bus: %d\n", err); 96162306a36Sopenharmony_ci } 96262306a36Sopenharmony_ci 96362306a36Sopenharmony_ci /* Create legacy_io and legacy_mem files for this bus */ 96462306a36Sopenharmony_ci pci_create_legacy_files(bus); 96562306a36Sopenharmony_ci 96662306a36Sopenharmony_ci if (parent) 96762306a36Sopenharmony_ci dev_info(parent, "PCI host bridge to bus %s\n", name); 96862306a36Sopenharmony_ci else 96962306a36Sopenharmony_ci pr_info("PCI host bridge to bus %s\n", name); 97062306a36Sopenharmony_ci 97162306a36Sopenharmony_ci if (nr_node_ids > 1 && pcibus_to_node(bus) == NUMA_NO_NODE) 97262306a36Sopenharmony_ci dev_warn(&bus->dev, "Unknown NUMA node; performance will be reduced\n"); 97362306a36Sopenharmony_ci 97462306a36Sopenharmony_ci /* Coalesce contiguous windows */ 97562306a36Sopenharmony_ci resource_list_for_each_entry_safe(window, n, &resources) { 97662306a36Sopenharmony_ci if (list_is_last(&window->node, &resources)) 97762306a36Sopenharmony_ci break; 97862306a36Sopenharmony_ci 97962306a36Sopenharmony_ci next = list_next_entry(window, node); 98062306a36Sopenharmony_ci offset = window->offset; 98162306a36Sopenharmony_ci res = window->res; 98262306a36Sopenharmony_ci next_offset = next->offset; 98362306a36Sopenharmony_ci next_res = next->res; 98462306a36Sopenharmony_ci 98562306a36Sopenharmony_ci if (res->flags != next_res->flags || offset != next_offset) 98662306a36Sopenharmony_ci continue; 98762306a36Sopenharmony_ci 98862306a36Sopenharmony_ci if (res->end + 1 == next_res->start) { 98962306a36Sopenharmony_ci next_res->start = res->start; 99062306a36Sopenharmony_ci res->flags = res->start = res->end = 0; 99162306a36Sopenharmony_ci } 99262306a36Sopenharmony_ci } 99362306a36Sopenharmony_ci 99462306a36Sopenharmony_ci /* Add initial resources to the bus */ 99562306a36Sopenharmony_ci resource_list_for_each_entry_safe(window, n, &resources) { 99662306a36Sopenharmony_ci offset = window->offset; 99762306a36Sopenharmony_ci res = window->res; 99862306a36Sopenharmony_ci if (!res->flags && !res->start && !res->end) { 99962306a36Sopenharmony_ci release_resource(res); 100062306a36Sopenharmony_ci resource_list_destroy_entry(window); 100162306a36Sopenharmony_ci continue; 100262306a36Sopenharmony_ci } 100362306a36Sopenharmony_ci 100462306a36Sopenharmony_ci list_move_tail(&window->node, &bridge->windows); 100562306a36Sopenharmony_ci 100662306a36Sopenharmony_ci if (res->flags & IORESOURCE_BUS) 100762306a36Sopenharmony_ci pci_bus_insert_busn_res(bus, bus->number, res->end); 100862306a36Sopenharmony_ci else 100962306a36Sopenharmony_ci pci_bus_add_resource(bus, res, 0); 101062306a36Sopenharmony_ci 101162306a36Sopenharmony_ci if (offset) { 101262306a36Sopenharmony_ci if (resource_type(res) == IORESOURCE_IO) 101362306a36Sopenharmony_ci fmt = " (bus address [%#06llx-%#06llx])"; 101462306a36Sopenharmony_ci else 101562306a36Sopenharmony_ci fmt = " (bus address [%#010llx-%#010llx])"; 101662306a36Sopenharmony_ci 101762306a36Sopenharmony_ci snprintf(addr, sizeof(addr), fmt, 101862306a36Sopenharmony_ci (unsigned long long)(res->start - offset), 101962306a36Sopenharmony_ci (unsigned long long)(res->end - offset)); 102062306a36Sopenharmony_ci } else 102162306a36Sopenharmony_ci addr[0] = '\0'; 102262306a36Sopenharmony_ci 102362306a36Sopenharmony_ci dev_info(&bus->dev, "root bus resource %pR%s\n", res, addr); 102462306a36Sopenharmony_ci } 102562306a36Sopenharmony_ci 102662306a36Sopenharmony_ci down_write(&pci_bus_sem); 102762306a36Sopenharmony_ci list_add_tail(&bus->node, &pci_root_buses); 102862306a36Sopenharmony_ci up_write(&pci_bus_sem); 102962306a36Sopenharmony_ci 103062306a36Sopenharmony_ci return 0; 103162306a36Sopenharmony_ci 103262306a36Sopenharmony_ciunregister: 103362306a36Sopenharmony_ci put_device(&bridge->dev); 103462306a36Sopenharmony_ci device_del(&bridge->dev); 103562306a36Sopenharmony_ci 103662306a36Sopenharmony_cifree: 103762306a36Sopenharmony_ci#ifdef CONFIG_PCI_DOMAINS_GENERIC 103862306a36Sopenharmony_ci pci_bus_release_domain_nr(bus, parent); 103962306a36Sopenharmony_ci#endif 104062306a36Sopenharmony_ci kfree(bus); 104162306a36Sopenharmony_ci return err; 104262306a36Sopenharmony_ci} 104362306a36Sopenharmony_ci 104462306a36Sopenharmony_cistatic bool pci_bridge_child_ext_cfg_accessible(struct pci_dev *bridge) 104562306a36Sopenharmony_ci{ 104662306a36Sopenharmony_ci int pos; 104762306a36Sopenharmony_ci u32 status; 104862306a36Sopenharmony_ci 104962306a36Sopenharmony_ci /* 105062306a36Sopenharmony_ci * If extended config space isn't accessible on a bridge's primary 105162306a36Sopenharmony_ci * bus, we certainly can't access it on the secondary bus. 105262306a36Sopenharmony_ci */ 105362306a36Sopenharmony_ci if (bridge->bus->bus_flags & PCI_BUS_FLAGS_NO_EXTCFG) 105462306a36Sopenharmony_ci return false; 105562306a36Sopenharmony_ci 105662306a36Sopenharmony_ci /* 105762306a36Sopenharmony_ci * PCIe Root Ports and switch ports are PCIe on both sides, so if 105862306a36Sopenharmony_ci * extended config space is accessible on the primary, it's also 105962306a36Sopenharmony_ci * accessible on the secondary. 106062306a36Sopenharmony_ci */ 106162306a36Sopenharmony_ci if (pci_is_pcie(bridge) && 106262306a36Sopenharmony_ci (pci_pcie_type(bridge) == PCI_EXP_TYPE_ROOT_PORT || 106362306a36Sopenharmony_ci pci_pcie_type(bridge) == PCI_EXP_TYPE_UPSTREAM || 106462306a36Sopenharmony_ci pci_pcie_type(bridge) == PCI_EXP_TYPE_DOWNSTREAM)) 106562306a36Sopenharmony_ci return true; 106662306a36Sopenharmony_ci 106762306a36Sopenharmony_ci /* 106862306a36Sopenharmony_ci * For the other bridge types: 106962306a36Sopenharmony_ci * - PCI-to-PCI bridges 107062306a36Sopenharmony_ci * - PCIe-to-PCI/PCI-X forward bridges 107162306a36Sopenharmony_ci * - PCI/PCI-X-to-PCIe reverse bridges 107262306a36Sopenharmony_ci * extended config space on the secondary side is only accessible 107362306a36Sopenharmony_ci * if the bridge supports PCI-X Mode 2. 107462306a36Sopenharmony_ci */ 107562306a36Sopenharmony_ci pos = pci_find_capability(bridge, PCI_CAP_ID_PCIX); 107662306a36Sopenharmony_ci if (!pos) 107762306a36Sopenharmony_ci return false; 107862306a36Sopenharmony_ci 107962306a36Sopenharmony_ci pci_read_config_dword(bridge, pos + PCI_X_STATUS, &status); 108062306a36Sopenharmony_ci return status & (PCI_X_STATUS_266MHZ | PCI_X_STATUS_533MHZ); 108162306a36Sopenharmony_ci} 108262306a36Sopenharmony_ci 108362306a36Sopenharmony_cistatic struct pci_bus *pci_alloc_child_bus(struct pci_bus *parent, 108462306a36Sopenharmony_ci struct pci_dev *bridge, int busnr) 108562306a36Sopenharmony_ci{ 108662306a36Sopenharmony_ci struct pci_bus *child; 108762306a36Sopenharmony_ci struct pci_host_bridge *host; 108862306a36Sopenharmony_ci int i; 108962306a36Sopenharmony_ci int ret; 109062306a36Sopenharmony_ci 109162306a36Sopenharmony_ci /* Allocate a new bus and inherit stuff from the parent */ 109262306a36Sopenharmony_ci child = pci_alloc_bus(parent); 109362306a36Sopenharmony_ci if (!child) 109462306a36Sopenharmony_ci return NULL; 109562306a36Sopenharmony_ci 109662306a36Sopenharmony_ci child->parent = parent; 109762306a36Sopenharmony_ci child->sysdata = parent->sysdata; 109862306a36Sopenharmony_ci child->bus_flags = parent->bus_flags; 109962306a36Sopenharmony_ci 110062306a36Sopenharmony_ci host = pci_find_host_bridge(parent); 110162306a36Sopenharmony_ci if (host->child_ops) 110262306a36Sopenharmony_ci child->ops = host->child_ops; 110362306a36Sopenharmony_ci else 110462306a36Sopenharmony_ci child->ops = parent->ops; 110562306a36Sopenharmony_ci 110662306a36Sopenharmony_ci /* 110762306a36Sopenharmony_ci * Initialize some portions of the bus device, but don't register 110862306a36Sopenharmony_ci * it now as the parent is not properly set up yet. 110962306a36Sopenharmony_ci */ 111062306a36Sopenharmony_ci child->dev.class = &pcibus_class; 111162306a36Sopenharmony_ci dev_set_name(&child->dev, "%04x:%02x", pci_domain_nr(child), busnr); 111262306a36Sopenharmony_ci 111362306a36Sopenharmony_ci /* Set up the primary, secondary and subordinate bus numbers */ 111462306a36Sopenharmony_ci child->number = child->busn_res.start = busnr; 111562306a36Sopenharmony_ci child->primary = parent->busn_res.start; 111662306a36Sopenharmony_ci child->busn_res.end = 0xff; 111762306a36Sopenharmony_ci 111862306a36Sopenharmony_ci if (!bridge) { 111962306a36Sopenharmony_ci child->dev.parent = parent->bridge; 112062306a36Sopenharmony_ci goto add_dev; 112162306a36Sopenharmony_ci } 112262306a36Sopenharmony_ci 112362306a36Sopenharmony_ci child->self = bridge; 112462306a36Sopenharmony_ci child->bridge = get_device(&bridge->dev); 112562306a36Sopenharmony_ci child->dev.parent = child->bridge; 112662306a36Sopenharmony_ci pci_set_bus_of_node(child); 112762306a36Sopenharmony_ci pci_set_bus_speed(child); 112862306a36Sopenharmony_ci 112962306a36Sopenharmony_ci /* 113062306a36Sopenharmony_ci * Check whether extended config space is accessible on the child 113162306a36Sopenharmony_ci * bus. Note that we currently assume it is always accessible on 113262306a36Sopenharmony_ci * the root bus. 113362306a36Sopenharmony_ci */ 113462306a36Sopenharmony_ci if (!pci_bridge_child_ext_cfg_accessible(bridge)) { 113562306a36Sopenharmony_ci child->bus_flags |= PCI_BUS_FLAGS_NO_EXTCFG; 113662306a36Sopenharmony_ci pci_info(child, "extended config space not accessible\n"); 113762306a36Sopenharmony_ci } 113862306a36Sopenharmony_ci 113962306a36Sopenharmony_ci /* Set up default resource pointers and names */ 114062306a36Sopenharmony_ci for (i = 0; i < PCI_BRIDGE_RESOURCE_NUM; i++) { 114162306a36Sopenharmony_ci child->resource[i] = &bridge->resource[PCI_BRIDGE_RESOURCES+i]; 114262306a36Sopenharmony_ci child->resource[i]->name = child->name; 114362306a36Sopenharmony_ci } 114462306a36Sopenharmony_ci bridge->subordinate = child; 114562306a36Sopenharmony_ci 114662306a36Sopenharmony_ciadd_dev: 114762306a36Sopenharmony_ci pci_set_bus_msi_domain(child); 114862306a36Sopenharmony_ci ret = device_register(&child->dev); 114962306a36Sopenharmony_ci WARN_ON(ret < 0); 115062306a36Sopenharmony_ci 115162306a36Sopenharmony_ci pcibios_add_bus(child); 115262306a36Sopenharmony_ci 115362306a36Sopenharmony_ci if (child->ops->add_bus) { 115462306a36Sopenharmony_ci ret = child->ops->add_bus(child); 115562306a36Sopenharmony_ci if (WARN_ON(ret < 0)) 115662306a36Sopenharmony_ci dev_err(&child->dev, "failed to add bus: %d\n", ret); 115762306a36Sopenharmony_ci } 115862306a36Sopenharmony_ci 115962306a36Sopenharmony_ci /* Create legacy_io and legacy_mem files for this bus */ 116062306a36Sopenharmony_ci pci_create_legacy_files(child); 116162306a36Sopenharmony_ci 116262306a36Sopenharmony_ci return child; 116362306a36Sopenharmony_ci} 116462306a36Sopenharmony_ci 116562306a36Sopenharmony_cistruct pci_bus *pci_add_new_bus(struct pci_bus *parent, struct pci_dev *dev, 116662306a36Sopenharmony_ci int busnr) 116762306a36Sopenharmony_ci{ 116862306a36Sopenharmony_ci struct pci_bus *child; 116962306a36Sopenharmony_ci 117062306a36Sopenharmony_ci child = pci_alloc_child_bus(parent, dev, busnr); 117162306a36Sopenharmony_ci if (child) { 117262306a36Sopenharmony_ci down_write(&pci_bus_sem); 117362306a36Sopenharmony_ci list_add_tail(&child->node, &parent->children); 117462306a36Sopenharmony_ci up_write(&pci_bus_sem); 117562306a36Sopenharmony_ci } 117662306a36Sopenharmony_ci return child; 117762306a36Sopenharmony_ci} 117862306a36Sopenharmony_ciEXPORT_SYMBOL(pci_add_new_bus); 117962306a36Sopenharmony_ci 118062306a36Sopenharmony_cistatic void pci_enable_crs(struct pci_dev *pdev) 118162306a36Sopenharmony_ci{ 118262306a36Sopenharmony_ci u16 root_cap = 0; 118362306a36Sopenharmony_ci 118462306a36Sopenharmony_ci /* Enable CRS Software Visibility if supported */ 118562306a36Sopenharmony_ci pcie_capability_read_word(pdev, PCI_EXP_RTCAP, &root_cap); 118662306a36Sopenharmony_ci if (root_cap & PCI_EXP_RTCAP_CRSVIS) 118762306a36Sopenharmony_ci pcie_capability_set_word(pdev, PCI_EXP_RTCTL, 118862306a36Sopenharmony_ci PCI_EXP_RTCTL_CRSSVE); 118962306a36Sopenharmony_ci} 119062306a36Sopenharmony_ci 119162306a36Sopenharmony_cistatic unsigned int pci_scan_child_bus_extend(struct pci_bus *bus, 119262306a36Sopenharmony_ci unsigned int available_buses); 119362306a36Sopenharmony_ci/** 119462306a36Sopenharmony_ci * pci_ea_fixed_busnrs() - Read fixed Secondary and Subordinate bus 119562306a36Sopenharmony_ci * numbers from EA capability. 119662306a36Sopenharmony_ci * @dev: Bridge 119762306a36Sopenharmony_ci * @sec: updated with secondary bus number from EA 119862306a36Sopenharmony_ci * @sub: updated with subordinate bus number from EA 119962306a36Sopenharmony_ci * 120062306a36Sopenharmony_ci * If @dev is a bridge with EA capability that specifies valid secondary 120162306a36Sopenharmony_ci * and subordinate bus numbers, return true with the bus numbers in @sec 120262306a36Sopenharmony_ci * and @sub. Otherwise return false. 120362306a36Sopenharmony_ci */ 120462306a36Sopenharmony_cistatic bool pci_ea_fixed_busnrs(struct pci_dev *dev, u8 *sec, u8 *sub) 120562306a36Sopenharmony_ci{ 120662306a36Sopenharmony_ci int ea, offset; 120762306a36Sopenharmony_ci u32 dw; 120862306a36Sopenharmony_ci u8 ea_sec, ea_sub; 120962306a36Sopenharmony_ci 121062306a36Sopenharmony_ci if (dev->hdr_type != PCI_HEADER_TYPE_BRIDGE) 121162306a36Sopenharmony_ci return false; 121262306a36Sopenharmony_ci 121362306a36Sopenharmony_ci /* find PCI EA capability in list */ 121462306a36Sopenharmony_ci ea = pci_find_capability(dev, PCI_CAP_ID_EA); 121562306a36Sopenharmony_ci if (!ea) 121662306a36Sopenharmony_ci return false; 121762306a36Sopenharmony_ci 121862306a36Sopenharmony_ci offset = ea + PCI_EA_FIRST_ENT; 121962306a36Sopenharmony_ci pci_read_config_dword(dev, offset, &dw); 122062306a36Sopenharmony_ci ea_sec = dw & PCI_EA_SEC_BUS_MASK; 122162306a36Sopenharmony_ci ea_sub = (dw & PCI_EA_SUB_BUS_MASK) >> PCI_EA_SUB_BUS_SHIFT; 122262306a36Sopenharmony_ci if (ea_sec == 0 || ea_sub < ea_sec) 122362306a36Sopenharmony_ci return false; 122462306a36Sopenharmony_ci 122562306a36Sopenharmony_ci *sec = ea_sec; 122662306a36Sopenharmony_ci *sub = ea_sub; 122762306a36Sopenharmony_ci return true; 122862306a36Sopenharmony_ci} 122962306a36Sopenharmony_ci 123062306a36Sopenharmony_ci/* 123162306a36Sopenharmony_ci * pci_scan_bridge_extend() - Scan buses behind a bridge 123262306a36Sopenharmony_ci * @bus: Parent bus the bridge is on 123362306a36Sopenharmony_ci * @dev: Bridge itself 123462306a36Sopenharmony_ci * @max: Starting subordinate number of buses behind this bridge 123562306a36Sopenharmony_ci * @available_buses: Total number of buses available for this bridge and 123662306a36Sopenharmony_ci * the devices below. After the minimal bus space has 123762306a36Sopenharmony_ci * been allocated the remaining buses will be 123862306a36Sopenharmony_ci * distributed equally between hotplug-capable bridges. 123962306a36Sopenharmony_ci * @pass: Either %0 (scan already configured bridges) or %1 (scan bridges 124062306a36Sopenharmony_ci * that need to be reconfigured. 124162306a36Sopenharmony_ci * 124262306a36Sopenharmony_ci * If it's a bridge, configure it and scan the bus behind it. 124362306a36Sopenharmony_ci * For CardBus bridges, we don't scan behind as the devices will 124462306a36Sopenharmony_ci * be handled by the bridge driver itself. 124562306a36Sopenharmony_ci * 124662306a36Sopenharmony_ci * We need to process bridges in two passes -- first we scan those 124762306a36Sopenharmony_ci * already configured by the BIOS and after we are done with all of 124862306a36Sopenharmony_ci * them, we proceed to assigning numbers to the remaining buses in 124962306a36Sopenharmony_ci * order to avoid overlaps between old and new bus numbers. 125062306a36Sopenharmony_ci * 125162306a36Sopenharmony_ci * Return: New subordinate number covering all buses behind this bridge. 125262306a36Sopenharmony_ci */ 125362306a36Sopenharmony_cistatic int pci_scan_bridge_extend(struct pci_bus *bus, struct pci_dev *dev, 125462306a36Sopenharmony_ci int max, unsigned int available_buses, 125562306a36Sopenharmony_ci int pass) 125662306a36Sopenharmony_ci{ 125762306a36Sopenharmony_ci struct pci_bus *child; 125862306a36Sopenharmony_ci int is_cardbus = (dev->hdr_type == PCI_HEADER_TYPE_CARDBUS); 125962306a36Sopenharmony_ci u32 buses, i, j = 0; 126062306a36Sopenharmony_ci u16 bctl; 126162306a36Sopenharmony_ci u8 primary, secondary, subordinate; 126262306a36Sopenharmony_ci int broken = 0; 126362306a36Sopenharmony_ci bool fixed_buses; 126462306a36Sopenharmony_ci u8 fixed_sec, fixed_sub; 126562306a36Sopenharmony_ci int next_busnr; 126662306a36Sopenharmony_ci 126762306a36Sopenharmony_ci /* 126862306a36Sopenharmony_ci * Make sure the bridge is powered on to be able to access config 126962306a36Sopenharmony_ci * space of devices below it. 127062306a36Sopenharmony_ci */ 127162306a36Sopenharmony_ci pm_runtime_get_sync(&dev->dev); 127262306a36Sopenharmony_ci 127362306a36Sopenharmony_ci pci_read_config_dword(dev, PCI_PRIMARY_BUS, &buses); 127462306a36Sopenharmony_ci primary = buses & 0xFF; 127562306a36Sopenharmony_ci secondary = (buses >> 8) & 0xFF; 127662306a36Sopenharmony_ci subordinate = (buses >> 16) & 0xFF; 127762306a36Sopenharmony_ci 127862306a36Sopenharmony_ci pci_dbg(dev, "scanning [bus %02x-%02x] behind bridge, pass %d\n", 127962306a36Sopenharmony_ci secondary, subordinate, pass); 128062306a36Sopenharmony_ci 128162306a36Sopenharmony_ci if (!primary && (primary != bus->number) && secondary && subordinate) { 128262306a36Sopenharmony_ci pci_warn(dev, "Primary bus is hard wired to 0\n"); 128362306a36Sopenharmony_ci primary = bus->number; 128462306a36Sopenharmony_ci } 128562306a36Sopenharmony_ci 128662306a36Sopenharmony_ci /* Check if setup is sensible at all */ 128762306a36Sopenharmony_ci if (!pass && 128862306a36Sopenharmony_ci (primary != bus->number || secondary <= bus->number || 128962306a36Sopenharmony_ci secondary > subordinate)) { 129062306a36Sopenharmony_ci pci_info(dev, "bridge configuration invalid ([bus %02x-%02x]), reconfiguring\n", 129162306a36Sopenharmony_ci secondary, subordinate); 129262306a36Sopenharmony_ci broken = 1; 129362306a36Sopenharmony_ci } 129462306a36Sopenharmony_ci 129562306a36Sopenharmony_ci /* 129662306a36Sopenharmony_ci * Disable Master-Abort Mode during probing to avoid reporting of 129762306a36Sopenharmony_ci * bus errors in some architectures. 129862306a36Sopenharmony_ci */ 129962306a36Sopenharmony_ci pci_read_config_word(dev, PCI_BRIDGE_CONTROL, &bctl); 130062306a36Sopenharmony_ci pci_write_config_word(dev, PCI_BRIDGE_CONTROL, 130162306a36Sopenharmony_ci bctl & ~PCI_BRIDGE_CTL_MASTER_ABORT); 130262306a36Sopenharmony_ci 130362306a36Sopenharmony_ci pci_enable_crs(dev); 130462306a36Sopenharmony_ci 130562306a36Sopenharmony_ci if ((secondary || subordinate) && !pcibios_assign_all_busses() && 130662306a36Sopenharmony_ci !is_cardbus && !broken) { 130762306a36Sopenharmony_ci unsigned int cmax, buses; 130862306a36Sopenharmony_ci 130962306a36Sopenharmony_ci /* 131062306a36Sopenharmony_ci * Bus already configured by firmware, process it in the 131162306a36Sopenharmony_ci * first pass and just note the configuration. 131262306a36Sopenharmony_ci */ 131362306a36Sopenharmony_ci if (pass) 131462306a36Sopenharmony_ci goto out; 131562306a36Sopenharmony_ci 131662306a36Sopenharmony_ci /* 131762306a36Sopenharmony_ci * The bus might already exist for two reasons: Either we 131862306a36Sopenharmony_ci * are rescanning the bus or the bus is reachable through 131962306a36Sopenharmony_ci * more than one bridge. The second case can happen with 132062306a36Sopenharmony_ci * the i450NX chipset. 132162306a36Sopenharmony_ci */ 132262306a36Sopenharmony_ci child = pci_find_bus(pci_domain_nr(bus), secondary); 132362306a36Sopenharmony_ci if (!child) { 132462306a36Sopenharmony_ci child = pci_add_new_bus(bus, dev, secondary); 132562306a36Sopenharmony_ci if (!child) 132662306a36Sopenharmony_ci goto out; 132762306a36Sopenharmony_ci child->primary = primary; 132862306a36Sopenharmony_ci pci_bus_insert_busn_res(child, secondary, subordinate); 132962306a36Sopenharmony_ci child->bridge_ctl = bctl; 133062306a36Sopenharmony_ci } 133162306a36Sopenharmony_ci 133262306a36Sopenharmony_ci buses = subordinate - secondary; 133362306a36Sopenharmony_ci cmax = pci_scan_child_bus_extend(child, buses); 133462306a36Sopenharmony_ci if (cmax > subordinate) 133562306a36Sopenharmony_ci pci_warn(dev, "bridge has subordinate %02x but max busn %02x\n", 133662306a36Sopenharmony_ci subordinate, cmax); 133762306a36Sopenharmony_ci 133862306a36Sopenharmony_ci /* Subordinate should equal child->busn_res.end */ 133962306a36Sopenharmony_ci if (subordinate > max) 134062306a36Sopenharmony_ci max = subordinate; 134162306a36Sopenharmony_ci } else { 134262306a36Sopenharmony_ci 134362306a36Sopenharmony_ci /* 134462306a36Sopenharmony_ci * We need to assign a number to this bus which we always 134562306a36Sopenharmony_ci * do in the second pass. 134662306a36Sopenharmony_ci */ 134762306a36Sopenharmony_ci if (!pass) { 134862306a36Sopenharmony_ci if (pcibios_assign_all_busses() || broken || is_cardbus) 134962306a36Sopenharmony_ci 135062306a36Sopenharmony_ci /* 135162306a36Sopenharmony_ci * Temporarily disable forwarding of the 135262306a36Sopenharmony_ci * configuration cycles on all bridges in 135362306a36Sopenharmony_ci * this bus segment to avoid possible 135462306a36Sopenharmony_ci * conflicts in the second pass between two 135562306a36Sopenharmony_ci * bridges programmed with overlapping bus 135662306a36Sopenharmony_ci * ranges. 135762306a36Sopenharmony_ci */ 135862306a36Sopenharmony_ci pci_write_config_dword(dev, PCI_PRIMARY_BUS, 135962306a36Sopenharmony_ci buses & ~0xffffff); 136062306a36Sopenharmony_ci goto out; 136162306a36Sopenharmony_ci } 136262306a36Sopenharmony_ci 136362306a36Sopenharmony_ci /* Clear errors */ 136462306a36Sopenharmony_ci pci_write_config_word(dev, PCI_STATUS, 0xffff); 136562306a36Sopenharmony_ci 136662306a36Sopenharmony_ci /* Read bus numbers from EA Capability (if present) */ 136762306a36Sopenharmony_ci fixed_buses = pci_ea_fixed_busnrs(dev, &fixed_sec, &fixed_sub); 136862306a36Sopenharmony_ci if (fixed_buses) 136962306a36Sopenharmony_ci next_busnr = fixed_sec; 137062306a36Sopenharmony_ci else 137162306a36Sopenharmony_ci next_busnr = max + 1; 137262306a36Sopenharmony_ci 137362306a36Sopenharmony_ci /* 137462306a36Sopenharmony_ci * Prevent assigning a bus number that already exists. 137562306a36Sopenharmony_ci * This can happen when a bridge is hot-plugged, so in this 137662306a36Sopenharmony_ci * case we only re-scan this bus. 137762306a36Sopenharmony_ci */ 137862306a36Sopenharmony_ci child = pci_find_bus(pci_domain_nr(bus), next_busnr); 137962306a36Sopenharmony_ci if (!child) { 138062306a36Sopenharmony_ci child = pci_add_new_bus(bus, dev, next_busnr); 138162306a36Sopenharmony_ci if (!child) 138262306a36Sopenharmony_ci goto out; 138362306a36Sopenharmony_ci pci_bus_insert_busn_res(child, next_busnr, 138462306a36Sopenharmony_ci bus->busn_res.end); 138562306a36Sopenharmony_ci } 138662306a36Sopenharmony_ci max++; 138762306a36Sopenharmony_ci if (available_buses) 138862306a36Sopenharmony_ci available_buses--; 138962306a36Sopenharmony_ci 139062306a36Sopenharmony_ci buses = (buses & 0xff000000) 139162306a36Sopenharmony_ci | ((unsigned int)(child->primary) << 0) 139262306a36Sopenharmony_ci | ((unsigned int)(child->busn_res.start) << 8) 139362306a36Sopenharmony_ci | ((unsigned int)(child->busn_res.end) << 16); 139462306a36Sopenharmony_ci 139562306a36Sopenharmony_ci /* 139662306a36Sopenharmony_ci * yenta.c forces a secondary latency timer of 176. 139762306a36Sopenharmony_ci * Copy that behaviour here. 139862306a36Sopenharmony_ci */ 139962306a36Sopenharmony_ci if (is_cardbus) { 140062306a36Sopenharmony_ci buses &= ~0xff000000; 140162306a36Sopenharmony_ci buses |= CARDBUS_LATENCY_TIMER << 24; 140262306a36Sopenharmony_ci } 140362306a36Sopenharmony_ci 140462306a36Sopenharmony_ci /* We need to blast all three values with a single write */ 140562306a36Sopenharmony_ci pci_write_config_dword(dev, PCI_PRIMARY_BUS, buses); 140662306a36Sopenharmony_ci 140762306a36Sopenharmony_ci if (!is_cardbus) { 140862306a36Sopenharmony_ci child->bridge_ctl = bctl; 140962306a36Sopenharmony_ci max = pci_scan_child_bus_extend(child, available_buses); 141062306a36Sopenharmony_ci } else { 141162306a36Sopenharmony_ci 141262306a36Sopenharmony_ci /* 141362306a36Sopenharmony_ci * For CardBus bridges, we leave 4 bus numbers as 141462306a36Sopenharmony_ci * cards with a PCI-to-PCI bridge can be inserted 141562306a36Sopenharmony_ci * later. 141662306a36Sopenharmony_ci */ 141762306a36Sopenharmony_ci for (i = 0; i < CARDBUS_RESERVE_BUSNR; i++) { 141862306a36Sopenharmony_ci struct pci_bus *parent = bus; 141962306a36Sopenharmony_ci if (pci_find_bus(pci_domain_nr(bus), 142062306a36Sopenharmony_ci max+i+1)) 142162306a36Sopenharmony_ci break; 142262306a36Sopenharmony_ci while (parent->parent) { 142362306a36Sopenharmony_ci if ((!pcibios_assign_all_busses()) && 142462306a36Sopenharmony_ci (parent->busn_res.end > max) && 142562306a36Sopenharmony_ci (parent->busn_res.end <= max+i)) { 142662306a36Sopenharmony_ci j = 1; 142762306a36Sopenharmony_ci } 142862306a36Sopenharmony_ci parent = parent->parent; 142962306a36Sopenharmony_ci } 143062306a36Sopenharmony_ci if (j) { 143162306a36Sopenharmony_ci 143262306a36Sopenharmony_ci /* 143362306a36Sopenharmony_ci * Often, there are two CardBus 143462306a36Sopenharmony_ci * bridges -- try to leave one 143562306a36Sopenharmony_ci * valid bus number for each one. 143662306a36Sopenharmony_ci */ 143762306a36Sopenharmony_ci i /= 2; 143862306a36Sopenharmony_ci break; 143962306a36Sopenharmony_ci } 144062306a36Sopenharmony_ci } 144162306a36Sopenharmony_ci max += i; 144262306a36Sopenharmony_ci } 144362306a36Sopenharmony_ci 144462306a36Sopenharmony_ci /* 144562306a36Sopenharmony_ci * Set subordinate bus number to its real value. 144662306a36Sopenharmony_ci * If fixed subordinate bus number exists from EA 144762306a36Sopenharmony_ci * capability then use it. 144862306a36Sopenharmony_ci */ 144962306a36Sopenharmony_ci if (fixed_buses) 145062306a36Sopenharmony_ci max = fixed_sub; 145162306a36Sopenharmony_ci pci_bus_update_busn_res_end(child, max); 145262306a36Sopenharmony_ci pci_write_config_byte(dev, PCI_SUBORDINATE_BUS, max); 145362306a36Sopenharmony_ci } 145462306a36Sopenharmony_ci 145562306a36Sopenharmony_ci sprintf(child->name, 145662306a36Sopenharmony_ci (is_cardbus ? "PCI CardBus %04x:%02x" : "PCI Bus %04x:%02x"), 145762306a36Sopenharmony_ci pci_domain_nr(bus), child->number); 145862306a36Sopenharmony_ci 145962306a36Sopenharmony_ci /* Check that all devices are accessible */ 146062306a36Sopenharmony_ci while (bus->parent) { 146162306a36Sopenharmony_ci if ((child->busn_res.end > bus->busn_res.end) || 146262306a36Sopenharmony_ci (child->number > bus->busn_res.end) || 146362306a36Sopenharmony_ci (child->number < bus->number) || 146462306a36Sopenharmony_ci (child->busn_res.end < bus->number)) { 146562306a36Sopenharmony_ci dev_info(&dev->dev, "devices behind bridge are unusable because %pR cannot be assigned for them\n", 146662306a36Sopenharmony_ci &child->busn_res); 146762306a36Sopenharmony_ci break; 146862306a36Sopenharmony_ci } 146962306a36Sopenharmony_ci bus = bus->parent; 147062306a36Sopenharmony_ci } 147162306a36Sopenharmony_ci 147262306a36Sopenharmony_ciout: 147362306a36Sopenharmony_ci pci_write_config_word(dev, PCI_BRIDGE_CONTROL, bctl); 147462306a36Sopenharmony_ci 147562306a36Sopenharmony_ci pm_runtime_put(&dev->dev); 147662306a36Sopenharmony_ci 147762306a36Sopenharmony_ci return max; 147862306a36Sopenharmony_ci} 147962306a36Sopenharmony_ci 148062306a36Sopenharmony_ci/* 148162306a36Sopenharmony_ci * pci_scan_bridge() - Scan buses behind a bridge 148262306a36Sopenharmony_ci * @bus: Parent bus the bridge is on 148362306a36Sopenharmony_ci * @dev: Bridge itself 148462306a36Sopenharmony_ci * @max: Starting subordinate number of buses behind this bridge 148562306a36Sopenharmony_ci * @pass: Either %0 (scan already configured bridges) or %1 (scan bridges 148662306a36Sopenharmony_ci * that need to be reconfigured. 148762306a36Sopenharmony_ci * 148862306a36Sopenharmony_ci * If it's a bridge, configure it and scan the bus behind it. 148962306a36Sopenharmony_ci * For CardBus bridges, we don't scan behind as the devices will 149062306a36Sopenharmony_ci * be handled by the bridge driver itself. 149162306a36Sopenharmony_ci * 149262306a36Sopenharmony_ci * We need to process bridges in two passes -- first we scan those 149362306a36Sopenharmony_ci * already configured by the BIOS and after we are done with all of 149462306a36Sopenharmony_ci * them, we proceed to assigning numbers to the remaining buses in 149562306a36Sopenharmony_ci * order to avoid overlaps between old and new bus numbers. 149662306a36Sopenharmony_ci * 149762306a36Sopenharmony_ci * Return: New subordinate number covering all buses behind this bridge. 149862306a36Sopenharmony_ci */ 149962306a36Sopenharmony_ciint pci_scan_bridge(struct pci_bus *bus, struct pci_dev *dev, int max, int pass) 150062306a36Sopenharmony_ci{ 150162306a36Sopenharmony_ci return pci_scan_bridge_extend(bus, dev, max, 0, pass); 150262306a36Sopenharmony_ci} 150362306a36Sopenharmony_ciEXPORT_SYMBOL(pci_scan_bridge); 150462306a36Sopenharmony_ci 150562306a36Sopenharmony_ci/* 150662306a36Sopenharmony_ci * Read interrupt line and base address registers. 150762306a36Sopenharmony_ci * The architecture-dependent code can tweak these, of course. 150862306a36Sopenharmony_ci */ 150962306a36Sopenharmony_cistatic void pci_read_irq(struct pci_dev *dev) 151062306a36Sopenharmony_ci{ 151162306a36Sopenharmony_ci unsigned char irq; 151262306a36Sopenharmony_ci 151362306a36Sopenharmony_ci /* VFs are not allowed to use INTx, so skip the config reads */ 151462306a36Sopenharmony_ci if (dev->is_virtfn) { 151562306a36Sopenharmony_ci dev->pin = 0; 151662306a36Sopenharmony_ci dev->irq = 0; 151762306a36Sopenharmony_ci return; 151862306a36Sopenharmony_ci } 151962306a36Sopenharmony_ci 152062306a36Sopenharmony_ci pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &irq); 152162306a36Sopenharmony_ci dev->pin = irq; 152262306a36Sopenharmony_ci if (irq) 152362306a36Sopenharmony_ci pci_read_config_byte(dev, PCI_INTERRUPT_LINE, &irq); 152462306a36Sopenharmony_ci dev->irq = irq; 152562306a36Sopenharmony_ci} 152662306a36Sopenharmony_ci 152762306a36Sopenharmony_civoid set_pcie_port_type(struct pci_dev *pdev) 152862306a36Sopenharmony_ci{ 152962306a36Sopenharmony_ci int pos; 153062306a36Sopenharmony_ci u16 reg16; 153162306a36Sopenharmony_ci u32 reg32; 153262306a36Sopenharmony_ci int type; 153362306a36Sopenharmony_ci struct pci_dev *parent; 153462306a36Sopenharmony_ci 153562306a36Sopenharmony_ci pos = pci_find_capability(pdev, PCI_CAP_ID_EXP); 153662306a36Sopenharmony_ci if (!pos) 153762306a36Sopenharmony_ci return; 153862306a36Sopenharmony_ci 153962306a36Sopenharmony_ci pdev->pcie_cap = pos; 154062306a36Sopenharmony_ci pci_read_config_word(pdev, pos + PCI_EXP_FLAGS, ®16); 154162306a36Sopenharmony_ci pdev->pcie_flags_reg = reg16; 154262306a36Sopenharmony_ci pci_read_config_dword(pdev, pos + PCI_EXP_DEVCAP, &pdev->devcap); 154362306a36Sopenharmony_ci pdev->pcie_mpss = FIELD_GET(PCI_EXP_DEVCAP_PAYLOAD, pdev->devcap); 154462306a36Sopenharmony_ci 154562306a36Sopenharmony_ci pcie_capability_read_dword(pdev, PCI_EXP_LNKCAP, ®32); 154662306a36Sopenharmony_ci if (reg32 & PCI_EXP_LNKCAP_DLLLARC) 154762306a36Sopenharmony_ci pdev->link_active_reporting = 1; 154862306a36Sopenharmony_ci 154962306a36Sopenharmony_ci parent = pci_upstream_bridge(pdev); 155062306a36Sopenharmony_ci if (!parent) 155162306a36Sopenharmony_ci return; 155262306a36Sopenharmony_ci 155362306a36Sopenharmony_ci /* 155462306a36Sopenharmony_ci * Some systems do not identify their upstream/downstream ports 155562306a36Sopenharmony_ci * correctly so detect impossible configurations here and correct 155662306a36Sopenharmony_ci * the port type accordingly. 155762306a36Sopenharmony_ci */ 155862306a36Sopenharmony_ci type = pci_pcie_type(pdev); 155962306a36Sopenharmony_ci if (type == PCI_EXP_TYPE_DOWNSTREAM) { 156062306a36Sopenharmony_ci /* 156162306a36Sopenharmony_ci * If pdev claims to be downstream port but the parent 156262306a36Sopenharmony_ci * device is also downstream port assume pdev is actually 156362306a36Sopenharmony_ci * upstream port. 156462306a36Sopenharmony_ci */ 156562306a36Sopenharmony_ci if (pcie_downstream_port(parent)) { 156662306a36Sopenharmony_ci pci_info(pdev, "claims to be downstream port but is acting as upstream port, correcting type\n"); 156762306a36Sopenharmony_ci pdev->pcie_flags_reg &= ~PCI_EXP_FLAGS_TYPE; 156862306a36Sopenharmony_ci pdev->pcie_flags_reg |= PCI_EXP_TYPE_UPSTREAM; 156962306a36Sopenharmony_ci } 157062306a36Sopenharmony_ci } else if (type == PCI_EXP_TYPE_UPSTREAM) { 157162306a36Sopenharmony_ci /* 157262306a36Sopenharmony_ci * If pdev claims to be upstream port but the parent 157362306a36Sopenharmony_ci * device is also upstream port assume pdev is actually 157462306a36Sopenharmony_ci * downstream port. 157562306a36Sopenharmony_ci */ 157662306a36Sopenharmony_ci if (pci_pcie_type(parent) == PCI_EXP_TYPE_UPSTREAM) { 157762306a36Sopenharmony_ci pci_info(pdev, "claims to be upstream port but is acting as downstream port, correcting type\n"); 157862306a36Sopenharmony_ci pdev->pcie_flags_reg &= ~PCI_EXP_FLAGS_TYPE; 157962306a36Sopenharmony_ci pdev->pcie_flags_reg |= PCI_EXP_TYPE_DOWNSTREAM; 158062306a36Sopenharmony_ci } 158162306a36Sopenharmony_ci } 158262306a36Sopenharmony_ci} 158362306a36Sopenharmony_ci 158462306a36Sopenharmony_civoid set_pcie_hotplug_bridge(struct pci_dev *pdev) 158562306a36Sopenharmony_ci{ 158662306a36Sopenharmony_ci u32 reg32; 158762306a36Sopenharmony_ci 158862306a36Sopenharmony_ci pcie_capability_read_dword(pdev, PCI_EXP_SLTCAP, ®32); 158962306a36Sopenharmony_ci if (reg32 & PCI_EXP_SLTCAP_HPC) 159062306a36Sopenharmony_ci pdev->is_hotplug_bridge = 1; 159162306a36Sopenharmony_ci} 159262306a36Sopenharmony_ci 159362306a36Sopenharmony_cistatic void set_pcie_thunderbolt(struct pci_dev *dev) 159462306a36Sopenharmony_ci{ 159562306a36Sopenharmony_ci u16 vsec; 159662306a36Sopenharmony_ci 159762306a36Sopenharmony_ci /* Is the device part of a Thunderbolt controller? */ 159862306a36Sopenharmony_ci vsec = pci_find_vsec_capability(dev, PCI_VENDOR_ID_INTEL, PCI_VSEC_ID_INTEL_TBT); 159962306a36Sopenharmony_ci if (vsec) 160062306a36Sopenharmony_ci dev->is_thunderbolt = 1; 160162306a36Sopenharmony_ci} 160262306a36Sopenharmony_ci 160362306a36Sopenharmony_cistatic void set_pcie_untrusted(struct pci_dev *dev) 160462306a36Sopenharmony_ci{ 160562306a36Sopenharmony_ci struct pci_dev *parent; 160662306a36Sopenharmony_ci 160762306a36Sopenharmony_ci /* 160862306a36Sopenharmony_ci * If the upstream bridge is untrusted we treat this device 160962306a36Sopenharmony_ci * untrusted as well. 161062306a36Sopenharmony_ci */ 161162306a36Sopenharmony_ci parent = pci_upstream_bridge(dev); 161262306a36Sopenharmony_ci if (parent && (parent->untrusted || parent->external_facing)) 161362306a36Sopenharmony_ci dev->untrusted = true; 161462306a36Sopenharmony_ci} 161562306a36Sopenharmony_ci 161662306a36Sopenharmony_cistatic void pci_set_removable(struct pci_dev *dev) 161762306a36Sopenharmony_ci{ 161862306a36Sopenharmony_ci struct pci_dev *parent = pci_upstream_bridge(dev); 161962306a36Sopenharmony_ci 162062306a36Sopenharmony_ci /* 162162306a36Sopenharmony_ci * We (only) consider everything downstream from an external_facing 162262306a36Sopenharmony_ci * device to be removable by the user. We're mainly concerned with 162362306a36Sopenharmony_ci * consumer platforms with user accessible thunderbolt ports that are 162462306a36Sopenharmony_ci * vulnerable to DMA attacks, and we expect those ports to be marked by 162562306a36Sopenharmony_ci * the firmware as external_facing. Devices in traditional hotplug 162662306a36Sopenharmony_ci * slots can technically be removed, but the expectation is that unless 162762306a36Sopenharmony_ci * the port is marked with external_facing, such devices are less 162862306a36Sopenharmony_ci * accessible to user / may not be removed by end user, and thus not 162962306a36Sopenharmony_ci * exposed as "removable" to userspace. 163062306a36Sopenharmony_ci */ 163162306a36Sopenharmony_ci if (parent && 163262306a36Sopenharmony_ci (parent->external_facing || dev_is_removable(&parent->dev))) 163362306a36Sopenharmony_ci dev_set_removable(&dev->dev, DEVICE_REMOVABLE); 163462306a36Sopenharmony_ci} 163562306a36Sopenharmony_ci 163662306a36Sopenharmony_ci/** 163762306a36Sopenharmony_ci * pci_ext_cfg_is_aliased - Is ext config space just an alias of std config? 163862306a36Sopenharmony_ci * @dev: PCI device 163962306a36Sopenharmony_ci * 164062306a36Sopenharmony_ci * PCI Express to PCI/PCI-X Bridge Specification, rev 1.0, 4.1.4 says that 164162306a36Sopenharmony_ci * when forwarding a type1 configuration request the bridge must check that 164262306a36Sopenharmony_ci * the extended register address field is zero. The bridge is not permitted 164362306a36Sopenharmony_ci * to forward the transactions and must handle it as an Unsupported Request. 164462306a36Sopenharmony_ci * Some bridges do not follow this rule and simply drop the extended register 164562306a36Sopenharmony_ci * bits, resulting in the standard config space being aliased, every 256 164662306a36Sopenharmony_ci * bytes across the entire configuration space. Test for this condition by 164762306a36Sopenharmony_ci * comparing the first dword of each potential alias to the vendor/device ID. 164862306a36Sopenharmony_ci * Known offenders: 164962306a36Sopenharmony_ci * ASM1083/1085 PCIe-to-PCI Reversible Bridge (1b21:1080, rev 01 & 03) 165062306a36Sopenharmony_ci * AMD/ATI SBx00 PCI to PCI Bridge (1002:4384, rev 40) 165162306a36Sopenharmony_ci */ 165262306a36Sopenharmony_cistatic bool pci_ext_cfg_is_aliased(struct pci_dev *dev) 165362306a36Sopenharmony_ci{ 165462306a36Sopenharmony_ci#ifdef CONFIG_PCI_QUIRKS 165562306a36Sopenharmony_ci int pos, ret; 165662306a36Sopenharmony_ci u32 header, tmp; 165762306a36Sopenharmony_ci 165862306a36Sopenharmony_ci pci_read_config_dword(dev, PCI_VENDOR_ID, &header); 165962306a36Sopenharmony_ci 166062306a36Sopenharmony_ci for (pos = PCI_CFG_SPACE_SIZE; 166162306a36Sopenharmony_ci pos < PCI_CFG_SPACE_EXP_SIZE; pos += PCI_CFG_SPACE_SIZE) { 166262306a36Sopenharmony_ci ret = pci_read_config_dword(dev, pos, &tmp); 166362306a36Sopenharmony_ci if ((ret != PCIBIOS_SUCCESSFUL) || (header != tmp)) 166462306a36Sopenharmony_ci return false; 166562306a36Sopenharmony_ci } 166662306a36Sopenharmony_ci 166762306a36Sopenharmony_ci return true; 166862306a36Sopenharmony_ci#else 166962306a36Sopenharmony_ci return false; 167062306a36Sopenharmony_ci#endif 167162306a36Sopenharmony_ci} 167262306a36Sopenharmony_ci 167362306a36Sopenharmony_ci/** 167462306a36Sopenharmony_ci * pci_cfg_space_size_ext - Get the configuration space size of the PCI device 167562306a36Sopenharmony_ci * @dev: PCI device 167662306a36Sopenharmony_ci * 167762306a36Sopenharmony_ci * Regular PCI devices have 256 bytes, but PCI-X 2 and PCI Express devices 167862306a36Sopenharmony_ci * have 4096 bytes. Even if the device is capable, that doesn't mean we can 167962306a36Sopenharmony_ci * access it. Maybe we don't have a way to generate extended config space 168062306a36Sopenharmony_ci * accesses, or the device is behind a reverse Express bridge. So we try 168162306a36Sopenharmony_ci * reading the dword at 0x100 which must either be 0 or a valid extended 168262306a36Sopenharmony_ci * capability header. 168362306a36Sopenharmony_ci */ 168462306a36Sopenharmony_cistatic int pci_cfg_space_size_ext(struct pci_dev *dev) 168562306a36Sopenharmony_ci{ 168662306a36Sopenharmony_ci u32 status; 168762306a36Sopenharmony_ci int pos = PCI_CFG_SPACE_SIZE; 168862306a36Sopenharmony_ci 168962306a36Sopenharmony_ci if (pci_read_config_dword(dev, pos, &status) != PCIBIOS_SUCCESSFUL) 169062306a36Sopenharmony_ci return PCI_CFG_SPACE_SIZE; 169162306a36Sopenharmony_ci if (PCI_POSSIBLE_ERROR(status) || pci_ext_cfg_is_aliased(dev)) 169262306a36Sopenharmony_ci return PCI_CFG_SPACE_SIZE; 169362306a36Sopenharmony_ci 169462306a36Sopenharmony_ci return PCI_CFG_SPACE_EXP_SIZE; 169562306a36Sopenharmony_ci} 169662306a36Sopenharmony_ci 169762306a36Sopenharmony_ciint pci_cfg_space_size(struct pci_dev *dev) 169862306a36Sopenharmony_ci{ 169962306a36Sopenharmony_ci int pos; 170062306a36Sopenharmony_ci u32 status; 170162306a36Sopenharmony_ci u16 class; 170262306a36Sopenharmony_ci 170362306a36Sopenharmony_ci#ifdef CONFIG_PCI_IOV 170462306a36Sopenharmony_ci /* 170562306a36Sopenharmony_ci * Per the SR-IOV specification (rev 1.1, sec 3.5), VFs are required to 170662306a36Sopenharmony_ci * implement a PCIe capability and therefore must implement extended 170762306a36Sopenharmony_ci * config space. We can skip the NO_EXTCFG test below and the 170862306a36Sopenharmony_ci * reachability/aliasing test in pci_cfg_space_size_ext() by virtue of 170962306a36Sopenharmony_ci * the fact that the SR-IOV capability on the PF resides in extended 171062306a36Sopenharmony_ci * config space and must be accessible and non-aliased to have enabled 171162306a36Sopenharmony_ci * support for this VF. This is a micro performance optimization for 171262306a36Sopenharmony_ci * systems supporting many VFs. 171362306a36Sopenharmony_ci */ 171462306a36Sopenharmony_ci if (dev->is_virtfn) 171562306a36Sopenharmony_ci return PCI_CFG_SPACE_EXP_SIZE; 171662306a36Sopenharmony_ci#endif 171762306a36Sopenharmony_ci 171862306a36Sopenharmony_ci if (dev->bus->bus_flags & PCI_BUS_FLAGS_NO_EXTCFG) 171962306a36Sopenharmony_ci return PCI_CFG_SPACE_SIZE; 172062306a36Sopenharmony_ci 172162306a36Sopenharmony_ci class = dev->class >> 8; 172262306a36Sopenharmony_ci if (class == PCI_CLASS_BRIDGE_HOST) 172362306a36Sopenharmony_ci return pci_cfg_space_size_ext(dev); 172462306a36Sopenharmony_ci 172562306a36Sopenharmony_ci if (pci_is_pcie(dev)) 172662306a36Sopenharmony_ci return pci_cfg_space_size_ext(dev); 172762306a36Sopenharmony_ci 172862306a36Sopenharmony_ci pos = pci_find_capability(dev, PCI_CAP_ID_PCIX); 172962306a36Sopenharmony_ci if (!pos) 173062306a36Sopenharmony_ci return PCI_CFG_SPACE_SIZE; 173162306a36Sopenharmony_ci 173262306a36Sopenharmony_ci pci_read_config_dword(dev, pos + PCI_X_STATUS, &status); 173362306a36Sopenharmony_ci if (status & (PCI_X_STATUS_266MHZ | PCI_X_STATUS_533MHZ)) 173462306a36Sopenharmony_ci return pci_cfg_space_size_ext(dev); 173562306a36Sopenharmony_ci 173662306a36Sopenharmony_ci return PCI_CFG_SPACE_SIZE; 173762306a36Sopenharmony_ci} 173862306a36Sopenharmony_ci 173962306a36Sopenharmony_cistatic u32 pci_class(struct pci_dev *dev) 174062306a36Sopenharmony_ci{ 174162306a36Sopenharmony_ci u32 class; 174262306a36Sopenharmony_ci 174362306a36Sopenharmony_ci#ifdef CONFIG_PCI_IOV 174462306a36Sopenharmony_ci if (dev->is_virtfn) 174562306a36Sopenharmony_ci return dev->physfn->sriov->class; 174662306a36Sopenharmony_ci#endif 174762306a36Sopenharmony_ci pci_read_config_dword(dev, PCI_CLASS_REVISION, &class); 174862306a36Sopenharmony_ci return class; 174962306a36Sopenharmony_ci} 175062306a36Sopenharmony_ci 175162306a36Sopenharmony_cistatic void pci_subsystem_ids(struct pci_dev *dev, u16 *vendor, u16 *device) 175262306a36Sopenharmony_ci{ 175362306a36Sopenharmony_ci#ifdef CONFIG_PCI_IOV 175462306a36Sopenharmony_ci if (dev->is_virtfn) { 175562306a36Sopenharmony_ci *vendor = dev->physfn->sriov->subsystem_vendor; 175662306a36Sopenharmony_ci *device = dev->physfn->sriov->subsystem_device; 175762306a36Sopenharmony_ci return; 175862306a36Sopenharmony_ci } 175962306a36Sopenharmony_ci#endif 176062306a36Sopenharmony_ci pci_read_config_word(dev, PCI_SUBSYSTEM_VENDOR_ID, vendor); 176162306a36Sopenharmony_ci pci_read_config_word(dev, PCI_SUBSYSTEM_ID, device); 176262306a36Sopenharmony_ci} 176362306a36Sopenharmony_ci 176462306a36Sopenharmony_cistatic u8 pci_hdr_type(struct pci_dev *dev) 176562306a36Sopenharmony_ci{ 176662306a36Sopenharmony_ci u8 hdr_type; 176762306a36Sopenharmony_ci 176862306a36Sopenharmony_ci#ifdef CONFIG_PCI_IOV 176962306a36Sopenharmony_ci if (dev->is_virtfn) 177062306a36Sopenharmony_ci return dev->physfn->sriov->hdr_type; 177162306a36Sopenharmony_ci#endif 177262306a36Sopenharmony_ci pci_read_config_byte(dev, PCI_HEADER_TYPE, &hdr_type); 177362306a36Sopenharmony_ci return hdr_type; 177462306a36Sopenharmony_ci} 177562306a36Sopenharmony_ci 177662306a36Sopenharmony_ci#define LEGACY_IO_RESOURCE (IORESOURCE_IO | IORESOURCE_PCI_FIXED) 177762306a36Sopenharmony_ci 177862306a36Sopenharmony_ci/** 177962306a36Sopenharmony_ci * pci_intx_mask_broken - Test PCI_COMMAND_INTX_DISABLE writability 178062306a36Sopenharmony_ci * @dev: PCI device 178162306a36Sopenharmony_ci * 178262306a36Sopenharmony_ci * Test whether PCI_COMMAND_INTX_DISABLE is writable for @dev. Check this 178362306a36Sopenharmony_ci * at enumeration-time to avoid modifying PCI_COMMAND at run-time. 178462306a36Sopenharmony_ci */ 178562306a36Sopenharmony_cistatic int pci_intx_mask_broken(struct pci_dev *dev) 178662306a36Sopenharmony_ci{ 178762306a36Sopenharmony_ci u16 orig, toggle, new; 178862306a36Sopenharmony_ci 178962306a36Sopenharmony_ci pci_read_config_word(dev, PCI_COMMAND, &orig); 179062306a36Sopenharmony_ci toggle = orig ^ PCI_COMMAND_INTX_DISABLE; 179162306a36Sopenharmony_ci pci_write_config_word(dev, PCI_COMMAND, toggle); 179262306a36Sopenharmony_ci pci_read_config_word(dev, PCI_COMMAND, &new); 179362306a36Sopenharmony_ci 179462306a36Sopenharmony_ci pci_write_config_word(dev, PCI_COMMAND, orig); 179562306a36Sopenharmony_ci 179662306a36Sopenharmony_ci /* 179762306a36Sopenharmony_ci * PCI_COMMAND_INTX_DISABLE was reserved and read-only prior to PCI 179862306a36Sopenharmony_ci * r2.3, so strictly speaking, a device is not *broken* if it's not 179962306a36Sopenharmony_ci * writable. But we'll live with the misnomer for now. 180062306a36Sopenharmony_ci */ 180162306a36Sopenharmony_ci if (new != toggle) 180262306a36Sopenharmony_ci return 1; 180362306a36Sopenharmony_ci return 0; 180462306a36Sopenharmony_ci} 180562306a36Sopenharmony_ci 180662306a36Sopenharmony_cistatic void early_dump_pci_device(struct pci_dev *pdev) 180762306a36Sopenharmony_ci{ 180862306a36Sopenharmony_ci u32 value[256 / 4]; 180962306a36Sopenharmony_ci int i; 181062306a36Sopenharmony_ci 181162306a36Sopenharmony_ci pci_info(pdev, "config space:\n"); 181262306a36Sopenharmony_ci 181362306a36Sopenharmony_ci for (i = 0; i < 256; i += 4) 181462306a36Sopenharmony_ci pci_read_config_dword(pdev, i, &value[i / 4]); 181562306a36Sopenharmony_ci 181662306a36Sopenharmony_ci print_hex_dump(KERN_INFO, "", DUMP_PREFIX_OFFSET, 16, 1, 181762306a36Sopenharmony_ci value, 256, false); 181862306a36Sopenharmony_ci} 181962306a36Sopenharmony_ci 182062306a36Sopenharmony_ci/** 182162306a36Sopenharmony_ci * pci_setup_device - Fill in class and map information of a device 182262306a36Sopenharmony_ci * @dev: the device structure to fill 182362306a36Sopenharmony_ci * 182462306a36Sopenharmony_ci * Initialize the device structure with information about the device's 182562306a36Sopenharmony_ci * vendor,class,memory and IO-space addresses, IRQ lines etc. 182662306a36Sopenharmony_ci * Called at initialisation of the PCI subsystem and by CardBus services. 182762306a36Sopenharmony_ci * Returns 0 on success and negative if unknown type of device (not normal, 182862306a36Sopenharmony_ci * bridge or CardBus). 182962306a36Sopenharmony_ci */ 183062306a36Sopenharmony_ciint pci_setup_device(struct pci_dev *dev) 183162306a36Sopenharmony_ci{ 183262306a36Sopenharmony_ci u32 class; 183362306a36Sopenharmony_ci u16 cmd; 183462306a36Sopenharmony_ci u8 hdr_type; 183562306a36Sopenharmony_ci int err, pos = 0; 183662306a36Sopenharmony_ci struct pci_bus_region region; 183762306a36Sopenharmony_ci struct resource *res; 183862306a36Sopenharmony_ci 183962306a36Sopenharmony_ci hdr_type = pci_hdr_type(dev); 184062306a36Sopenharmony_ci 184162306a36Sopenharmony_ci dev->sysdata = dev->bus->sysdata; 184262306a36Sopenharmony_ci dev->dev.parent = dev->bus->bridge; 184362306a36Sopenharmony_ci dev->dev.bus = &pci_bus_type; 184462306a36Sopenharmony_ci dev->hdr_type = hdr_type & 0x7f; 184562306a36Sopenharmony_ci dev->multifunction = !!(hdr_type & 0x80); 184662306a36Sopenharmony_ci dev->error_state = pci_channel_io_normal; 184762306a36Sopenharmony_ci set_pcie_port_type(dev); 184862306a36Sopenharmony_ci 184962306a36Sopenharmony_ci err = pci_set_of_node(dev); 185062306a36Sopenharmony_ci if (err) 185162306a36Sopenharmony_ci return err; 185262306a36Sopenharmony_ci pci_set_acpi_fwnode(dev); 185362306a36Sopenharmony_ci 185462306a36Sopenharmony_ci pci_dev_assign_slot(dev); 185562306a36Sopenharmony_ci 185662306a36Sopenharmony_ci /* 185762306a36Sopenharmony_ci * Assume 32-bit PCI; let 64-bit PCI cards (which are far rarer) 185862306a36Sopenharmony_ci * set this higher, assuming the system even supports it. 185962306a36Sopenharmony_ci */ 186062306a36Sopenharmony_ci dev->dma_mask = 0xffffffff; 186162306a36Sopenharmony_ci 186262306a36Sopenharmony_ci dev_set_name(&dev->dev, "%04x:%02x:%02x.%d", pci_domain_nr(dev->bus), 186362306a36Sopenharmony_ci dev->bus->number, PCI_SLOT(dev->devfn), 186462306a36Sopenharmony_ci PCI_FUNC(dev->devfn)); 186562306a36Sopenharmony_ci 186662306a36Sopenharmony_ci class = pci_class(dev); 186762306a36Sopenharmony_ci 186862306a36Sopenharmony_ci dev->revision = class & 0xff; 186962306a36Sopenharmony_ci dev->class = class >> 8; /* upper 3 bytes */ 187062306a36Sopenharmony_ci 187162306a36Sopenharmony_ci if (pci_early_dump) 187262306a36Sopenharmony_ci early_dump_pci_device(dev); 187362306a36Sopenharmony_ci 187462306a36Sopenharmony_ci /* Need to have dev->class ready */ 187562306a36Sopenharmony_ci dev->cfg_size = pci_cfg_space_size(dev); 187662306a36Sopenharmony_ci 187762306a36Sopenharmony_ci /* Need to have dev->cfg_size ready */ 187862306a36Sopenharmony_ci set_pcie_thunderbolt(dev); 187962306a36Sopenharmony_ci 188062306a36Sopenharmony_ci set_pcie_untrusted(dev); 188162306a36Sopenharmony_ci 188262306a36Sopenharmony_ci /* "Unknown power state" */ 188362306a36Sopenharmony_ci dev->current_state = PCI_UNKNOWN; 188462306a36Sopenharmony_ci 188562306a36Sopenharmony_ci /* Early fixups, before probing the BARs */ 188662306a36Sopenharmony_ci pci_fixup_device(pci_fixup_early, dev); 188762306a36Sopenharmony_ci 188862306a36Sopenharmony_ci pci_set_removable(dev); 188962306a36Sopenharmony_ci 189062306a36Sopenharmony_ci pci_info(dev, "[%04x:%04x] type %02x class %#08x\n", 189162306a36Sopenharmony_ci dev->vendor, dev->device, dev->hdr_type, dev->class); 189262306a36Sopenharmony_ci 189362306a36Sopenharmony_ci /* Device class may be changed after fixup */ 189462306a36Sopenharmony_ci class = dev->class >> 8; 189562306a36Sopenharmony_ci 189662306a36Sopenharmony_ci if (dev->non_compliant_bars && !dev->mmio_always_on) { 189762306a36Sopenharmony_ci pci_read_config_word(dev, PCI_COMMAND, &cmd); 189862306a36Sopenharmony_ci if (cmd & (PCI_COMMAND_IO | PCI_COMMAND_MEMORY)) { 189962306a36Sopenharmony_ci pci_info(dev, "device has non-compliant BARs; disabling IO/MEM decoding\n"); 190062306a36Sopenharmony_ci cmd &= ~PCI_COMMAND_IO; 190162306a36Sopenharmony_ci cmd &= ~PCI_COMMAND_MEMORY; 190262306a36Sopenharmony_ci pci_write_config_word(dev, PCI_COMMAND, cmd); 190362306a36Sopenharmony_ci } 190462306a36Sopenharmony_ci } 190562306a36Sopenharmony_ci 190662306a36Sopenharmony_ci dev->broken_intx_masking = pci_intx_mask_broken(dev); 190762306a36Sopenharmony_ci 190862306a36Sopenharmony_ci switch (dev->hdr_type) { /* header type */ 190962306a36Sopenharmony_ci case PCI_HEADER_TYPE_NORMAL: /* standard header */ 191062306a36Sopenharmony_ci if (class == PCI_CLASS_BRIDGE_PCI) 191162306a36Sopenharmony_ci goto bad; 191262306a36Sopenharmony_ci pci_read_irq(dev); 191362306a36Sopenharmony_ci pci_read_bases(dev, 6, PCI_ROM_ADDRESS); 191462306a36Sopenharmony_ci 191562306a36Sopenharmony_ci pci_subsystem_ids(dev, &dev->subsystem_vendor, &dev->subsystem_device); 191662306a36Sopenharmony_ci 191762306a36Sopenharmony_ci /* 191862306a36Sopenharmony_ci * Do the ugly legacy mode stuff here rather than broken chip 191962306a36Sopenharmony_ci * quirk code. Legacy mode ATA controllers have fixed 192062306a36Sopenharmony_ci * addresses. These are not always echoed in BAR0-3, and 192162306a36Sopenharmony_ci * BAR0-3 in a few cases contain junk! 192262306a36Sopenharmony_ci */ 192362306a36Sopenharmony_ci if (class == PCI_CLASS_STORAGE_IDE) { 192462306a36Sopenharmony_ci u8 progif; 192562306a36Sopenharmony_ci pci_read_config_byte(dev, PCI_CLASS_PROG, &progif); 192662306a36Sopenharmony_ci if ((progif & 1) == 0) { 192762306a36Sopenharmony_ci region.start = 0x1F0; 192862306a36Sopenharmony_ci region.end = 0x1F7; 192962306a36Sopenharmony_ci res = &dev->resource[0]; 193062306a36Sopenharmony_ci res->flags = LEGACY_IO_RESOURCE; 193162306a36Sopenharmony_ci pcibios_bus_to_resource(dev->bus, res, ®ion); 193262306a36Sopenharmony_ci pci_info(dev, "legacy IDE quirk: reg 0x10: %pR\n", 193362306a36Sopenharmony_ci res); 193462306a36Sopenharmony_ci region.start = 0x3F6; 193562306a36Sopenharmony_ci region.end = 0x3F6; 193662306a36Sopenharmony_ci res = &dev->resource[1]; 193762306a36Sopenharmony_ci res->flags = LEGACY_IO_RESOURCE; 193862306a36Sopenharmony_ci pcibios_bus_to_resource(dev->bus, res, ®ion); 193962306a36Sopenharmony_ci pci_info(dev, "legacy IDE quirk: reg 0x14: %pR\n", 194062306a36Sopenharmony_ci res); 194162306a36Sopenharmony_ci } 194262306a36Sopenharmony_ci if ((progif & 4) == 0) { 194362306a36Sopenharmony_ci region.start = 0x170; 194462306a36Sopenharmony_ci region.end = 0x177; 194562306a36Sopenharmony_ci res = &dev->resource[2]; 194662306a36Sopenharmony_ci res->flags = LEGACY_IO_RESOURCE; 194762306a36Sopenharmony_ci pcibios_bus_to_resource(dev->bus, res, ®ion); 194862306a36Sopenharmony_ci pci_info(dev, "legacy IDE quirk: reg 0x18: %pR\n", 194962306a36Sopenharmony_ci res); 195062306a36Sopenharmony_ci region.start = 0x376; 195162306a36Sopenharmony_ci region.end = 0x376; 195262306a36Sopenharmony_ci res = &dev->resource[3]; 195362306a36Sopenharmony_ci res->flags = LEGACY_IO_RESOURCE; 195462306a36Sopenharmony_ci pcibios_bus_to_resource(dev->bus, res, ®ion); 195562306a36Sopenharmony_ci pci_info(dev, "legacy IDE quirk: reg 0x1c: %pR\n", 195662306a36Sopenharmony_ci res); 195762306a36Sopenharmony_ci } 195862306a36Sopenharmony_ci } 195962306a36Sopenharmony_ci break; 196062306a36Sopenharmony_ci 196162306a36Sopenharmony_ci case PCI_HEADER_TYPE_BRIDGE: /* bridge header */ 196262306a36Sopenharmony_ci /* 196362306a36Sopenharmony_ci * The PCI-to-PCI bridge spec requires that subtractive 196462306a36Sopenharmony_ci * decoding (i.e. transparent) bridge must have programming 196562306a36Sopenharmony_ci * interface code of 0x01. 196662306a36Sopenharmony_ci */ 196762306a36Sopenharmony_ci pci_read_irq(dev); 196862306a36Sopenharmony_ci dev->transparent = ((dev->class & 0xff) == 1); 196962306a36Sopenharmony_ci pci_read_bases(dev, 2, PCI_ROM_ADDRESS1); 197062306a36Sopenharmony_ci pci_read_bridge_windows(dev); 197162306a36Sopenharmony_ci set_pcie_hotplug_bridge(dev); 197262306a36Sopenharmony_ci pos = pci_find_capability(dev, PCI_CAP_ID_SSVID); 197362306a36Sopenharmony_ci if (pos) { 197462306a36Sopenharmony_ci pci_read_config_word(dev, pos + PCI_SSVID_VENDOR_ID, &dev->subsystem_vendor); 197562306a36Sopenharmony_ci pci_read_config_word(dev, pos + PCI_SSVID_DEVICE_ID, &dev->subsystem_device); 197662306a36Sopenharmony_ci } 197762306a36Sopenharmony_ci break; 197862306a36Sopenharmony_ci 197962306a36Sopenharmony_ci case PCI_HEADER_TYPE_CARDBUS: /* CardBus bridge header */ 198062306a36Sopenharmony_ci if (class != PCI_CLASS_BRIDGE_CARDBUS) 198162306a36Sopenharmony_ci goto bad; 198262306a36Sopenharmony_ci pci_read_irq(dev); 198362306a36Sopenharmony_ci pci_read_bases(dev, 1, 0); 198462306a36Sopenharmony_ci pci_read_config_word(dev, PCI_CB_SUBSYSTEM_VENDOR_ID, &dev->subsystem_vendor); 198562306a36Sopenharmony_ci pci_read_config_word(dev, PCI_CB_SUBSYSTEM_ID, &dev->subsystem_device); 198662306a36Sopenharmony_ci break; 198762306a36Sopenharmony_ci 198862306a36Sopenharmony_ci default: /* unknown header */ 198962306a36Sopenharmony_ci pci_err(dev, "unknown header type %02x, ignoring device\n", 199062306a36Sopenharmony_ci dev->hdr_type); 199162306a36Sopenharmony_ci pci_release_of_node(dev); 199262306a36Sopenharmony_ci return -EIO; 199362306a36Sopenharmony_ci 199462306a36Sopenharmony_ci bad: 199562306a36Sopenharmony_ci pci_err(dev, "ignoring class %#08x (doesn't match header type %02x)\n", 199662306a36Sopenharmony_ci dev->class, dev->hdr_type); 199762306a36Sopenharmony_ci dev->class = PCI_CLASS_NOT_DEFINED << 8; 199862306a36Sopenharmony_ci } 199962306a36Sopenharmony_ci 200062306a36Sopenharmony_ci /* We found a fine healthy device, go go go... */ 200162306a36Sopenharmony_ci return 0; 200262306a36Sopenharmony_ci} 200362306a36Sopenharmony_ci 200462306a36Sopenharmony_cistatic void pci_configure_mps(struct pci_dev *dev) 200562306a36Sopenharmony_ci{ 200662306a36Sopenharmony_ci struct pci_dev *bridge = pci_upstream_bridge(dev); 200762306a36Sopenharmony_ci int mps, mpss, p_mps, rc; 200862306a36Sopenharmony_ci 200962306a36Sopenharmony_ci if (!pci_is_pcie(dev)) 201062306a36Sopenharmony_ci return; 201162306a36Sopenharmony_ci 201262306a36Sopenharmony_ci /* MPS and MRRS fields are of type 'RsvdP' for VFs, short-circuit out */ 201362306a36Sopenharmony_ci if (dev->is_virtfn) 201462306a36Sopenharmony_ci return; 201562306a36Sopenharmony_ci 201662306a36Sopenharmony_ci /* 201762306a36Sopenharmony_ci * For Root Complex Integrated Endpoints, program the maximum 201862306a36Sopenharmony_ci * supported value unless limited by the PCIE_BUS_PEER2PEER case. 201962306a36Sopenharmony_ci */ 202062306a36Sopenharmony_ci if (pci_pcie_type(dev) == PCI_EXP_TYPE_RC_END) { 202162306a36Sopenharmony_ci if (pcie_bus_config == PCIE_BUS_PEER2PEER) 202262306a36Sopenharmony_ci mps = 128; 202362306a36Sopenharmony_ci else 202462306a36Sopenharmony_ci mps = 128 << dev->pcie_mpss; 202562306a36Sopenharmony_ci rc = pcie_set_mps(dev, mps); 202662306a36Sopenharmony_ci if (rc) { 202762306a36Sopenharmony_ci pci_warn(dev, "can't set Max Payload Size to %d; if necessary, use \"pci=pcie_bus_safe\" and report a bug\n", 202862306a36Sopenharmony_ci mps); 202962306a36Sopenharmony_ci } 203062306a36Sopenharmony_ci return; 203162306a36Sopenharmony_ci } 203262306a36Sopenharmony_ci 203362306a36Sopenharmony_ci if (!bridge || !pci_is_pcie(bridge)) 203462306a36Sopenharmony_ci return; 203562306a36Sopenharmony_ci 203662306a36Sopenharmony_ci mps = pcie_get_mps(dev); 203762306a36Sopenharmony_ci p_mps = pcie_get_mps(bridge); 203862306a36Sopenharmony_ci 203962306a36Sopenharmony_ci if (mps == p_mps) 204062306a36Sopenharmony_ci return; 204162306a36Sopenharmony_ci 204262306a36Sopenharmony_ci if (pcie_bus_config == PCIE_BUS_TUNE_OFF) { 204362306a36Sopenharmony_ci pci_warn(dev, "Max Payload Size %d, but upstream %s set to %d; if necessary, use \"pci=pcie_bus_safe\" and report a bug\n", 204462306a36Sopenharmony_ci mps, pci_name(bridge), p_mps); 204562306a36Sopenharmony_ci return; 204662306a36Sopenharmony_ci } 204762306a36Sopenharmony_ci 204862306a36Sopenharmony_ci /* 204962306a36Sopenharmony_ci * Fancier MPS configuration is done later by 205062306a36Sopenharmony_ci * pcie_bus_configure_settings() 205162306a36Sopenharmony_ci */ 205262306a36Sopenharmony_ci if (pcie_bus_config != PCIE_BUS_DEFAULT) 205362306a36Sopenharmony_ci return; 205462306a36Sopenharmony_ci 205562306a36Sopenharmony_ci mpss = 128 << dev->pcie_mpss; 205662306a36Sopenharmony_ci if (mpss < p_mps && pci_pcie_type(bridge) == PCI_EXP_TYPE_ROOT_PORT) { 205762306a36Sopenharmony_ci pcie_set_mps(bridge, mpss); 205862306a36Sopenharmony_ci pci_info(dev, "Upstream bridge's Max Payload Size set to %d (was %d, max %d)\n", 205962306a36Sopenharmony_ci mpss, p_mps, 128 << bridge->pcie_mpss); 206062306a36Sopenharmony_ci p_mps = pcie_get_mps(bridge); 206162306a36Sopenharmony_ci } 206262306a36Sopenharmony_ci 206362306a36Sopenharmony_ci rc = pcie_set_mps(dev, p_mps); 206462306a36Sopenharmony_ci if (rc) { 206562306a36Sopenharmony_ci pci_warn(dev, "can't set Max Payload Size to %d; if necessary, use \"pci=pcie_bus_safe\" and report a bug\n", 206662306a36Sopenharmony_ci p_mps); 206762306a36Sopenharmony_ci return; 206862306a36Sopenharmony_ci } 206962306a36Sopenharmony_ci 207062306a36Sopenharmony_ci pci_info(dev, "Max Payload Size set to %d (was %d, max %d)\n", 207162306a36Sopenharmony_ci p_mps, mps, mpss); 207262306a36Sopenharmony_ci} 207362306a36Sopenharmony_ci 207462306a36Sopenharmony_ciint pci_configure_extended_tags(struct pci_dev *dev, void *ign) 207562306a36Sopenharmony_ci{ 207662306a36Sopenharmony_ci struct pci_host_bridge *host; 207762306a36Sopenharmony_ci u32 cap; 207862306a36Sopenharmony_ci u16 ctl; 207962306a36Sopenharmony_ci int ret; 208062306a36Sopenharmony_ci 208162306a36Sopenharmony_ci if (!pci_is_pcie(dev)) 208262306a36Sopenharmony_ci return 0; 208362306a36Sopenharmony_ci 208462306a36Sopenharmony_ci ret = pcie_capability_read_dword(dev, PCI_EXP_DEVCAP, &cap); 208562306a36Sopenharmony_ci if (ret) 208662306a36Sopenharmony_ci return 0; 208762306a36Sopenharmony_ci 208862306a36Sopenharmony_ci if (!(cap & PCI_EXP_DEVCAP_EXT_TAG)) 208962306a36Sopenharmony_ci return 0; 209062306a36Sopenharmony_ci 209162306a36Sopenharmony_ci ret = pcie_capability_read_word(dev, PCI_EXP_DEVCTL, &ctl); 209262306a36Sopenharmony_ci if (ret) 209362306a36Sopenharmony_ci return 0; 209462306a36Sopenharmony_ci 209562306a36Sopenharmony_ci host = pci_find_host_bridge(dev->bus); 209662306a36Sopenharmony_ci if (!host) 209762306a36Sopenharmony_ci return 0; 209862306a36Sopenharmony_ci 209962306a36Sopenharmony_ci /* 210062306a36Sopenharmony_ci * If some device in the hierarchy doesn't handle Extended Tags 210162306a36Sopenharmony_ci * correctly, make sure they're disabled. 210262306a36Sopenharmony_ci */ 210362306a36Sopenharmony_ci if (host->no_ext_tags) { 210462306a36Sopenharmony_ci if (ctl & PCI_EXP_DEVCTL_EXT_TAG) { 210562306a36Sopenharmony_ci pci_info(dev, "disabling Extended Tags\n"); 210662306a36Sopenharmony_ci pcie_capability_clear_word(dev, PCI_EXP_DEVCTL, 210762306a36Sopenharmony_ci PCI_EXP_DEVCTL_EXT_TAG); 210862306a36Sopenharmony_ci } 210962306a36Sopenharmony_ci return 0; 211062306a36Sopenharmony_ci } 211162306a36Sopenharmony_ci 211262306a36Sopenharmony_ci if (!(ctl & PCI_EXP_DEVCTL_EXT_TAG)) { 211362306a36Sopenharmony_ci pci_info(dev, "enabling Extended Tags\n"); 211462306a36Sopenharmony_ci pcie_capability_set_word(dev, PCI_EXP_DEVCTL, 211562306a36Sopenharmony_ci PCI_EXP_DEVCTL_EXT_TAG); 211662306a36Sopenharmony_ci } 211762306a36Sopenharmony_ci return 0; 211862306a36Sopenharmony_ci} 211962306a36Sopenharmony_ci 212062306a36Sopenharmony_ci/** 212162306a36Sopenharmony_ci * pcie_relaxed_ordering_enabled - Probe for PCIe relaxed ordering enable 212262306a36Sopenharmony_ci * @dev: PCI device to query 212362306a36Sopenharmony_ci * 212462306a36Sopenharmony_ci * Returns true if the device has enabled relaxed ordering attribute. 212562306a36Sopenharmony_ci */ 212662306a36Sopenharmony_cibool pcie_relaxed_ordering_enabled(struct pci_dev *dev) 212762306a36Sopenharmony_ci{ 212862306a36Sopenharmony_ci u16 v; 212962306a36Sopenharmony_ci 213062306a36Sopenharmony_ci pcie_capability_read_word(dev, PCI_EXP_DEVCTL, &v); 213162306a36Sopenharmony_ci 213262306a36Sopenharmony_ci return !!(v & PCI_EXP_DEVCTL_RELAX_EN); 213362306a36Sopenharmony_ci} 213462306a36Sopenharmony_ciEXPORT_SYMBOL(pcie_relaxed_ordering_enabled); 213562306a36Sopenharmony_ci 213662306a36Sopenharmony_cistatic void pci_configure_relaxed_ordering(struct pci_dev *dev) 213762306a36Sopenharmony_ci{ 213862306a36Sopenharmony_ci struct pci_dev *root; 213962306a36Sopenharmony_ci 214062306a36Sopenharmony_ci /* PCI_EXP_DEVCTL_RELAX_EN is RsvdP in VFs */ 214162306a36Sopenharmony_ci if (dev->is_virtfn) 214262306a36Sopenharmony_ci return; 214362306a36Sopenharmony_ci 214462306a36Sopenharmony_ci if (!pcie_relaxed_ordering_enabled(dev)) 214562306a36Sopenharmony_ci return; 214662306a36Sopenharmony_ci 214762306a36Sopenharmony_ci /* 214862306a36Sopenharmony_ci * For now, we only deal with Relaxed Ordering issues with Root 214962306a36Sopenharmony_ci * Ports. Peer-to-Peer DMA is another can of worms. 215062306a36Sopenharmony_ci */ 215162306a36Sopenharmony_ci root = pcie_find_root_port(dev); 215262306a36Sopenharmony_ci if (!root) 215362306a36Sopenharmony_ci return; 215462306a36Sopenharmony_ci 215562306a36Sopenharmony_ci if (root->dev_flags & PCI_DEV_FLAGS_NO_RELAXED_ORDERING) { 215662306a36Sopenharmony_ci pcie_capability_clear_word(dev, PCI_EXP_DEVCTL, 215762306a36Sopenharmony_ci PCI_EXP_DEVCTL_RELAX_EN); 215862306a36Sopenharmony_ci pci_info(dev, "Relaxed Ordering disabled because the Root Port didn't support it\n"); 215962306a36Sopenharmony_ci } 216062306a36Sopenharmony_ci} 216162306a36Sopenharmony_ci 216262306a36Sopenharmony_cistatic void pci_configure_ltr(struct pci_dev *dev) 216362306a36Sopenharmony_ci{ 216462306a36Sopenharmony_ci#ifdef CONFIG_PCIEASPM 216562306a36Sopenharmony_ci struct pci_host_bridge *host = pci_find_host_bridge(dev->bus); 216662306a36Sopenharmony_ci struct pci_dev *bridge; 216762306a36Sopenharmony_ci u32 cap, ctl; 216862306a36Sopenharmony_ci 216962306a36Sopenharmony_ci if (!pci_is_pcie(dev)) 217062306a36Sopenharmony_ci return; 217162306a36Sopenharmony_ci 217262306a36Sopenharmony_ci /* Read L1 PM substate capabilities */ 217362306a36Sopenharmony_ci dev->l1ss = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_L1SS); 217462306a36Sopenharmony_ci 217562306a36Sopenharmony_ci pcie_capability_read_dword(dev, PCI_EXP_DEVCAP2, &cap); 217662306a36Sopenharmony_ci if (!(cap & PCI_EXP_DEVCAP2_LTR)) 217762306a36Sopenharmony_ci return; 217862306a36Sopenharmony_ci 217962306a36Sopenharmony_ci pcie_capability_read_dword(dev, PCI_EXP_DEVCTL2, &ctl); 218062306a36Sopenharmony_ci if (ctl & PCI_EXP_DEVCTL2_LTR_EN) { 218162306a36Sopenharmony_ci if (pci_pcie_type(dev) == PCI_EXP_TYPE_ROOT_PORT) { 218262306a36Sopenharmony_ci dev->ltr_path = 1; 218362306a36Sopenharmony_ci return; 218462306a36Sopenharmony_ci } 218562306a36Sopenharmony_ci 218662306a36Sopenharmony_ci bridge = pci_upstream_bridge(dev); 218762306a36Sopenharmony_ci if (bridge && bridge->ltr_path) 218862306a36Sopenharmony_ci dev->ltr_path = 1; 218962306a36Sopenharmony_ci 219062306a36Sopenharmony_ci return; 219162306a36Sopenharmony_ci } 219262306a36Sopenharmony_ci 219362306a36Sopenharmony_ci if (!host->native_ltr) 219462306a36Sopenharmony_ci return; 219562306a36Sopenharmony_ci 219662306a36Sopenharmony_ci /* 219762306a36Sopenharmony_ci * Software must not enable LTR in an Endpoint unless the Root 219862306a36Sopenharmony_ci * Complex and all intermediate Switches indicate support for LTR. 219962306a36Sopenharmony_ci * PCIe r4.0, sec 6.18. 220062306a36Sopenharmony_ci */ 220162306a36Sopenharmony_ci if (pci_pcie_type(dev) == PCI_EXP_TYPE_ROOT_PORT) { 220262306a36Sopenharmony_ci pcie_capability_set_word(dev, PCI_EXP_DEVCTL2, 220362306a36Sopenharmony_ci PCI_EXP_DEVCTL2_LTR_EN); 220462306a36Sopenharmony_ci dev->ltr_path = 1; 220562306a36Sopenharmony_ci return; 220662306a36Sopenharmony_ci } 220762306a36Sopenharmony_ci 220862306a36Sopenharmony_ci /* 220962306a36Sopenharmony_ci * If we're configuring a hot-added device, LTR was likely 221062306a36Sopenharmony_ci * disabled in the upstream bridge, so re-enable it before enabling 221162306a36Sopenharmony_ci * it in the new device. 221262306a36Sopenharmony_ci */ 221362306a36Sopenharmony_ci bridge = pci_upstream_bridge(dev); 221462306a36Sopenharmony_ci if (bridge && bridge->ltr_path) { 221562306a36Sopenharmony_ci pci_bridge_reconfigure_ltr(dev); 221662306a36Sopenharmony_ci pcie_capability_set_word(dev, PCI_EXP_DEVCTL2, 221762306a36Sopenharmony_ci PCI_EXP_DEVCTL2_LTR_EN); 221862306a36Sopenharmony_ci dev->ltr_path = 1; 221962306a36Sopenharmony_ci } 222062306a36Sopenharmony_ci#endif 222162306a36Sopenharmony_ci} 222262306a36Sopenharmony_ci 222362306a36Sopenharmony_cistatic void pci_configure_eetlp_prefix(struct pci_dev *dev) 222462306a36Sopenharmony_ci{ 222562306a36Sopenharmony_ci#ifdef CONFIG_PCI_PASID 222662306a36Sopenharmony_ci struct pci_dev *bridge; 222762306a36Sopenharmony_ci int pcie_type; 222862306a36Sopenharmony_ci u32 cap; 222962306a36Sopenharmony_ci 223062306a36Sopenharmony_ci if (!pci_is_pcie(dev)) 223162306a36Sopenharmony_ci return; 223262306a36Sopenharmony_ci 223362306a36Sopenharmony_ci pcie_capability_read_dword(dev, PCI_EXP_DEVCAP2, &cap); 223462306a36Sopenharmony_ci if (!(cap & PCI_EXP_DEVCAP2_EE_PREFIX)) 223562306a36Sopenharmony_ci return; 223662306a36Sopenharmony_ci 223762306a36Sopenharmony_ci pcie_type = pci_pcie_type(dev); 223862306a36Sopenharmony_ci if (pcie_type == PCI_EXP_TYPE_ROOT_PORT || 223962306a36Sopenharmony_ci pcie_type == PCI_EXP_TYPE_RC_END) 224062306a36Sopenharmony_ci dev->eetlp_prefix_path = 1; 224162306a36Sopenharmony_ci else { 224262306a36Sopenharmony_ci bridge = pci_upstream_bridge(dev); 224362306a36Sopenharmony_ci if (bridge && bridge->eetlp_prefix_path) 224462306a36Sopenharmony_ci dev->eetlp_prefix_path = 1; 224562306a36Sopenharmony_ci } 224662306a36Sopenharmony_ci#endif 224762306a36Sopenharmony_ci} 224862306a36Sopenharmony_ci 224962306a36Sopenharmony_cistatic void pci_configure_serr(struct pci_dev *dev) 225062306a36Sopenharmony_ci{ 225162306a36Sopenharmony_ci u16 control; 225262306a36Sopenharmony_ci 225362306a36Sopenharmony_ci if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE) { 225462306a36Sopenharmony_ci 225562306a36Sopenharmony_ci /* 225662306a36Sopenharmony_ci * A bridge will not forward ERR_ messages coming from an 225762306a36Sopenharmony_ci * endpoint unless SERR# forwarding is enabled. 225862306a36Sopenharmony_ci */ 225962306a36Sopenharmony_ci pci_read_config_word(dev, PCI_BRIDGE_CONTROL, &control); 226062306a36Sopenharmony_ci if (!(control & PCI_BRIDGE_CTL_SERR)) { 226162306a36Sopenharmony_ci control |= PCI_BRIDGE_CTL_SERR; 226262306a36Sopenharmony_ci pci_write_config_word(dev, PCI_BRIDGE_CONTROL, control); 226362306a36Sopenharmony_ci } 226462306a36Sopenharmony_ci } 226562306a36Sopenharmony_ci} 226662306a36Sopenharmony_ci 226762306a36Sopenharmony_cistatic void pci_configure_device(struct pci_dev *dev) 226862306a36Sopenharmony_ci{ 226962306a36Sopenharmony_ci pci_configure_mps(dev); 227062306a36Sopenharmony_ci pci_configure_extended_tags(dev, NULL); 227162306a36Sopenharmony_ci pci_configure_relaxed_ordering(dev); 227262306a36Sopenharmony_ci pci_configure_ltr(dev); 227362306a36Sopenharmony_ci pci_configure_eetlp_prefix(dev); 227462306a36Sopenharmony_ci pci_configure_serr(dev); 227562306a36Sopenharmony_ci 227662306a36Sopenharmony_ci pci_acpi_program_hp_params(dev); 227762306a36Sopenharmony_ci} 227862306a36Sopenharmony_ci 227962306a36Sopenharmony_cistatic void pci_release_capabilities(struct pci_dev *dev) 228062306a36Sopenharmony_ci{ 228162306a36Sopenharmony_ci pci_aer_exit(dev); 228262306a36Sopenharmony_ci pci_rcec_exit(dev); 228362306a36Sopenharmony_ci pci_iov_release(dev); 228462306a36Sopenharmony_ci pci_free_cap_save_buffers(dev); 228562306a36Sopenharmony_ci} 228662306a36Sopenharmony_ci 228762306a36Sopenharmony_ci/** 228862306a36Sopenharmony_ci * pci_release_dev - Free a PCI device structure when all users of it are 228962306a36Sopenharmony_ci * finished 229062306a36Sopenharmony_ci * @dev: device that's been disconnected 229162306a36Sopenharmony_ci * 229262306a36Sopenharmony_ci * Will be called only by the device core when all users of this PCI device are 229362306a36Sopenharmony_ci * done. 229462306a36Sopenharmony_ci */ 229562306a36Sopenharmony_cistatic void pci_release_dev(struct device *dev) 229662306a36Sopenharmony_ci{ 229762306a36Sopenharmony_ci struct pci_dev *pci_dev; 229862306a36Sopenharmony_ci 229962306a36Sopenharmony_ci pci_dev = to_pci_dev(dev); 230062306a36Sopenharmony_ci pci_release_capabilities(pci_dev); 230162306a36Sopenharmony_ci pci_release_of_node(pci_dev); 230262306a36Sopenharmony_ci pcibios_release_device(pci_dev); 230362306a36Sopenharmony_ci pci_bus_put(pci_dev->bus); 230462306a36Sopenharmony_ci kfree(pci_dev->driver_override); 230562306a36Sopenharmony_ci bitmap_free(pci_dev->dma_alias_mask); 230662306a36Sopenharmony_ci dev_dbg(dev, "device released\n"); 230762306a36Sopenharmony_ci kfree(pci_dev); 230862306a36Sopenharmony_ci} 230962306a36Sopenharmony_ci 231062306a36Sopenharmony_cistruct pci_dev *pci_alloc_dev(struct pci_bus *bus) 231162306a36Sopenharmony_ci{ 231262306a36Sopenharmony_ci struct pci_dev *dev; 231362306a36Sopenharmony_ci 231462306a36Sopenharmony_ci dev = kzalloc(sizeof(struct pci_dev), GFP_KERNEL); 231562306a36Sopenharmony_ci if (!dev) 231662306a36Sopenharmony_ci return NULL; 231762306a36Sopenharmony_ci 231862306a36Sopenharmony_ci INIT_LIST_HEAD(&dev->bus_list); 231962306a36Sopenharmony_ci dev->dev.type = &pci_dev_type; 232062306a36Sopenharmony_ci dev->bus = pci_bus_get(bus); 232162306a36Sopenharmony_ci dev->driver_exclusive_resource = (struct resource) { 232262306a36Sopenharmony_ci .name = "PCI Exclusive", 232362306a36Sopenharmony_ci .start = 0, 232462306a36Sopenharmony_ci .end = -1, 232562306a36Sopenharmony_ci }; 232662306a36Sopenharmony_ci 232762306a36Sopenharmony_ci spin_lock_init(&dev->pcie_cap_lock); 232862306a36Sopenharmony_ci#ifdef CONFIG_PCI_MSI 232962306a36Sopenharmony_ci raw_spin_lock_init(&dev->msi_lock); 233062306a36Sopenharmony_ci#endif 233162306a36Sopenharmony_ci return dev; 233262306a36Sopenharmony_ci} 233362306a36Sopenharmony_ciEXPORT_SYMBOL(pci_alloc_dev); 233462306a36Sopenharmony_ci 233562306a36Sopenharmony_cistatic bool pci_bus_crs_vendor_id(u32 l) 233662306a36Sopenharmony_ci{ 233762306a36Sopenharmony_ci return (l & 0xffff) == PCI_VENDOR_ID_PCI_SIG; 233862306a36Sopenharmony_ci} 233962306a36Sopenharmony_ci 234062306a36Sopenharmony_cistatic bool pci_bus_wait_crs(struct pci_bus *bus, int devfn, u32 *l, 234162306a36Sopenharmony_ci int timeout) 234262306a36Sopenharmony_ci{ 234362306a36Sopenharmony_ci int delay = 1; 234462306a36Sopenharmony_ci 234562306a36Sopenharmony_ci if (!pci_bus_crs_vendor_id(*l)) 234662306a36Sopenharmony_ci return true; /* not a CRS completion */ 234762306a36Sopenharmony_ci 234862306a36Sopenharmony_ci if (!timeout) 234962306a36Sopenharmony_ci return false; /* CRS, but caller doesn't want to wait */ 235062306a36Sopenharmony_ci 235162306a36Sopenharmony_ci /* 235262306a36Sopenharmony_ci * We got the reserved Vendor ID that indicates a completion with 235362306a36Sopenharmony_ci * Configuration Request Retry Status (CRS). Retry until we get a 235462306a36Sopenharmony_ci * valid Vendor ID or we time out. 235562306a36Sopenharmony_ci */ 235662306a36Sopenharmony_ci while (pci_bus_crs_vendor_id(*l)) { 235762306a36Sopenharmony_ci if (delay > timeout) { 235862306a36Sopenharmony_ci pr_warn("pci %04x:%02x:%02x.%d: not ready after %dms; giving up\n", 235962306a36Sopenharmony_ci pci_domain_nr(bus), bus->number, 236062306a36Sopenharmony_ci PCI_SLOT(devfn), PCI_FUNC(devfn), delay - 1); 236162306a36Sopenharmony_ci 236262306a36Sopenharmony_ci return false; 236362306a36Sopenharmony_ci } 236462306a36Sopenharmony_ci if (delay >= 1000) 236562306a36Sopenharmony_ci pr_info("pci %04x:%02x:%02x.%d: not ready after %dms; waiting\n", 236662306a36Sopenharmony_ci pci_domain_nr(bus), bus->number, 236762306a36Sopenharmony_ci PCI_SLOT(devfn), PCI_FUNC(devfn), delay - 1); 236862306a36Sopenharmony_ci 236962306a36Sopenharmony_ci msleep(delay); 237062306a36Sopenharmony_ci delay *= 2; 237162306a36Sopenharmony_ci 237262306a36Sopenharmony_ci if (pci_bus_read_config_dword(bus, devfn, PCI_VENDOR_ID, l)) 237362306a36Sopenharmony_ci return false; 237462306a36Sopenharmony_ci } 237562306a36Sopenharmony_ci 237662306a36Sopenharmony_ci if (delay >= 1000) 237762306a36Sopenharmony_ci pr_info("pci %04x:%02x:%02x.%d: ready after %dms\n", 237862306a36Sopenharmony_ci pci_domain_nr(bus), bus->number, 237962306a36Sopenharmony_ci PCI_SLOT(devfn), PCI_FUNC(devfn), delay - 1); 238062306a36Sopenharmony_ci 238162306a36Sopenharmony_ci return true; 238262306a36Sopenharmony_ci} 238362306a36Sopenharmony_ci 238462306a36Sopenharmony_cibool pci_bus_generic_read_dev_vendor_id(struct pci_bus *bus, int devfn, u32 *l, 238562306a36Sopenharmony_ci int timeout) 238662306a36Sopenharmony_ci{ 238762306a36Sopenharmony_ci if (pci_bus_read_config_dword(bus, devfn, PCI_VENDOR_ID, l)) 238862306a36Sopenharmony_ci return false; 238962306a36Sopenharmony_ci 239062306a36Sopenharmony_ci /* Some broken boards return 0 or ~0 (PCI_ERROR_RESPONSE) if a slot is empty: */ 239162306a36Sopenharmony_ci if (PCI_POSSIBLE_ERROR(*l) || *l == 0x00000000 || 239262306a36Sopenharmony_ci *l == 0x0000ffff || *l == 0xffff0000) 239362306a36Sopenharmony_ci return false; 239462306a36Sopenharmony_ci 239562306a36Sopenharmony_ci if (pci_bus_crs_vendor_id(*l)) 239662306a36Sopenharmony_ci return pci_bus_wait_crs(bus, devfn, l, timeout); 239762306a36Sopenharmony_ci 239862306a36Sopenharmony_ci return true; 239962306a36Sopenharmony_ci} 240062306a36Sopenharmony_ci 240162306a36Sopenharmony_cibool pci_bus_read_dev_vendor_id(struct pci_bus *bus, int devfn, u32 *l, 240262306a36Sopenharmony_ci int timeout) 240362306a36Sopenharmony_ci{ 240462306a36Sopenharmony_ci#ifdef CONFIG_PCI_QUIRKS 240562306a36Sopenharmony_ci struct pci_dev *bridge = bus->self; 240662306a36Sopenharmony_ci 240762306a36Sopenharmony_ci /* 240862306a36Sopenharmony_ci * Certain IDT switches have an issue where they improperly trigger 240962306a36Sopenharmony_ci * ACS Source Validation errors on completions for config reads. 241062306a36Sopenharmony_ci */ 241162306a36Sopenharmony_ci if (bridge && bridge->vendor == PCI_VENDOR_ID_IDT && 241262306a36Sopenharmony_ci bridge->device == 0x80b5) 241362306a36Sopenharmony_ci return pci_idt_bus_quirk(bus, devfn, l, timeout); 241462306a36Sopenharmony_ci#endif 241562306a36Sopenharmony_ci 241662306a36Sopenharmony_ci return pci_bus_generic_read_dev_vendor_id(bus, devfn, l, timeout); 241762306a36Sopenharmony_ci} 241862306a36Sopenharmony_ciEXPORT_SYMBOL(pci_bus_read_dev_vendor_id); 241962306a36Sopenharmony_ci 242062306a36Sopenharmony_ci/* 242162306a36Sopenharmony_ci * Read the config data for a PCI device, sanity-check it, 242262306a36Sopenharmony_ci * and fill in the dev structure. 242362306a36Sopenharmony_ci */ 242462306a36Sopenharmony_cistatic struct pci_dev *pci_scan_device(struct pci_bus *bus, int devfn) 242562306a36Sopenharmony_ci{ 242662306a36Sopenharmony_ci struct pci_dev *dev; 242762306a36Sopenharmony_ci u32 l; 242862306a36Sopenharmony_ci 242962306a36Sopenharmony_ci if (!pci_bus_read_dev_vendor_id(bus, devfn, &l, 60*1000)) 243062306a36Sopenharmony_ci return NULL; 243162306a36Sopenharmony_ci 243262306a36Sopenharmony_ci dev = pci_alloc_dev(bus); 243362306a36Sopenharmony_ci if (!dev) 243462306a36Sopenharmony_ci return NULL; 243562306a36Sopenharmony_ci 243662306a36Sopenharmony_ci dev->devfn = devfn; 243762306a36Sopenharmony_ci dev->vendor = l & 0xffff; 243862306a36Sopenharmony_ci dev->device = (l >> 16) & 0xffff; 243962306a36Sopenharmony_ci 244062306a36Sopenharmony_ci if (pci_setup_device(dev)) { 244162306a36Sopenharmony_ci pci_bus_put(dev->bus); 244262306a36Sopenharmony_ci kfree(dev); 244362306a36Sopenharmony_ci return NULL; 244462306a36Sopenharmony_ci } 244562306a36Sopenharmony_ci 244662306a36Sopenharmony_ci return dev; 244762306a36Sopenharmony_ci} 244862306a36Sopenharmony_ci 244962306a36Sopenharmony_civoid pcie_report_downtraining(struct pci_dev *dev) 245062306a36Sopenharmony_ci{ 245162306a36Sopenharmony_ci if (!pci_is_pcie(dev)) 245262306a36Sopenharmony_ci return; 245362306a36Sopenharmony_ci 245462306a36Sopenharmony_ci /* Look from the device up to avoid downstream ports with no devices */ 245562306a36Sopenharmony_ci if ((pci_pcie_type(dev) != PCI_EXP_TYPE_ENDPOINT) && 245662306a36Sopenharmony_ci (pci_pcie_type(dev) != PCI_EXP_TYPE_LEG_END) && 245762306a36Sopenharmony_ci (pci_pcie_type(dev) != PCI_EXP_TYPE_UPSTREAM)) 245862306a36Sopenharmony_ci return; 245962306a36Sopenharmony_ci 246062306a36Sopenharmony_ci /* Multi-function PCIe devices share the same link/status */ 246162306a36Sopenharmony_ci if (PCI_FUNC(dev->devfn) != 0 || dev->is_virtfn) 246262306a36Sopenharmony_ci return; 246362306a36Sopenharmony_ci 246462306a36Sopenharmony_ci /* Print link status only if the device is constrained by the fabric */ 246562306a36Sopenharmony_ci __pcie_print_link_status(dev, false); 246662306a36Sopenharmony_ci} 246762306a36Sopenharmony_ci 246862306a36Sopenharmony_cistatic void pci_init_capabilities(struct pci_dev *dev) 246962306a36Sopenharmony_ci{ 247062306a36Sopenharmony_ci pci_ea_init(dev); /* Enhanced Allocation */ 247162306a36Sopenharmony_ci pci_msi_init(dev); /* Disable MSI */ 247262306a36Sopenharmony_ci pci_msix_init(dev); /* Disable MSI-X */ 247362306a36Sopenharmony_ci 247462306a36Sopenharmony_ci /* Buffers for saving PCIe and PCI-X capabilities */ 247562306a36Sopenharmony_ci pci_allocate_cap_save_buffers(dev); 247662306a36Sopenharmony_ci 247762306a36Sopenharmony_ci pci_pm_init(dev); /* Power Management */ 247862306a36Sopenharmony_ci pci_vpd_init(dev); /* Vital Product Data */ 247962306a36Sopenharmony_ci pci_configure_ari(dev); /* Alternative Routing-ID Forwarding */ 248062306a36Sopenharmony_ci pci_iov_init(dev); /* Single Root I/O Virtualization */ 248162306a36Sopenharmony_ci pci_ats_init(dev); /* Address Translation Services */ 248262306a36Sopenharmony_ci pci_pri_init(dev); /* Page Request Interface */ 248362306a36Sopenharmony_ci pci_pasid_init(dev); /* Process Address Space ID */ 248462306a36Sopenharmony_ci pci_acs_init(dev); /* Access Control Services */ 248562306a36Sopenharmony_ci pci_ptm_init(dev); /* Precision Time Measurement */ 248662306a36Sopenharmony_ci pci_aer_init(dev); /* Advanced Error Reporting */ 248762306a36Sopenharmony_ci pci_dpc_init(dev); /* Downstream Port Containment */ 248862306a36Sopenharmony_ci pci_rcec_init(dev); /* Root Complex Event Collector */ 248962306a36Sopenharmony_ci pci_doe_init(dev); /* Data Object Exchange */ 249062306a36Sopenharmony_ci 249162306a36Sopenharmony_ci pcie_report_downtraining(dev); 249262306a36Sopenharmony_ci pci_init_reset_methods(dev); 249362306a36Sopenharmony_ci} 249462306a36Sopenharmony_ci 249562306a36Sopenharmony_ci/* 249662306a36Sopenharmony_ci * This is the equivalent of pci_host_bridge_msi_domain() that acts on 249762306a36Sopenharmony_ci * devices. Firmware interfaces that can select the MSI domain on a 249862306a36Sopenharmony_ci * per-device basis should be called from here. 249962306a36Sopenharmony_ci */ 250062306a36Sopenharmony_cistatic struct irq_domain *pci_dev_msi_domain(struct pci_dev *dev) 250162306a36Sopenharmony_ci{ 250262306a36Sopenharmony_ci struct irq_domain *d; 250362306a36Sopenharmony_ci 250462306a36Sopenharmony_ci /* 250562306a36Sopenharmony_ci * If a domain has been set through the pcibios_device_add() 250662306a36Sopenharmony_ci * callback, then this is the one (platform code knows best). 250762306a36Sopenharmony_ci */ 250862306a36Sopenharmony_ci d = dev_get_msi_domain(&dev->dev); 250962306a36Sopenharmony_ci if (d) 251062306a36Sopenharmony_ci return d; 251162306a36Sopenharmony_ci 251262306a36Sopenharmony_ci /* 251362306a36Sopenharmony_ci * Let's see if we have a firmware interface able to provide 251462306a36Sopenharmony_ci * the domain. 251562306a36Sopenharmony_ci */ 251662306a36Sopenharmony_ci d = pci_msi_get_device_domain(dev); 251762306a36Sopenharmony_ci if (d) 251862306a36Sopenharmony_ci return d; 251962306a36Sopenharmony_ci 252062306a36Sopenharmony_ci return NULL; 252162306a36Sopenharmony_ci} 252262306a36Sopenharmony_ci 252362306a36Sopenharmony_cistatic void pci_set_msi_domain(struct pci_dev *dev) 252462306a36Sopenharmony_ci{ 252562306a36Sopenharmony_ci struct irq_domain *d; 252662306a36Sopenharmony_ci 252762306a36Sopenharmony_ci /* 252862306a36Sopenharmony_ci * If the platform or firmware interfaces cannot supply a 252962306a36Sopenharmony_ci * device-specific MSI domain, then inherit the default domain 253062306a36Sopenharmony_ci * from the host bridge itself. 253162306a36Sopenharmony_ci */ 253262306a36Sopenharmony_ci d = pci_dev_msi_domain(dev); 253362306a36Sopenharmony_ci if (!d) 253462306a36Sopenharmony_ci d = dev_get_msi_domain(&dev->bus->dev); 253562306a36Sopenharmony_ci 253662306a36Sopenharmony_ci dev_set_msi_domain(&dev->dev, d); 253762306a36Sopenharmony_ci} 253862306a36Sopenharmony_ci 253962306a36Sopenharmony_civoid pci_device_add(struct pci_dev *dev, struct pci_bus *bus) 254062306a36Sopenharmony_ci{ 254162306a36Sopenharmony_ci int ret; 254262306a36Sopenharmony_ci 254362306a36Sopenharmony_ci pci_configure_device(dev); 254462306a36Sopenharmony_ci 254562306a36Sopenharmony_ci device_initialize(&dev->dev); 254662306a36Sopenharmony_ci dev->dev.release = pci_release_dev; 254762306a36Sopenharmony_ci 254862306a36Sopenharmony_ci set_dev_node(&dev->dev, pcibus_to_node(bus)); 254962306a36Sopenharmony_ci dev->dev.dma_mask = &dev->dma_mask; 255062306a36Sopenharmony_ci dev->dev.dma_parms = &dev->dma_parms; 255162306a36Sopenharmony_ci dev->dev.coherent_dma_mask = 0xffffffffull; 255262306a36Sopenharmony_ci 255362306a36Sopenharmony_ci dma_set_max_seg_size(&dev->dev, 65536); 255462306a36Sopenharmony_ci dma_set_seg_boundary(&dev->dev, 0xffffffff); 255562306a36Sopenharmony_ci 255662306a36Sopenharmony_ci pcie_failed_link_retrain(dev); 255762306a36Sopenharmony_ci 255862306a36Sopenharmony_ci /* Fix up broken headers */ 255962306a36Sopenharmony_ci pci_fixup_device(pci_fixup_header, dev); 256062306a36Sopenharmony_ci 256162306a36Sopenharmony_ci pci_reassigndev_resource_alignment(dev); 256262306a36Sopenharmony_ci 256362306a36Sopenharmony_ci dev->state_saved = false; 256462306a36Sopenharmony_ci 256562306a36Sopenharmony_ci pci_init_capabilities(dev); 256662306a36Sopenharmony_ci 256762306a36Sopenharmony_ci /* 256862306a36Sopenharmony_ci * Add the device to our list of discovered devices 256962306a36Sopenharmony_ci * and the bus list for fixup functions, etc. 257062306a36Sopenharmony_ci */ 257162306a36Sopenharmony_ci down_write(&pci_bus_sem); 257262306a36Sopenharmony_ci list_add_tail(&dev->bus_list, &bus->devices); 257362306a36Sopenharmony_ci up_write(&pci_bus_sem); 257462306a36Sopenharmony_ci 257562306a36Sopenharmony_ci ret = pcibios_device_add(dev); 257662306a36Sopenharmony_ci WARN_ON(ret < 0); 257762306a36Sopenharmony_ci 257862306a36Sopenharmony_ci /* Set up MSI IRQ domain */ 257962306a36Sopenharmony_ci pci_set_msi_domain(dev); 258062306a36Sopenharmony_ci 258162306a36Sopenharmony_ci /* Notifier could use PCI capabilities */ 258262306a36Sopenharmony_ci dev->match_driver = false; 258362306a36Sopenharmony_ci ret = device_add(&dev->dev); 258462306a36Sopenharmony_ci WARN_ON(ret < 0); 258562306a36Sopenharmony_ci} 258662306a36Sopenharmony_ci 258762306a36Sopenharmony_cistruct pci_dev *pci_scan_single_device(struct pci_bus *bus, int devfn) 258862306a36Sopenharmony_ci{ 258962306a36Sopenharmony_ci struct pci_dev *dev; 259062306a36Sopenharmony_ci 259162306a36Sopenharmony_ci dev = pci_get_slot(bus, devfn); 259262306a36Sopenharmony_ci if (dev) { 259362306a36Sopenharmony_ci pci_dev_put(dev); 259462306a36Sopenharmony_ci return dev; 259562306a36Sopenharmony_ci } 259662306a36Sopenharmony_ci 259762306a36Sopenharmony_ci dev = pci_scan_device(bus, devfn); 259862306a36Sopenharmony_ci if (!dev) 259962306a36Sopenharmony_ci return NULL; 260062306a36Sopenharmony_ci 260162306a36Sopenharmony_ci pci_device_add(dev, bus); 260262306a36Sopenharmony_ci 260362306a36Sopenharmony_ci return dev; 260462306a36Sopenharmony_ci} 260562306a36Sopenharmony_ciEXPORT_SYMBOL(pci_scan_single_device); 260662306a36Sopenharmony_ci 260762306a36Sopenharmony_cistatic int next_ari_fn(struct pci_bus *bus, struct pci_dev *dev, int fn) 260862306a36Sopenharmony_ci{ 260962306a36Sopenharmony_ci int pos; 261062306a36Sopenharmony_ci u16 cap = 0; 261162306a36Sopenharmony_ci unsigned int next_fn; 261262306a36Sopenharmony_ci 261362306a36Sopenharmony_ci if (!dev) 261462306a36Sopenharmony_ci return -ENODEV; 261562306a36Sopenharmony_ci 261662306a36Sopenharmony_ci pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ARI); 261762306a36Sopenharmony_ci if (!pos) 261862306a36Sopenharmony_ci return -ENODEV; 261962306a36Sopenharmony_ci 262062306a36Sopenharmony_ci pci_read_config_word(dev, pos + PCI_ARI_CAP, &cap); 262162306a36Sopenharmony_ci next_fn = PCI_ARI_CAP_NFN(cap); 262262306a36Sopenharmony_ci if (next_fn <= fn) 262362306a36Sopenharmony_ci return -ENODEV; /* protect against malformed list */ 262462306a36Sopenharmony_ci 262562306a36Sopenharmony_ci return next_fn; 262662306a36Sopenharmony_ci} 262762306a36Sopenharmony_ci 262862306a36Sopenharmony_cistatic int next_fn(struct pci_bus *bus, struct pci_dev *dev, int fn) 262962306a36Sopenharmony_ci{ 263062306a36Sopenharmony_ci if (pci_ari_enabled(bus)) 263162306a36Sopenharmony_ci return next_ari_fn(bus, dev, fn); 263262306a36Sopenharmony_ci 263362306a36Sopenharmony_ci if (fn >= 7) 263462306a36Sopenharmony_ci return -ENODEV; 263562306a36Sopenharmony_ci /* only multifunction devices may have more functions */ 263662306a36Sopenharmony_ci if (dev && !dev->multifunction) 263762306a36Sopenharmony_ci return -ENODEV; 263862306a36Sopenharmony_ci 263962306a36Sopenharmony_ci return fn + 1; 264062306a36Sopenharmony_ci} 264162306a36Sopenharmony_ci 264262306a36Sopenharmony_cistatic int only_one_child(struct pci_bus *bus) 264362306a36Sopenharmony_ci{ 264462306a36Sopenharmony_ci struct pci_dev *bridge = bus->self; 264562306a36Sopenharmony_ci 264662306a36Sopenharmony_ci /* 264762306a36Sopenharmony_ci * Systems with unusual topologies set PCI_SCAN_ALL_PCIE_DEVS so 264862306a36Sopenharmony_ci * we scan for all possible devices, not just Device 0. 264962306a36Sopenharmony_ci */ 265062306a36Sopenharmony_ci if (pci_has_flag(PCI_SCAN_ALL_PCIE_DEVS)) 265162306a36Sopenharmony_ci return 0; 265262306a36Sopenharmony_ci 265362306a36Sopenharmony_ci /* 265462306a36Sopenharmony_ci * A PCIe Downstream Port normally leads to a Link with only Device 265562306a36Sopenharmony_ci * 0 on it (PCIe spec r3.1, sec 7.3.1). As an optimization, scan 265662306a36Sopenharmony_ci * only for Device 0 in that situation. 265762306a36Sopenharmony_ci */ 265862306a36Sopenharmony_ci if (bridge && pci_is_pcie(bridge) && pcie_downstream_port(bridge)) 265962306a36Sopenharmony_ci return 1; 266062306a36Sopenharmony_ci 266162306a36Sopenharmony_ci return 0; 266262306a36Sopenharmony_ci} 266362306a36Sopenharmony_ci 266462306a36Sopenharmony_ci/** 266562306a36Sopenharmony_ci * pci_scan_slot - Scan a PCI slot on a bus for devices 266662306a36Sopenharmony_ci * @bus: PCI bus to scan 266762306a36Sopenharmony_ci * @devfn: slot number to scan (must have zero function) 266862306a36Sopenharmony_ci * 266962306a36Sopenharmony_ci * Scan a PCI slot on the specified PCI bus for devices, adding 267062306a36Sopenharmony_ci * discovered devices to the @bus->devices list. New devices 267162306a36Sopenharmony_ci * will not have is_added set. 267262306a36Sopenharmony_ci * 267362306a36Sopenharmony_ci * Returns the number of new devices found. 267462306a36Sopenharmony_ci */ 267562306a36Sopenharmony_ciint pci_scan_slot(struct pci_bus *bus, int devfn) 267662306a36Sopenharmony_ci{ 267762306a36Sopenharmony_ci struct pci_dev *dev; 267862306a36Sopenharmony_ci int fn = 0, nr = 0; 267962306a36Sopenharmony_ci 268062306a36Sopenharmony_ci if (only_one_child(bus) && (devfn > 0)) 268162306a36Sopenharmony_ci return 0; /* Already scanned the entire slot */ 268262306a36Sopenharmony_ci 268362306a36Sopenharmony_ci do { 268462306a36Sopenharmony_ci dev = pci_scan_single_device(bus, devfn + fn); 268562306a36Sopenharmony_ci if (dev) { 268662306a36Sopenharmony_ci if (!pci_dev_is_added(dev)) 268762306a36Sopenharmony_ci nr++; 268862306a36Sopenharmony_ci if (fn > 0) 268962306a36Sopenharmony_ci dev->multifunction = 1; 269062306a36Sopenharmony_ci } else if (fn == 0) { 269162306a36Sopenharmony_ci /* 269262306a36Sopenharmony_ci * Function 0 is required unless we are running on 269362306a36Sopenharmony_ci * a hypervisor that passes through individual PCI 269462306a36Sopenharmony_ci * functions. 269562306a36Sopenharmony_ci */ 269662306a36Sopenharmony_ci if (!hypervisor_isolated_pci_functions()) 269762306a36Sopenharmony_ci break; 269862306a36Sopenharmony_ci } 269962306a36Sopenharmony_ci fn = next_fn(bus, dev, fn); 270062306a36Sopenharmony_ci } while (fn >= 0); 270162306a36Sopenharmony_ci 270262306a36Sopenharmony_ci /* Only one slot has PCIe device */ 270362306a36Sopenharmony_ci if (bus->self && nr) 270462306a36Sopenharmony_ci pcie_aspm_init_link_state(bus->self); 270562306a36Sopenharmony_ci 270662306a36Sopenharmony_ci return nr; 270762306a36Sopenharmony_ci} 270862306a36Sopenharmony_ciEXPORT_SYMBOL(pci_scan_slot); 270962306a36Sopenharmony_ci 271062306a36Sopenharmony_cistatic int pcie_find_smpss(struct pci_dev *dev, void *data) 271162306a36Sopenharmony_ci{ 271262306a36Sopenharmony_ci u8 *smpss = data; 271362306a36Sopenharmony_ci 271462306a36Sopenharmony_ci if (!pci_is_pcie(dev)) 271562306a36Sopenharmony_ci return 0; 271662306a36Sopenharmony_ci 271762306a36Sopenharmony_ci /* 271862306a36Sopenharmony_ci * We don't have a way to change MPS settings on devices that have 271962306a36Sopenharmony_ci * drivers attached. A hot-added device might support only the minimum 272062306a36Sopenharmony_ci * MPS setting (MPS=128). Therefore, if the fabric contains a bridge 272162306a36Sopenharmony_ci * where devices may be hot-added, we limit the fabric MPS to 128 so 272262306a36Sopenharmony_ci * hot-added devices will work correctly. 272362306a36Sopenharmony_ci * 272462306a36Sopenharmony_ci * However, if we hot-add a device to a slot directly below a Root 272562306a36Sopenharmony_ci * Port, it's impossible for there to be other existing devices below 272662306a36Sopenharmony_ci * the port. We don't limit the MPS in this case because we can 272762306a36Sopenharmony_ci * reconfigure MPS on both the Root Port and the hot-added device, 272862306a36Sopenharmony_ci * and there are no other devices involved. 272962306a36Sopenharmony_ci * 273062306a36Sopenharmony_ci * Note that this PCIE_BUS_SAFE path assumes no peer-to-peer DMA. 273162306a36Sopenharmony_ci */ 273262306a36Sopenharmony_ci if (dev->is_hotplug_bridge && 273362306a36Sopenharmony_ci pci_pcie_type(dev) != PCI_EXP_TYPE_ROOT_PORT) 273462306a36Sopenharmony_ci *smpss = 0; 273562306a36Sopenharmony_ci 273662306a36Sopenharmony_ci if (*smpss > dev->pcie_mpss) 273762306a36Sopenharmony_ci *smpss = dev->pcie_mpss; 273862306a36Sopenharmony_ci 273962306a36Sopenharmony_ci return 0; 274062306a36Sopenharmony_ci} 274162306a36Sopenharmony_ci 274262306a36Sopenharmony_cistatic void pcie_write_mps(struct pci_dev *dev, int mps) 274362306a36Sopenharmony_ci{ 274462306a36Sopenharmony_ci int rc; 274562306a36Sopenharmony_ci 274662306a36Sopenharmony_ci if (pcie_bus_config == PCIE_BUS_PERFORMANCE) { 274762306a36Sopenharmony_ci mps = 128 << dev->pcie_mpss; 274862306a36Sopenharmony_ci 274962306a36Sopenharmony_ci if (pci_pcie_type(dev) != PCI_EXP_TYPE_ROOT_PORT && 275062306a36Sopenharmony_ci dev->bus->self) 275162306a36Sopenharmony_ci 275262306a36Sopenharmony_ci /* 275362306a36Sopenharmony_ci * For "Performance", the assumption is made that 275462306a36Sopenharmony_ci * downstream communication will never be larger than 275562306a36Sopenharmony_ci * the MRRS. So, the MPS only needs to be configured 275662306a36Sopenharmony_ci * for the upstream communication. This being the case, 275762306a36Sopenharmony_ci * walk from the top down and set the MPS of the child 275862306a36Sopenharmony_ci * to that of the parent bus. 275962306a36Sopenharmony_ci * 276062306a36Sopenharmony_ci * Configure the device MPS with the smaller of the 276162306a36Sopenharmony_ci * device MPSS or the bridge MPS (which is assumed to be 276262306a36Sopenharmony_ci * properly configured at this point to the largest 276362306a36Sopenharmony_ci * allowable MPS based on its parent bus). 276462306a36Sopenharmony_ci */ 276562306a36Sopenharmony_ci mps = min(mps, pcie_get_mps(dev->bus->self)); 276662306a36Sopenharmony_ci } 276762306a36Sopenharmony_ci 276862306a36Sopenharmony_ci rc = pcie_set_mps(dev, mps); 276962306a36Sopenharmony_ci if (rc) 277062306a36Sopenharmony_ci pci_err(dev, "Failed attempting to set the MPS\n"); 277162306a36Sopenharmony_ci} 277262306a36Sopenharmony_ci 277362306a36Sopenharmony_cistatic void pcie_write_mrrs(struct pci_dev *dev) 277462306a36Sopenharmony_ci{ 277562306a36Sopenharmony_ci int rc, mrrs; 277662306a36Sopenharmony_ci 277762306a36Sopenharmony_ci /* 277862306a36Sopenharmony_ci * In the "safe" case, do not configure the MRRS. There appear to be 277962306a36Sopenharmony_ci * issues with setting MRRS to 0 on a number of devices. 278062306a36Sopenharmony_ci */ 278162306a36Sopenharmony_ci if (pcie_bus_config != PCIE_BUS_PERFORMANCE) 278262306a36Sopenharmony_ci return; 278362306a36Sopenharmony_ci 278462306a36Sopenharmony_ci /* 278562306a36Sopenharmony_ci * For max performance, the MRRS must be set to the largest supported 278662306a36Sopenharmony_ci * value. However, it cannot be configured larger than the MPS the 278762306a36Sopenharmony_ci * device or the bus can support. This should already be properly 278862306a36Sopenharmony_ci * configured by a prior call to pcie_write_mps(). 278962306a36Sopenharmony_ci */ 279062306a36Sopenharmony_ci mrrs = pcie_get_mps(dev); 279162306a36Sopenharmony_ci 279262306a36Sopenharmony_ci /* 279362306a36Sopenharmony_ci * MRRS is a R/W register. Invalid values can be written, but a 279462306a36Sopenharmony_ci * subsequent read will verify if the value is acceptable or not. 279562306a36Sopenharmony_ci * If the MRRS value provided is not acceptable (e.g., too large), 279662306a36Sopenharmony_ci * shrink the value until it is acceptable to the HW. 279762306a36Sopenharmony_ci */ 279862306a36Sopenharmony_ci while (mrrs != pcie_get_readrq(dev) && mrrs >= 128) { 279962306a36Sopenharmony_ci rc = pcie_set_readrq(dev, mrrs); 280062306a36Sopenharmony_ci if (!rc) 280162306a36Sopenharmony_ci break; 280262306a36Sopenharmony_ci 280362306a36Sopenharmony_ci pci_warn(dev, "Failed attempting to set the MRRS\n"); 280462306a36Sopenharmony_ci mrrs /= 2; 280562306a36Sopenharmony_ci } 280662306a36Sopenharmony_ci 280762306a36Sopenharmony_ci if (mrrs < 128) 280862306a36Sopenharmony_ci pci_err(dev, "MRRS was unable to be configured with a safe value. If problems are experienced, try running with pci=pcie_bus_safe\n"); 280962306a36Sopenharmony_ci} 281062306a36Sopenharmony_ci 281162306a36Sopenharmony_cistatic int pcie_bus_configure_set(struct pci_dev *dev, void *data) 281262306a36Sopenharmony_ci{ 281362306a36Sopenharmony_ci int mps, orig_mps; 281462306a36Sopenharmony_ci 281562306a36Sopenharmony_ci if (!pci_is_pcie(dev)) 281662306a36Sopenharmony_ci return 0; 281762306a36Sopenharmony_ci 281862306a36Sopenharmony_ci if (pcie_bus_config == PCIE_BUS_TUNE_OFF || 281962306a36Sopenharmony_ci pcie_bus_config == PCIE_BUS_DEFAULT) 282062306a36Sopenharmony_ci return 0; 282162306a36Sopenharmony_ci 282262306a36Sopenharmony_ci mps = 128 << *(u8 *)data; 282362306a36Sopenharmony_ci orig_mps = pcie_get_mps(dev); 282462306a36Sopenharmony_ci 282562306a36Sopenharmony_ci pcie_write_mps(dev, mps); 282662306a36Sopenharmony_ci pcie_write_mrrs(dev); 282762306a36Sopenharmony_ci 282862306a36Sopenharmony_ci pci_info(dev, "Max Payload Size set to %4d/%4d (was %4d), Max Read Rq %4d\n", 282962306a36Sopenharmony_ci pcie_get_mps(dev), 128 << dev->pcie_mpss, 283062306a36Sopenharmony_ci orig_mps, pcie_get_readrq(dev)); 283162306a36Sopenharmony_ci 283262306a36Sopenharmony_ci return 0; 283362306a36Sopenharmony_ci} 283462306a36Sopenharmony_ci 283562306a36Sopenharmony_ci/* 283662306a36Sopenharmony_ci * pcie_bus_configure_settings() requires that pci_walk_bus work in a top-down, 283762306a36Sopenharmony_ci * parents then children fashion. If this changes, then this code will not 283862306a36Sopenharmony_ci * work as designed. 283962306a36Sopenharmony_ci */ 284062306a36Sopenharmony_civoid pcie_bus_configure_settings(struct pci_bus *bus) 284162306a36Sopenharmony_ci{ 284262306a36Sopenharmony_ci u8 smpss = 0; 284362306a36Sopenharmony_ci 284462306a36Sopenharmony_ci if (!bus->self) 284562306a36Sopenharmony_ci return; 284662306a36Sopenharmony_ci 284762306a36Sopenharmony_ci if (!pci_is_pcie(bus->self)) 284862306a36Sopenharmony_ci return; 284962306a36Sopenharmony_ci 285062306a36Sopenharmony_ci /* 285162306a36Sopenharmony_ci * FIXME - Peer to peer DMA is possible, though the endpoint would need 285262306a36Sopenharmony_ci * to be aware of the MPS of the destination. To work around this, 285362306a36Sopenharmony_ci * simply force the MPS of the entire system to the smallest possible. 285462306a36Sopenharmony_ci */ 285562306a36Sopenharmony_ci if (pcie_bus_config == PCIE_BUS_PEER2PEER) 285662306a36Sopenharmony_ci smpss = 0; 285762306a36Sopenharmony_ci 285862306a36Sopenharmony_ci if (pcie_bus_config == PCIE_BUS_SAFE) { 285962306a36Sopenharmony_ci smpss = bus->self->pcie_mpss; 286062306a36Sopenharmony_ci 286162306a36Sopenharmony_ci pcie_find_smpss(bus->self, &smpss); 286262306a36Sopenharmony_ci pci_walk_bus(bus, pcie_find_smpss, &smpss); 286362306a36Sopenharmony_ci } 286462306a36Sopenharmony_ci 286562306a36Sopenharmony_ci pcie_bus_configure_set(bus->self, &smpss); 286662306a36Sopenharmony_ci pci_walk_bus(bus, pcie_bus_configure_set, &smpss); 286762306a36Sopenharmony_ci} 286862306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(pcie_bus_configure_settings); 286962306a36Sopenharmony_ci 287062306a36Sopenharmony_ci/* 287162306a36Sopenharmony_ci * Called after each bus is probed, but before its children are examined. This 287262306a36Sopenharmony_ci * is marked as __weak because multiple architectures define it. 287362306a36Sopenharmony_ci */ 287462306a36Sopenharmony_civoid __weak pcibios_fixup_bus(struct pci_bus *bus) 287562306a36Sopenharmony_ci{ 287662306a36Sopenharmony_ci /* nothing to do, expected to be removed in the future */ 287762306a36Sopenharmony_ci} 287862306a36Sopenharmony_ci 287962306a36Sopenharmony_ci/** 288062306a36Sopenharmony_ci * pci_scan_child_bus_extend() - Scan devices below a bus 288162306a36Sopenharmony_ci * @bus: Bus to scan for devices 288262306a36Sopenharmony_ci * @available_buses: Total number of buses available (%0 does not try to 288362306a36Sopenharmony_ci * extend beyond the minimal) 288462306a36Sopenharmony_ci * 288562306a36Sopenharmony_ci * Scans devices below @bus including subordinate buses. Returns new 288662306a36Sopenharmony_ci * subordinate number including all the found devices. Passing 288762306a36Sopenharmony_ci * @available_buses causes the remaining bus space to be distributed 288862306a36Sopenharmony_ci * equally between hotplug-capable bridges to allow future extension of the 288962306a36Sopenharmony_ci * hierarchy. 289062306a36Sopenharmony_ci */ 289162306a36Sopenharmony_cistatic unsigned int pci_scan_child_bus_extend(struct pci_bus *bus, 289262306a36Sopenharmony_ci unsigned int available_buses) 289362306a36Sopenharmony_ci{ 289462306a36Sopenharmony_ci unsigned int used_buses, normal_bridges = 0, hotplug_bridges = 0; 289562306a36Sopenharmony_ci unsigned int start = bus->busn_res.start; 289662306a36Sopenharmony_ci unsigned int devfn, cmax, max = start; 289762306a36Sopenharmony_ci struct pci_dev *dev; 289862306a36Sopenharmony_ci 289962306a36Sopenharmony_ci dev_dbg(&bus->dev, "scanning bus\n"); 290062306a36Sopenharmony_ci 290162306a36Sopenharmony_ci /* Go find them, Rover! */ 290262306a36Sopenharmony_ci for (devfn = 0; devfn < 256; devfn += 8) 290362306a36Sopenharmony_ci pci_scan_slot(bus, devfn); 290462306a36Sopenharmony_ci 290562306a36Sopenharmony_ci /* Reserve buses for SR-IOV capability */ 290662306a36Sopenharmony_ci used_buses = pci_iov_bus_range(bus); 290762306a36Sopenharmony_ci max += used_buses; 290862306a36Sopenharmony_ci 290962306a36Sopenharmony_ci /* 291062306a36Sopenharmony_ci * After performing arch-dependent fixup of the bus, look behind 291162306a36Sopenharmony_ci * all PCI-to-PCI bridges on this bus. 291262306a36Sopenharmony_ci */ 291362306a36Sopenharmony_ci if (!bus->is_added) { 291462306a36Sopenharmony_ci dev_dbg(&bus->dev, "fixups for bus\n"); 291562306a36Sopenharmony_ci pcibios_fixup_bus(bus); 291662306a36Sopenharmony_ci bus->is_added = 1; 291762306a36Sopenharmony_ci } 291862306a36Sopenharmony_ci 291962306a36Sopenharmony_ci /* 292062306a36Sopenharmony_ci * Calculate how many hotplug bridges and normal bridges there 292162306a36Sopenharmony_ci * are on this bus. We will distribute the additional available 292262306a36Sopenharmony_ci * buses between hotplug bridges. 292362306a36Sopenharmony_ci */ 292462306a36Sopenharmony_ci for_each_pci_bridge(dev, bus) { 292562306a36Sopenharmony_ci if (dev->is_hotplug_bridge) 292662306a36Sopenharmony_ci hotplug_bridges++; 292762306a36Sopenharmony_ci else 292862306a36Sopenharmony_ci normal_bridges++; 292962306a36Sopenharmony_ci } 293062306a36Sopenharmony_ci 293162306a36Sopenharmony_ci /* 293262306a36Sopenharmony_ci * Scan bridges that are already configured. We don't touch them 293362306a36Sopenharmony_ci * unless they are misconfigured (which will be done in the second 293462306a36Sopenharmony_ci * scan below). 293562306a36Sopenharmony_ci */ 293662306a36Sopenharmony_ci for_each_pci_bridge(dev, bus) { 293762306a36Sopenharmony_ci cmax = max; 293862306a36Sopenharmony_ci max = pci_scan_bridge_extend(bus, dev, max, 0, 0); 293962306a36Sopenharmony_ci 294062306a36Sopenharmony_ci /* 294162306a36Sopenharmony_ci * Reserve one bus for each bridge now to avoid extending 294262306a36Sopenharmony_ci * hotplug bridges too much during the second scan below. 294362306a36Sopenharmony_ci */ 294462306a36Sopenharmony_ci used_buses++; 294562306a36Sopenharmony_ci if (max - cmax > 1) 294662306a36Sopenharmony_ci used_buses += max - cmax - 1; 294762306a36Sopenharmony_ci } 294862306a36Sopenharmony_ci 294962306a36Sopenharmony_ci /* Scan bridges that need to be reconfigured */ 295062306a36Sopenharmony_ci for_each_pci_bridge(dev, bus) { 295162306a36Sopenharmony_ci unsigned int buses = 0; 295262306a36Sopenharmony_ci 295362306a36Sopenharmony_ci if (!hotplug_bridges && normal_bridges == 1) { 295462306a36Sopenharmony_ci /* 295562306a36Sopenharmony_ci * There is only one bridge on the bus (upstream 295662306a36Sopenharmony_ci * port) so it gets all available buses which it 295762306a36Sopenharmony_ci * can then distribute to the possible hotplug 295862306a36Sopenharmony_ci * bridges below. 295962306a36Sopenharmony_ci */ 296062306a36Sopenharmony_ci buses = available_buses; 296162306a36Sopenharmony_ci } else if (dev->is_hotplug_bridge) { 296262306a36Sopenharmony_ci /* 296362306a36Sopenharmony_ci * Distribute the extra buses between hotplug 296462306a36Sopenharmony_ci * bridges if any. 296562306a36Sopenharmony_ci */ 296662306a36Sopenharmony_ci buses = available_buses / hotplug_bridges; 296762306a36Sopenharmony_ci buses = min(buses, available_buses - used_buses + 1); 296862306a36Sopenharmony_ci } 296962306a36Sopenharmony_ci 297062306a36Sopenharmony_ci cmax = max; 297162306a36Sopenharmony_ci max = pci_scan_bridge_extend(bus, dev, cmax, buses, 1); 297262306a36Sopenharmony_ci /* One bus is already accounted so don't add it again */ 297362306a36Sopenharmony_ci if (max - cmax > 1) 297462306a36Sopenharmony_ci used_buses += max - cmax - 1; 297562306a36Sopenharmony_ci } 297662306a36Sopenharmony_ci 297762306a36Sopenharmony_ci /* 297862306a36Sopenharmony_ci * Make sure a hotplug bridge has at least the minimum requested 297962306a36Sopenharmony_ci * number of buses but allow it to grow up to the maximum available 298062306a36Sopenharmony_ci * bus number if there is room. 298162306a36Sopenharmony_ci */ 298262306a36Sopenharmony_ci if (bus->self && bus->self->is_hotplug_bridge) { 298362306a36Sopenharmony_ci used_buses = max_t(unsigned int, available_buses, 298462306a36Sopenharmony_ci pci_hotplug_bus_size - 1); 298562306a36Sopenharmony_ci if (max - start < used_buses) { 298662306a36Sopenharmony_ci max = start + used_buses; 298762306a36Sopenharmony_ci 298862306a36Sopenharmony_ci /* Do not allocate more buses than we have room left */ 298962306a36Sopenharmony_ci if (max > bus->busn_res.end) 299062306a36Sopenharmony_ci max = bus->busn_res.end; 299162306a36Sopenharmony_ci 299262306a36Sopenharmony_ci dev_dbg(&bus->dev, "%pR extended by %#02x\n", 299362306a36Sopenharmony_ci &bus->busn_res, max - start); 299462306a36Sopenharmony_ci } 299562306a36Sopenharmony_ci } 299662306a36Sopenharmony_ci 299762306a36Sopenharmony_ci /* 299862306a36Sopenharmony_ci * We've scanned the bus and so we know all about what's on 299962306a36Sopenharmony_ci * the other side of any bridges that may be on this bus plus 300062306a36Sopenharmony_ci * any devices. 300162306a36Sopenharmony_ci * 300262306a36Sopenharmony_ci * Return how far we've got finding sub-buses. 300362306a36Sopenharmony_ci */ 300462306a36Sopenharmony_ci dev_dbg(&bus->dev, "bus scan returning with max=%02x\n", max); 300562306a36Sopenharmony_ci return max; 300662306a36Sopenharmony_ci} 300762306a36Sopenharmony_ci 300862306a36Sopenharmony_ci/** 300962306a36Sopenharmony_ci * pci_scan_child_bus() - Scan devices below a bus 301062306a36Sopenharmony_ci * @bus: Bus to scan for devices 301162306a36Sopenharmony_ci * 301262306a36Sopenharmony_ci * Scans devices below @bus including subordinate buses. Returns new 301362306a36Sopenharmony_ci * subordinate number including all the found devices. 301462306a36Sopenharmony_ci */ 301562306a36Sopenharmony_ciunsigned int pci_scan_child_bus(struct pci_bus *bus) 301662306a36Sopenharmony_ci{ 301762306a36Sopenharmony_ci return pci_scan_child_bus_extend(bus, 0); 301862306a36Sopenharmony_ci} 301962306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(pci_scan_child_bus); 302062306a36Sopenharmony_ci 302162306a36Sopenharmony_ci/** 302262306a36Sopenharmony_ci * pcibios_root_bridge_prepare - Platform-specific host bridge setup 302362306a36Sopenharmony_ci * @bridge: Host bridge to set up 302462306a36Sopenharmony_ci * 302562306a36Sopenharmony_ci * Default empty implementation. Replace with an architecture-specific setup 302662306a36Sopenharmony_ci * routine, if necessary. 302762306a36Sopenharmony_ci */ 302862306a36Sopenharmony_ciint __weak pcibios_root_bridge_prepare(struct pci_host_bridge *bridge) 302962306a36Sopenharmony_ci{ 303062306a36Sopenharmony_ci return 0; 303162306a36Sopenharmony_ci} 303262306a36Sopenharmony_ci 303362306a36Sopenharmony_civoid __weak pcibios_add_bus(struct pci_bus *bus) 303462306a36Sopenharmony_ci{ 303562306a36Sopenharmony_ci} 303662306a36Sopenharmony_ci 303762306a36Sopenharmony_civoid __weak pcibios_remove_bus(struct pci_bus *bus) 303862306a36Sopenharmony_ci{ 303962306a36Sopenharmony_ci} 304062306a36Sopenharmony_ci 304162306a36Sopenharmony_cistruct pci_bus *pci_create_root_bus(struct device *parent, int bus, 304262306a36Sopenharmony_ci struct pci_ops *ops, void *sysdata, struct list_head *resources) 304362306a36Sopenharmony_ci{ 304462306a36Sopenharmony_ci int error; 304562306a36Sopenharmony_ci struct pci_host_bridge *bridge; 304662306a36Sopenharmony_ci 304762306a36Sopenharmony_ci bridge = pci_alloc_host_bridge(0); 304862306a36Sopenharmony_ci if (!bridge) 304962306a36Sopenharmony_ci return NULL; 305062306a36Sopenharmony_ci 305162306a36Sopenharmony_ci bridge->dev.parent = parent; 305262306a36Sopenharmony_ci 305362306a36Sopenharmony_ci list_splice_init(resources, &bridge->windows); 305462306a36Sopenharmony_ci bridge->sysdata = sysdata; 305562306a36Sopenharmony_ci bridge->busnr = bus; 305662306a36Sopenharmony_ci bridge->ops = ops; 305762306a36Sopenharmony_ci 305862306a36Sopenharmony_ci error = pci_register_host_bridge(bridge); 305962306a36Sopenharmony_ci if (error < 0) 306062306a36Sopenharmony_ci goto err_out; 306162306a36Sopenharmony_ci 306262306a36Sopenharmony_ci return bridge->bus; 306362306a36Sopenharmony_ci 306462306a36Sopenharmony_cierr_out: 306562306a36Sopenharmony_ci put_device(&bridge->dev); 306662306a36Sopenharmony_ci return NULL; 306762306a36Sopenharmony_ci} 306862306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(pci_create_root_bus); 306962306a36Sopenharmony_ci 307062306a36Sopenharmony_ciint pci_host_probe(struct pci_host_bridge *bridge) 307162306a36Sopenharmony_ci{ 307262306a36Sopenharmony_ci struct pci_bus *bus, *child; 307362306a36Sopenharmony_ci int ret; 307462306a36Sopenharmony_ci 307562306a36Sopenharmony_ci ret = pci_scan_root_bus_bridge(bridge); 307662306a36Sopenharmony_ci if (ret < 0) { 307762306a36Sopenharmony_ci dev_err(bridge->dev.parent, "Scanning root bridge failed"); 307862306a36Sopenharmony_ci return ret; 307962306a36Sopenharmony_ci } 308062306a36Sopenharmony_ci 308162306a36Sopenharmony_ci bus = bridge->bus; 308262306a36Sopenharmony_ci 308362306a36Sopenharmony_ci /* 308462306a36Sopenharmony_ci * We insert PCI resources into the iomem_resource and 308562306a36Sopenharmony_ci * ioport_resource trees in either pci_bus_claim_resources() 308662306a36Sopenharmony_ci * or pci_bus_assign_resources(). 308762306a36Sopenharmony_ci */ 308862306a36Sopenharmony_ci if (pci_has_flag(PCI_PROBE_ONLY)) { 308962306a36Sopenharmony_ci pci_bus_claim_resources(bus); 309062306a36Sopenharmony_ci } else { 309162306a36Sopenharmony_ci pci_bus_size_bridges(bus); 309262306a36Sopenharmony_ci pci_bus_assign_resources(bus); 309362306a36Sopenharmony_ci 309462306a36Sopenharmony_ci list_for_each_entry(child, &bus->children, node) 309562306a36Sopenharmony_ci pcie_bus_configure_settings(child); 309662306a36Sopenharmony_ci } 309762306a36Sopenharmony_ci 309862306a36Sopenharmony_ci pci_bus_add_devices(bus); 309962306a36Sopenharmony_ci return 0; 310062306a36Sopenharmony_ci} 310162306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(pci_host_probe); 310262306a36Sopenharmony_ci 310362306a36Sopenharmony_ciint pci_bus_insert_busn_res(struct pci_bus *b, int bus, int bus_max) 310462306a36Sopenharmony_ci{ 310562306a36Sopenharmony_ci struct resource *res = &b->busn_res; 310662306a36Sopenharmony_ci struct resource *parent_res, *conflict; 310762306a36Sopenharmony_ci 310862306a36Sopenharmony_ci res->start = bus; 310962306a36Sopenharmony_ci res->end = bus_max; 311062306a36Sopenharmony_ci res->flags = IORESOURCE_BUS; 311162306a36Sopenharmony_ci 311262306a36Sopenharmony_ci if (!pci_is_root_bus(b)) 311362306a36Sopenharmony_ci parent_res = &b->parent->busn_res; 311462306a36Sopenharmony_ci else { 311562306a36Sopenharmony_ci parent_res = get_pci_domain_busn_res(pci_domain_nr(b)); 311662306a36Sopenharmony_ci res->flags |= IORESOURCE_PCI_FIXED; 311762306a36Sopenharmony_ci } 311862306a36Sopenharmony_ci 311962306a36Sopenharmony_ci conflict = request_resource_conflict(parent_res, res); 312062306a36Sopenharmony_ci 312162306a36Sopenharmony_ci if (conflict) 312262306a36Sopenharmony_ci dev_info(&b->dev, 312362306a36Sopenharmony_ci "busn_res: can not insert %pR under %s%pR (conflicts with %s %pR)\n", 312462306a36Sopenharmony_ci res, pci_is_root_bus(b) ? "domain " : "", 312562306a36Sopenharmony_ci parent_res, conflict->name, conflict); 312662306a36Sopenharmony_ci 312762306a36Sopenharmony_ci return conflict == NULL; 312862306a36Sopenharmony_ci} 312962306a36Sopenharmony_ci 313062306a36Sopenharmony_ciint pci_bus_update_busn_res_end(struct pci_bus *b, int bus_max) 313162306a36Sopenharmony_ci{ 313262306a36Sopenharmony_ci struct resource *res = &b->busn_res; 313362306a36Sopenharmony_ci struct resource old_res = *res; 313462306a36Sopenharmony_ci resource_size_t size; 313562306a36Sopenharmony_ci int ret; 313662306a36Sopenharmony_ci 313762306a36Sopenharmony_ci if (res->start > bus_max) 313862306a36Sopenharmony_ci return -EINVAL; 313962306a36Sopenharmony_ci 314062306a36Sopenharmony_ci size = bus_max - res->start + 1; 314162306a36Sopenharmony_ci ret = adjust_resource(res, res->start, size); 314262306a36Sopenharmony_ci dev_info(&b->dev, "busn_res: %pR end %s updated to %02x\n", 314362306a36Sopenharmony_ci &old_res, ret ? "can not be" : "is", bus_max); 314462306a36Sopenharmony_ci 314562306a36Sopenharmony_ci if (!ret && !res->parent) 314662306a36Sopenharmony_ci pci_bus_insert_busn_res(b, res->start, res->end); 314762306a36Sopenharmony_ci 314862306a36Sopenharmony_ci return ret; 314962306a36Sopenharmony_ci} 315062306a36Sopenharmony_ci 315162306a36Sopenharmony_civoid pci_bus_release_busn_res(struct pci_bus *b) 315262306a36Sopenharmony_ci{ 315362306a36Sopenharmony_ci struct resource *res = &b->busn_res; 315462306a36Sopenharmony_ci int ret; 315562306a36Sopenharmony_ci 315662306a36Sopenharmony_ci if (!res->flags || !res->parent) 315762306a36Sopenharmony_ci return; 315862306a36Sopenharmony_ci 315962306a36Sopenharmony_ci ret = release_resource(res); 316062306a36Sopenharmony_ci dev_info(&b->dev, "busn_res: %pR %s released\n", 316162306a36Sopenharmony_ci res, ret ? "can not be" : "is"); 316262306a36Sopenharmony_ci} 316362306a36Sopenharmony_ci 316462306a36Sopenharmony_ciint pci_scan_root_bus_bridge(struct pci_host_bridge *bridge) 316562306a36Sopenharmony_ci{ 316662306a36Sopenharmony_ci struct resource_entry *window; 316762306a36Sopenharmony_ci bool found = false; 316862306a36Sopenharmony_ci struct pci_bus *b; 316962306a36Sopenharmony_ci int max, bus, ret; 317062306a36Sopenharmony_ci 317162306a36Sopenharmony_ci if (!bridge) 317262306a36Sopenharmony_ci return -EINVAL; 317362306a36Sopenharmony_ci 317462306a36Sopenharmony_ci resource_list_for_each_entry(window, &bridge->windows) 317562306a36Sopenharmony_ci if (window->res->flags & IORESOURCE_BUS) { 317662306a36Sopenharmony_ci bridge->busnr = window->res->start; 317762306a36Sopenharmony_ci found = true; 317862306a36Sopenharmony_ci break; 317962306a36Sopenharmony_ci } 318062306a36Sopenharmony_ci 318162306a36Sopenharmony_ci ret = pci_register_host_bridge(bridge); 318262306a36Sopenharmony_ci if (ret < 0) 318362306a36Sopenharmony_ci return ret; 318462306a36Sopenharmony_ci 318562306a36Sopenharmony_ci b = bridge->bus; 318662306a36Sopenharmony_ci bus = bridge->busnr; 318762306a36Sopenharmony_ci 318862306a36Sopenharmony_ci if (!found) { 318962306a36Sopenharmony_ci dev_info(&b->dev, 319062306a36Sopenharmony_ci "No busn resource found for root bus, will use [bus %02x-ff]\n", 319162306a36Sopenharmony_ci bus); 319262306a36Sopenharmony_ci pci_bus_insert_busn_res(b, bus, 255); 319362306a36Sopenharmony_ci } 319462306a36Sopenharmony_ci 319562306a36Sopenharmony_ci max = pci_scan_child_bus(b); 319662306a36Sopenharmony_ci 319762306a36Sopenharmony_ci if (!found) 319862306a36Sopenharmony_ci pci_bus_update_busn_res_end(b, max); 319962306a36Sopenharmony_ci 320062306a36Sopenharmony_ci return 0; 320162306a36Sopenharmony_ci} 320262306a36Sopenharmony_ciEXPORT_SYMBOL(pci_scan_root_bus_bridge); 320362306a36Sopenharmony_ci 320462306a36Sopenharmony_cistruct pci_bus *pci_scan_root_bus(struct device *parent, int bus, 320562306a36Sopenharmony_ci struct pci_ops *ops, void *sysdata, struct list_head *resources) 320662306a36Sopenharmony_ci{ 320762306a36Sopenharmony_ci struct resource_entry *window; 320862306a36Sopenharmony_ci bool found = false; 320962306a36Sopenharmony_ci struct pci_bus *b; 321062306a36Sopenharmony_ci int max; 321162306a36Sopenharmony_ci 321262306a36Sopenharmony_ci resource_list_for_each_entry(window, resources) 321362306a36Sopenharmony_ci if (window->res->flags & IORESOURCE_BUS) { 321462306a36Sopenharmony_ci found = true; 321562306a36Sopenharmony_ci break; 321662306a36Sopenharmony_ci } 321762306a36Sopenharmony_ci 321862306a36Sopenharmony_ci b = pci_create_root_bus(parent, bus, ops, sysdata, resources); 321962306a36Sopenharmony_ci if (!b) 322062306a36Sopenharmony_ci return NULL; 322162306a36Sopenharmony_ci 322262306a36Sopenharmony_ci if (!found) { 322362306a36Sopenharmony_ci dev_info(&b->dev, 322462306a36Sopenharmony_ci "No busn resource found for root bus, will use [bus %02x-ff]\n", 322562306a36Sopenharmony_ci bus); 322662306a36Sopenharmony_ci pci_bus_insert_busn_res(b, bus, 255); 322762306a36Sopenharmony_ci } 322862306a36Sopenharmony_ci 322962306a36Sopenharmony_ci max = pci_scan_child_bus(b); 323062306a36Sopenharmony_ci 323162306a36Sopenharmony_ci if (!found) 323262306a36Sopenharmony_ci pci_bus_update_busn_res_end(b, max); 323362306a36Sopenharmony_ci 323462306a36Sopenharmony_ci return b; 323562306a36Sopenharmony_ci} 323662306a36Sopenharmony_ciEXPORT_SYMBOL(pci_scan_root_bus); 323762306a36Sopenharmony_ci 323862306a36Sopenharmony_cistruct pci_bus *pci_scan_bus(int bus, struct pci_ops *ops, 323962306a36Sopenharmony_ci void *sysdata) 324062306a36Sopenharmony_ci{ 324162306a36Sopenharmony_ci LIST_HEAD(resources); 324262306a36Sopenharmony_ci struct pci_bus *b; 324362306a36Sopenharmony_ci 324462306a36Sopenharmony_ci pci_add_resource(&resources, &ioport_resource); 324562306a36Sopenharmony_ci pci_add_resource(&resources, &iomem_resource); 324662306a36Sopenharmony_ci pci_add_resource(&resources, &busn_resource); 324762306a36Sopenharmony_ci b = pci_create_root_bus(NULL, bus, ops, sysdata, &resources); 324862306a36Sopenharmony_ci if (b) { 324962306a36Sopenharmony_ci pci_scan_child_bus(b); 325062306a36Sopenharmony_ci } else { 325162306a36Sopenharmony_ci pci_free_resource_list(&resources); 325262306a36Sopenharmony_ci } 325362306a36Sopenharmony_ci return b; 325462306a36Sopenharmony_ci} 325562306a36Sopenharmony_ciEXPORT_SYMBOL(pci_scan_bus); 325662306a36Sopenharmony_ci 325762306a36Sopenharmony_ci/** 325862306a36Sopenharmony_ci * pci_rescan_bus_bridge_resize - Scan a PCI bus for devices 325962306a36Sopenharmony_ci * @bridge: PCI bridge for the bus to scan 326062306a36Sopenharmony_ci * 326162306a36Sopenharmony_ci * Scan a PCI bus and child buses for new devices, add them, 326262306a36Sopenharmony_ci * and enable them, resizing bridge mmio/io resource if necessary 326362306a36Sopenharmony_ci * and possible. The caller must ensure the child devices are already 326462306a36Sopenharmony_ci * removed for resizing to occur. 326562306a36Sopenharmony_ci * 326662306a36Sopenharmony_ci * Returns the max number of subordinate bus discovered. 326762306a36Sopenharmony_ci */ 326862306a36Sopenharmony_ciunsigned int pci_rescan_bus_bridge_resize(struct pci_dev *bridge) 326962306a36Sopenharmony_ci{ 327062306a36Sopenharmony_ci unsigned int max; 327162306a36Sopenharmony_ci struct pci_bus *bus = bridge->subordinate; 327262306a36Sopenharmony_ci 327362306a36Sopenharmony_ci max = pci_scan_child_bus(bus); 327462306a36Sopenharmony_ci 327562306a36Sopenharmony_ci pci_assign_unassigned_bridge_resources(bridge); 327662306a36Sopenharmony_ci 327762306a36Sopenharmony_ci pci_bus_add_devices(bus); 327862306a36Sopenharmony_ci 327962306a36Sopenharmony_ci return max; 328062306a36Sopenharmony_ci} 328162306a36Sopenharmony_ci 328262306a36Sopenharmony_ci/** 328362306a36Sopenharmony_ci * pci_rescan_bus - Scan a PCI bus for devices 328462306a36Sopenharmony_ci * @bus: PCI bus to scan 328562306a36Sopenharmony_ci * 328662306a36Sopenharmony_ci * Scan a PCI bus and child buses for new devices, add them, 328762306a36Sopenharmony_ci * and enable them. 328862306a36Sopenharmony_ci * 328962306a36Sopenharmony_ci * Returns the max number of subordinate bus discovered. 329062306a36Sopenharmony_ci */ 329162306a36Sopenharmony_ciunsigned int pci_rescan_bus(struct pci_bus *bus) 329262306a36Sopenharmony_ci{ 329362306a36Sopenharmony_ci unsigned int max; 329462306a36Sopenharmony_ci 329562306a36Sopenharmony_ci max = pci_scan_child_bus(bus); 329662306a36Sopenharmony_ci pci_assign_unassigned_bus_resources(bus); 329762306a36Sopenharmony_ci pci_bus_add_devices(bus); 329862306a36Sopenharmony_ci 329962306a36Sopenharmony_ci return max; 330062306a36Sopenharmony_ci} 330162306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(pci_rescan_bus); 330262306a36Sopenharmony_ci 330362306a36Sopenharmony_ci/* 330462306a36Sopenharmony_ci * pci_rescan_bus(), pci_rescan_bus_bridge_resize() and PCI device removal 330562306a36Sopenharmony_ci * routines should always be executed under this mutex. 330662306a36Sopenharmony_ci */ 330762306a36Sopenharmony_cistatic DEFINE_MUTEX(pci_rescan_remove_lock); 330862306a36Sopenharmony_ci 330962306a36Sopenharmony_civoid pci_lock_rescan_remove(void) 331062306a36Sopenharmony_ci{ 331162306a36Sopenharmony_ci mutex_lock(&pci_rescan_remove_lock); 331262306a36Sopenharmony_ci} 331362306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(pci_lock_rescan_remove); 331462306a36Sopenharmony_ci 331562306a36Sopenharmony_civoid pci_unlock_rescan_remove(void) 331662306a36Sopenharmony_ci{ 331762306a36Sopenharmony_ci mutex_unlock(&pci_rescan_remove_lock); 331862306a36Sopenharmony_ci} 331962306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(pci_unlock_rescan_remove); 332062306a36Sopenharmony_ci 332162306a36Sopenharmony_cistatic int __init pci_sort_bf_cmp(const struct device *d_a, 332262306a36Sopenharmony_ci const struct device *d_b) 332362306a36Sopenharmony_ci{ 332462306a36Sopenharmony_ci const struct pci_dev *a = to_pci_dev(d_a); 332562306a36Sopenharmony_ci const struct pci_dev *b = to_pci_dev(d_b); 332662306a36Sopenharmony_ci 332762306a36Sopenharmony_ci if (pci_domain_nr(a->bus) < pci_domain_nr(b->bus)) return -1; 332862306a36Sopenharmony_ci else if (pci_domain_nr(a->bus) > pci_domain_nr(b->bus)) return 1; 332962306a36Sopenharmony_ci 333062306a36Sopenharmony_ci if (a->bus->number < b->bus->number) return -1; 333162306a36Sopenharmony_ci else if (a->bus->number > b->bus->number) return 1; 333262306a36Sopenharmony_ci 333362306a36Sopenharmony_ci if (a->devfn < b->devfn) return -1; 333462306a36Sopenharmony_ci else if (a->devfn > b->devfn) return 1; 333562306a36Sopenharmony_ci 333662306a36Sopenharmony_ci return 0; 333762306a36Sopenharmony_ci} 333862306a36Sopenharmony_ci 333962306a36Sopenharmony_civoid __init pci_sort_breadthfirst(void) 334062306a36Sopenharmony_ci{ 334162306a36Sopenharmony_ci bus_sort_breadthfirst(&pci_bus_type, &pci_sort_bf_cmp); 334262306a36Sopenharmony_ci} 334362306a36Sopenharmony_ci 334462306a36Sopenharmony_ciint pci_hp_add_bridge(struct pci_dev *dev) 334562306a36Sopenharmony_ci{ 334662306a36Sopenharmony_ci struct pci_bus *parent = dev->bus; 334762306a36Sopenharmony_ci int busnr, start = parent->busn_res.start; 334862306a36Sopenharmony_ci unsigned int available_buses = 0; 334962306a36Sopenharmony_ci int end = parent->busn_res.end; 335062306a36Sopenharmony_ci 335162306a36Sopenharmony_ci for (busnr = start; busnr <= end; busnr++) { 335262306a36Sopenharmony_ci if (!pci_find_bus(pci_domain_nr(parent), busnr)) 335362306a36Sopenharmony_ci break; 335462306a36Sopenharmony_ci } 335562306a36Sopenharmony_ci if (busnr-- > end) { 335662306a36Sopenharmony_ci pci_err(dev, "No bus number available for hot-added bridge\n"); 335762306a36Sopenharmony_ci return -1; 335862306a36Sopenharmony_ci } 335962306a36Sopenharmony_ci 336062306a36Sopenharmony_ci /* Scan bridges that are already configured */ 336162306a36Sopenharmony_ci busnr = pci_scan_bridge(parent, dev, busnr, 0); 336262306a36Sopenharmony_ci 336362306a36Sopenharmony_ci /* 336462306a36Sopenharmony_ci * Distribute the available bus numbers between hotplug-capable 336562306a36Sopenharmony_ci * bridges to make extending the chain later possible. 336662306a36Sopenharmony_ci */ 336762306a36Sopenharmony_ci available_buses = end - busnr; 336862306a36Sopenharmony_ci 336962306a36Sopenharmony_ci /* Scan bridges that need to be reconfigured */ 337062306a36Sopenharmony_ci pci_scan_bridge_extend(parent, dev, busnr, available_buses, 1); 337162306a36Sopenharmony_ci 337262306a36Sopenharmony_ci if (!dev->subordinate) 337362306a36Sopenharmony_ci return -1; 337462306a36Sopenharmony_ci 337562306a36Sopenharmony_ci return 0; 337662306a36Sopenharmony_ci} 337762306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(pci_hp_add_bridge); 3378