Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^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);