3  * PCI address cache; allows the lookup of PCI devices based on I/O address
 
   5  * Copyright (C) 2004 Linas Vepstas <linas@austin.ibm.com> IBM Corporation
 
   7  * This program is free software; you can redistribute it and/or modify
 
   8  * it under the terms of the GNU General Public License as published by
 
   9  * the Free Software Foundation; either version 2 of the License, or
 
  10  * (at your option) any later version.
 
  12  * This program is distributed in the hope that it will be useful,
 
  13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
  14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
  15  * GNU General Public License for more details.
 
  17  * You should have received a copy of the GNU General Public License
 
  18  * along with this program; if not, write to the Free Software
 
  19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 
  22 #include <linux/list.h>
 
  23 #include <linux/pci.h>
 
  24 #include <linux/rbtree.h>
 
  25 #include <linux/spinlock.h>
 
  26 #include <asm/atomic.h>
 
  27 #include <asm/pci-bridge.h>
 
  28 #include <asm/ppc-pci.h>
 
  33  * The pci address cache subsystem.  This subsystem places
 
  34  * PCI device address resources into a red-black tree, sorted
 
  35  * according to the address range, so that given only an i/o
 
  36  * address, the corresponding PCI device can be **quickly**
 
  37  * found. It is safe to perform an address lookup in an interrupt
 
  38  * context; this ability is an important feature.
 
  40  * Currently, the only customer of this code is the EEH subsystem;
 
  41  * thus, this code has been somewhat tailored to suit EEH better.
 
  42  * In particular, the cache does *not* hold the addresses of devices
 
  43  * for which EEH is not enabled.
 
  45  * (Implementation Note: The RB tree seems to be better/faster
 
  46  * than any hash algo I could think of for this problem, even
 
  47  * with the penalty of slow pointer chases for d-cache misses).
 
  49 struct pci_io_addr_range
 
  51         struct rb_node rb_node;
 
  52         unsigned long addr_lo;
 
  53         unsigned long addr_hi;
 
  54         struct pci_dev *pcidev;
 
  58 static struct pci_io_addr_cache
 
  60         struct rb_root rb_root;
 
  62 } pci_io_addr_cache_root;
 
  64 static inline struct pci_dev *__pci_get_device_by_addr(unsigned long addr)
 
  66         struct rb_node *n = pci_io_addr_cache_root.rb_root.rb_node;
 
  69                 struct pci_io_addr_range *piar;
 
  70                 piar = rb_entry(n, struct pci_io_addr_range, rb_node);
 
  72                 if (addr < piar->addr_lo) {
 
  75                         if (addr > piar->addr_hi) {
 
  78                                 pci_dev_get(piar->pcidev);
 
  88  * pci_get_device_by_addr - Get device, given only address
 
  89  * @addr: mmio (PIO) phys address or i/o port number
 
  91  * Given an mmio phys address, or a port number, find a pci device
 
  92  * that implements this address.  Be sure to pci_dev_put the device
 
  93  * when finished.  I/O port numbers are assumed to be offset
 
  94  * from zero (that is, they do *not* have pci_io_addr added in).
 
  95  * It is safe to call this function within an interrupt.
 
  97 struct pci_dev *pci_get_device_by_addr(unsigned long addr)
 
 102         spin_lock_irqsave(&pci_io_addr_cache_root.piar_lock, flags);
 
 103         dev = __pci_get_device_by_addr(addr);
 
 104         spin_unlock_irqrestore(&pci_io_addr_cache_root.piar_lock, flags);
 
 110  * Handy-dandy debug print routine, does nothing more
 
 111  * than print out the contents of our addr cache.
 
 113 static void pci_addr_cache_print(struct pci_io_addr_cache *cache)
 
 118         n = rb_first(&cache->rb_root);
 
 120                 struct pci_io_addr_range *piar;
 
 121                 piar = rb_entry(n, struct pci_io_addr_range, rb_node);
 
 122                 printk(KERN_DEBUG "PCI: %s addr range %d [%lx-%lx]: %s\n",
 
 123                        (piar->flags & IORESOURCE_IO) ? "i/o" : "mem", cnt,
 
 124                        piar->addr_lo, piar->addr_hi, pci_name(piar->pcidev));
 
 131 /* Insert address range into the rb tree. */
 
 132 static struct pci_io_addr_range *
 
 133 pci_addr_cache_insert(struct pci_dev *dev, unsigned long alo,
 
 134                       unsigned long ahi, unsigned int flags)
 
 136         struct rb_node **p = &pci_io_addr_cache_root.rb_root.rb_node;
 
 137         struct rb_node *parent = NULL;
 
 138         struct pci_io_addr_range *piar;
 
 140         /* Walk tree, find a place to insert into tree */
 
 143                 piar = rb_entry(parent, struct pci_io_addr_range, rb_node);
 
 144                 if (ahi < piar->addr_lo) {
 
 145                         p = &parent->rb_left;
 
 146                 } else if (alo > piar->addr_hi) {
 
 147                         p = &parent->rb_right;
 
 149                         if (dev != piar->pcidev ||
 
 150                             alo != piar->addr_lo || ahi != piar->addr_hi) {
 
 151                                 printk(KERN_WARNING "PIAR: overlapping address range\n");
 
 156         piar = (struct pci_io_addr_range *)kmalloc(sizeof(struct pci_io_addr_range), GFP_ATOMIC);
 
 166         printk(KERN_DEBUG "PIAR: insert range=[%lx:%lx] dev=%s\n",
 
 167                           alo, ahi, pci_name (dev));
 
 170         rb_link_node(&piar->rb_node, parent, p);
 
 171         rb_insert_color(&piar->rb_node, &pci_io_addr_cache_root.rb_root);
 
 176 static void __pci_addr_cache_insert_device(struct pci_dev *dev)
 
 178         struct device_node *dn;
 
 183         dn = pci_device_to_OF_node(dev);
 
 185                 printk(KERN_WARNING "PCI: no pci dn found for dev=%s\n", pci_name(dev));
 
 189         /* Skip any devices for which EEH is not enabled. */
 
 191         if (!(pdn->eeh_mode & EEH_MODE_SUPPORTED) ||
 
 192             pdn->eeh_mode & EEH_MODE_NOCHECK) {
 
 194                 printk(KERN_INFO "PCI: skip building address cache for=%s - %s\n",
 
 195                        pci_name(dev), pdn->node->full_name);
 
 200         /* The cache holds a reference to the device... */
 
 203         /* Walk resources on this device, poke them into the tree */
 
 204         for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
 
 205                 unsigned long start = pci_resource_start(dev,i);
 
 206                 unsigned long end = pci_resource_end(dev,i);
 
 207                 unsigned int flags = pci_resource_flags(dev,i);
 
 209                 /* We are interested only bus addresses, not dma or other stuff */
 
 210                 if (0 == (flags & (IORESOURCE_IO | IORESOURCE_MEM)))
 
 212                 if (start == 0 || ~start == 0 || end == 0 || ~end == 0)
 
 214                 pci_addr_cache_insert(dev, start, end, flags);
 
 218         /* If there was nothing to add, the cache has no reference... */
 
 224  * pci_addr_cache_insert_device - Add a device to the address cache
 
 225  * @dev: PCI device whose I/O addresses we are interested in.
 
 227  * In order to support the fast lookup of devices based on addresses,
 
 228  * we maintain a cache of devices that can be quickly searched.
 
 229  * This routine adds a device to that cache.
 
 231 void pci_addr_cache_insert_device(struct pci_dev *dev)
 
 235         spin_lock_irqsave(&pci_io_addr_cache_root.piar_lock, flags);
 
 236         __pci_addr_cache_insert_device(dev);
 
 237         spin_unlock_irqrestore(&pci_io_addr_cache_root.piar_lock, flags);
 
 240 static inline void __pci_addr_cache_remove_device(struct pci_dev *dev)
 
 246         n = rb_first(&pci_io_addr_cache_root.rb_root);
 
 248                 struct pci_io_addr_range *piar;
 
 249                 piar = rb_entry(n, struct pci_io_addr_range, rb_node);
 
 251                 if (piar->pcidev == dev) {
 
 252                         rb_erase(n, &pci_io_addr_cache_root.rb_root);
 
 260         /* The cache no longer holds its reference to this device... */
 
 266  * pci_addr_cache_remove_device - remove pci device from addr cache
 
 267  * @dev: device to remove
 
 269  * Remove a device from the addr-cache tree.
 
 270  * This is potentially expensive, since it will walk
 
 271  * the tree multiple times (once per resource).
 
 272  * But so what; device removal doesn't need to be that fast.
 
 274 void pci_addr_cache_remove_device(struct pci_dev *dev)
 
 278         spin_lock_irqsave(&pci_io_addr_cache_root.piar_lock, flags);
 
 279         __pci_addr_cache_remove_device(dev);
 
 280         spin_unlock_irqrestore(&pci_io_addr_cache_root.piar_lock, flags);
 
 284  * pci_addr_cache_build - Build a cache of I/O addresses
 
 286  * Build a cache of pci i/o addresses.  This cache will be used to
 
 287  * find the pci device that corresponds to a given address.
 
 288  * This routine scans all pci busses to build the cache.
 
 289  * Must be run late in boot process, after the pci controllers
 
 290  * have been scaned for devices (after all device resources are known).
 
 292 void __init pci_addr_cache_build(void)
 
 294         struct device_node *dn;
 
 295         struct pci_dev *dev = NULL;
 
 297         spin_lock_init(&pci_io_addr_cache_root.piar_lock);
 
 299         while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) {
 
 300                 /* Ignore PCI bridges */
 
 301                 if ((dev->class >> 16) == PCI_BASE_CLASS_BRIDGE)
 
 304                 pci_addr_cache_insert_device(dev);
 
 306                 dn = pci_device_to_OF_node(dev);
 
 307                 pci_dev_get (dev);  /* matching put is in eeh_remove_device() */
 
 308                 PCI_DN(dn)->pcidev = dev;
 
 312         /* Verify tree built up above, echo back the list of addrs. */
 
 313         pci_addr_cache_print(&pci_io_addr_cache_root);