^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * PCI <-> OF mapping helpers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright 2011 IBM Corp.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #define pr_fmt(fmt) "PCI: OF: " fmt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <linux/irqdomain.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/pci.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/of.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/of_irq.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/of_address.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/of_pci.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include "pci.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #ifdef CONFIG_PCI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) void pci_set_of_node(struct pci_dev *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) if (!dev->bus->dev.of_node)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) dev->dev.of_node = of_pci_find_child_device(dev->bus->dev.of_node,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) dev->devfn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) if (dev->dev.of_node)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) dev->dev.fwnode = &dev->dev.of_node->fwnode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) void pci_release_of_node(struct pci_dev *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) of_node_put(dev->dev.of_node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) dev->dev.of_node = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) dev->dev.fwnode = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) void pci_set_bus_of_node(struct pci_bus *bus)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) struct device_node *node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) if (bus->self == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) node = pcibios_get_phb_of_node(bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) node = of_node_get(bus->self->dev.of_node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) if (node && of_property_read_bool(node, "external-facing"))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) bus->self->external_facing = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) bus->dev.of_node = node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) if (bus->dev.of_node)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) bus->dev.fwnode = &bus->dev.of_node->fwnode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) void pci_release_bus_of_node(struct pci_bus *bus)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) of_node_put(bus->dev.of_node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) bus->dev.of_node = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) bus->dev.fwnode = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) struct device_node * __weak pcibios_get_phb_of_node(struct pci_bus *bus)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) /* This should only be called for PHBs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) if (WARN_ON(bus->self || bus->parent))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) * Look for a node pointer in either the intermediary device we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) * create above the root bus or its own parent. Normally only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) * the later is populated.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) if (bus->bridge->of_node)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) return of_node_get(bus->bridge->of_node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) if (bus->bridge->parent && bus->bridge->parent->of_node)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) return of_node_get(bus->bridge->parent->of_node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) struct irq_domain *pci_host_bridge_of_msi_domain(struct pci_bus *bus)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) #ifdef CONFIG_IRQ_DOMAIN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) struct irq_domain *d;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) if (!bus->dev.of_node)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) /* Start looking for a phandle to an MSI controller. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) d = of_msi_get_domain(&bus->dev, bus->dev.of_node, DOMAIN_BUS_PCI_MSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) if (d)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) return d;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) * If we don't have an msi-parent property, look for a domain
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) * directly attached to the host bridge.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) d = irq_find_matching_host(bus->dev.of_node, DOMAIN_BUS_PCI_MSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) if (d)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) return d;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) return irq_find_host(bus->dev.of_node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) static inline int __of_pci_pci_compare(struct device_node *node,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) unsigned int data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) int devfn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) devfn = of_pci_get_devfn(node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) if (devfn < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) return devfn == data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) struct device_node *of_pci_find_child_device(struct device_node *parent,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) unsigned int devfn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) struct device_node *node, *node2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) for_each_child_of_node(parent, node) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) if (__of_pci_pci_compare(node, devfn))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) return node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) * Some OFs create a parent node "multifunc-device" as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) * a fake root for all functions of a multi-function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) * device we go down them as well.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) if (of_node_name_eq(node, "multifunc-device")) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) for_each_child_of_node(node, node2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) if (__of_pci_pci_compare(node2, devfn)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) of_node_put(node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) return node2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) EXPORT_SYMBOL_GPL(of_pci_find_child_device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) * of_pci_get_devfn() - Get device and function numbers for a device node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) * @np: device node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) * Parses a standard 5-cell PCI resource and returns an 8-bit value that can
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) * be passed to the PCI_SLOT() and PCI_FUNC() macros to extract the device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) * and function numbers respectively. On error a negative error code is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) * returned.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) int of_pci_get_devfn(struct device_node *np)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) u32 reg[5];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) int error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) error = of_property_read_u32_array(np, "reg", reg, ARRAY_SIZE(reg));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) if (error)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) return error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) return (reg[0] >> 8) & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) EXPORT_SYMBOL_GPL(of_pci_get_devfn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) * of_pci_parse_bus_range() - parse the bus-range property of a PCI device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) * @node: device node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) * @res: address to a struct resource to return the bus-range
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) * Returns 0 on success or a negative error-code on failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) int of_pci_parse_bus_range(struct device_node *node, struct resource *res)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) u32 bus_range[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) int error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) error = of_property_read_u32_array(node, "bus-range", bus_range,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) ARRAY_SIZE(bus_range));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) if (error)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) return error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) res->name = node->name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) res->start = bus_range[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) res->end = bus_range[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) res->flags = IORESOURCE_BUS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) EXPORT_SYMBOL_GPL(of_pci_parse_bus_range);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) * This function will try to obtain the host bridge domain number by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) * finding a property called "linux,pci-domain" of the given device node.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) * @node: device tree node with the domain information
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) * Returns the associated domain number from DT in the range [0-0xffff], or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) * a negative value if the required property is not found.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) int of_get_pci_domain_nr(struct device_node *node)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) u32 domain;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) int error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) error = of_property_read_u32(node, "linux,pci-domain", &domain);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) if (error)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) return error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) return (u16)domain;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) EXPORT_SYMBOL_GPL(of_get_pci_domain_nr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) * of_pci_check_probe_only - Setup probe only mode if linux,pci-probe-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) * is present and valid
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) void of_pci_check_probe_only(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) u32 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) ret = of_property_read_u32(of_chosen, "linux,pci-probe-only", &val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) if (ret == -ENODATA || ret == -EOVERFLOW)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) pr_warn("linux,pci-probe-only without valid value, ignoring\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) if (val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) pci_add_flags(PCI_PROBE_ONLY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) pci_clear_flags(PCI_PROBE_ONLY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) pr_info("PROBE_ONLY %sabled\n", val ? "en" : "dis");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) EXPORT_SYMBOL_GPL(of_pci_check_probe_only);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) * devm_of_pci_get_host_bridge_resources() - Resource-managed parsing of PCI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) * host bridge resources from DT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) * @dev: host bridge device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) * @busno: bus number associated with the bridge root bus
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) * @bus_max: maximum number of buses for this bridge
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) * @resources: list where the range of resources will be added after DT parsing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) * @ib_resources: list where the range of inbound resources (with addresses
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) * from 'dma-ranges') will be added after DT parsing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) * @io_base: pointer to a variable that will contain on return the physical
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) * address for the start of the I/O range. Can be NULL if the caller doesn't
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) * expect I/O ranges to be present in the device tree.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) * This function will parse the "ranges" property of a PCI host bridge device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) * node and setup the resource mapping based on its content. It is expected
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) * that the property conforms with the Power ePAPR document.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) * It returns zero if the range parsing has been successful or a standard error
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) * value if it failed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) static int devm_of_pci_get_host_bridge_resources(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) unsigned char busno, unsigned char bus_max,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) struct list_head *resources,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) struct list_head *ib_resources,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) resource_size_t *io_base)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) struct device_node *dev_node = dev->of_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) struct resource *res, tmp_res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) struct resource *bus_range;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) struct of_pci_range range;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) struct of_pci_range_parser parser;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) const char *range_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) if (io_base)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) *io_base = (resource_size_t)OF_BAD_ADDR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) bus_range = devm_kzalloc(dev, sizeof(*bus_range), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) if (!bus_range)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) dev_info(dev, "host bridge %pOF ranges:\n", dev_node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) err = of_pci_parse_bus_range(dev_node, bus_range);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) bus_range->start = busno;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) bus_range->end = bus_max;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) bus_range->flags = IORESOURCE_BUS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) dev_info(dev, " No bus range found for %pOF, using %pR\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) dev_node, bus_range);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) if (bus_range->end > bus_range->start + bus_max)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) bus_range->end = bus_range->start + bus_max;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) pci_add_resource(resources, bus_range);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) /* Check for ranges property */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) err = of_pci_range_parser_init(&parser, dev_node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) dev_dbg(dev, "Parsing ranges property...\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) for_each_of_pci_range(&parser, &range) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) /* Read next ranges element */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) if ((range.flags & IORESOURCE_TYPE_BITS) == IORESOURCE_IO)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) range_type = "IO";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) else if ((range.flags & IORESOURCE_TYPE_BITS) == IORESOURCE_MEM)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) range_type = "MEM";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) range_type = "err";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) dev_info(dev, " %6s %#012llx..%#012llx -> %#012llx\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) range_type, range.cpu_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) range.cpu_addr + range.size - 1, range.pci_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) * If we failed translation or got a zero-sized region
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) * then skip this range
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) if (range.cpu_addr == OF_BAD_ADDR || range.size == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) err = of_pci_range_to_resource(&range, dev_node, &tmp_res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) res = devm_kmemdup(dev, &tmp_res, sizeof(tmp_res), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) if (!res) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) err = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) goto failed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) if (resource_type(res) == IORESOURCE_IO) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) if (!io_base) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) dev_err(dev, "I/O range found for %pOF. Please provide an io_base pointer to save CPU base address\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) dev_node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) goto failed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) if (*io_base != (resource_size_t)OF_BAD_ADDR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) dev_warn(dev, "More than one I/O resource converted for %pOF. CPU base address for old range lost!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) dev_node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) *io_base = range.cpu_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) pci_add_resource_offset(resources, res, res->start - range.pci_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) /* Check for dma-ranges property */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) if (!ib_resources)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) err = of_pci_dma_range_parser_init(&parser, dev_node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) dev_dbg(dev, "Parsing dma-ranges property...\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) for_each_of_pci_range(&parser, &range) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) struct resource_entry *entry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) * If we failed translation or got a zero-sized region
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) * then skip this range
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) if (((range.flags & IORESOURCE_TYPE_BITS) != IORESOURCE_MEM) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) range.cpu_addr == OF_BAD_ADDR || range.size == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) dev_info(dev, " %6s %#012llx..%#012llx -> %#012llx\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) "IB MEM", range.cpu_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) range.cpu_addr + range.size - 1, range.pci_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) err = of_pci_range_to_resource(&range, dev_node, &tmp_res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) res = devm_kmemdup(dev, &tmp_res, sizeof(tmp_res), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) if (!res) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) err = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) goto failed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) /* Keep the resource list sorted */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) resource_list_for_each_entry(entry, ib_resources)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) if (entry->res->start > res->start)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) pci_add_resource_offset(&entry->node, res,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) res->start - range.pci_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) failed:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) pci_free_resource_list(resources);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) #if IS_ENABLED(CONFIG_OF_IRQ)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) * of_irq_parse_pci - Resolve the interrupt for a PCI device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) * @pdev: the device whose interrupt is to be resolved
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) * @out_irq: structure of_phandle_args filled by this function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) * This function resolves the PCI interrupt for a given PCI device. If a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) * device-node exists for a given pci_dev, it will use normal OF tree
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) * walking. If not, it will implement standard swizzling and walk up the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) * PCI tree until an device-node is found, at which point it will finish
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) * resolving using the OF tree walking.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) static int of_irq_parse_pci(const struct pci_dev *pdev, struct of_phandle_args *out_irq)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) struct device_node *dn, *ppnode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) struct pci_dev *ppdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) __be32 laddr[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) u8 pin;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) * Check if we have a device node, if yes, fallback to standard
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) * device tree parsing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) dn = pci_device_to_OF_node(pdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) if (dn) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) rc = of_irq_parse_one(dn, 0, out_irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) if (!rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) * Ok, we don't, time to have fun. Let's start by building up an
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) * interrupt spec. we assume #interrupt-cells is 1, which is standard
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) * for PCI. If you do different, then don't use that routine.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) rc = pci_read_config_byte(pdev, PCI_INTERRUPT_PIN, &pin);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) if (rc != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) /* No pin, exit with no error message. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) if (pin == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) /* Now we walk up the PCI tree */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) for (;;) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) /* Get the pci_dev of our parent */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) ppdev = pdev->bus->self;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) /* Ouch, it's a host bridge... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) if (ppdev == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) ppnode = pci_bus_to_OF_node(pdev->bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) /* No node for host bridge ? give up */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) if (ppnode == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) rc = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) /* We found a P2P bridge, check if it has a node */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) ppnode = pci_device_to_OF_node(ppdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) * Ok, we have found a parent with a device-node, hand over to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) * the OF parsing code.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) * We build a unit address from the linux device to be used for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) * resolution. Note that we use the linux bus number which may
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) * not match your firmware bus numbering.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) * Fortunately, in most cases, interrupt-map-mask doesn't
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) * include the bus number as part of the matching.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) * You should still be careful about that though if you intend
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) * to rely on this function (you ship a firmware that doesn't
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) * create device nodes for all PCI devices).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) if (ppnode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) * We can only get here if we hit a P2P bridge with no node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) * let's do standard swizzling and try again
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) pin = pci_swizzle_interrupt_pin(pdev, pin);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) pdev = ppdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) out_irq->np = ppnode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) out_irq->args_count = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) out_irq->args[0] = pin;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) laddr[0] = cpu_to_be32((pdev->bus->number << 16) | (pdev->devfn << 8));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) laddr[1] = laddr[2] = cpu_to_be32(0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) rc = of_irq_parse_raw(laddr, out_irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) if (rc == -ENOENT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) dev_warn(&pdev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) "%s: no interrupt-map found, INTx interrupts not available\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) pr_warn_once("%s: possibly some PCI slots don't have level triggered interrupts capability\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) dev_err(&pdev->dev, "%s: failed with rc=%d\n", __func__, rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) * of_irq_parse_and_map_pci() - Decode a PCI IRQ from the device tree and map to a VIRQ
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) * @dev: The PCI device needing an IRQ
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) * @slot: PCI slot number; passed when used as map_irq callback. Unused
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) * @pin: PCI IRQ pin number; passed when used as map_irq callback. Unused
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) * @slot and @pin are unused, but included in the function so that this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) * function can be used directly as the map_irq callback to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) * pci_assign_irq() and struct pci_host_bridge.map_irq pointer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) int of_irq_parse_and_map_pci(const struct pci_dev *dev, u8 slot, u8 pin)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) struct of_phandle_args oirq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) ret = of_irq_parse_pci(dev, &oirq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) return 0; /* Proper return code 0 == NO_IRQ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) return irq_create_of_mapping(&oirq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) EXPORT_SYMBOL_GPL(of_irq_parse_and_map_pci);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) #endif /* CONFIG_OF_IRQ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) static int pci_parse_request_of_pci_ranges(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) struct pci_host_bridge *bridge)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) int err, res_valid = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) resource_size_t iobase;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) struct resource_entry *win, *tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) INIT_LIST_HEAD(&bridge->windows);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) INIT_LIST_HEAD(&bridge->dma_ranges);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) err = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff, &bridge->windows,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) &bridge->dma_ranges, &iobase);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) err = devm_request_pci_bus_resources(dev, &bridge->windows);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) resource_list_for_each_entry_safe(win, tmp, &bridge->windows) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) struct resource *res = win->res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) switch (resource_type(res)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) case IORESOURCE_IO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) err = devm_pci_remap_iospace(dev, res, iobase);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) dev_warn(dev, "error %d: failed to map resource %pR\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) err, res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) resource_list_destroy_entry(win);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) case IORESOURCE_MEM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) res_valid |= !(res->flags & IORESOURCE_PREFETCH);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) if (!res_valid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) dev_warn(dev, "non-prefetchable memory resource required\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) int devm_of_pci_bridge_init(struct device *dev, struct pci_host_bridge *bridge)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) if (!dev->of_node)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) bridge->swizzle_irq = pci_common_swizzle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) bridge->map_irq = of_irq_parse_and_map_pci;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) return pci_parse_request_of_pci_ranges(dev, bridge);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) #endif /* CONFIG_PCI */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) * This function will try to find the limitation of link speed by finding
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) * a property called "max-link-speed" of the given device node.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) * @node: device tree node with the max link speed information
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) * Returns the associated max link speed from DT, or a negative value if the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) * required property is not found or is invalid.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) int of_pci_get_max_link_speed(struct device_node *node)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) u32 max_link_speed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) if (of_property_read_u32(node, "max-link-speed", &max_link_speed) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) max_link_speed == 0 || max_link_speed > 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) return max_link_speed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) EXPORT_SYMBOL_GPL(of_pci_get_max_link_speed);