Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:24:20

0001 /* SPDX-License-Identifier: BSD-2-Clause */
0002 
0003 /*  PCI Help Function, iterate over all PCI devices. Find devices by cfg access.
0004  *
0005  *  COPYRIGHT (c) 2010 Cobham Gaisler AB.
0006  *
0007  * Redistribution and use in source and binary forms, with or without
0008  * modification, are permitted provided that the following conditions
0009  * are met:
0010  * 1. Redistributions of source code must retain the above copyright
0011  *    notice, this list of conditions and the following disclaimer.
0012  * 2. Redistributions in binary form must reproduce the above copyright
0013  *    notice, this list of conditions and the following disclaimer in the
0014  *    documentation and/or other materials provided with the distribution.
0015  *
0016  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
0017  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0018  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0019  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
0020  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
0021  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
0022  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
0023  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
0024  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0025  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
0026  * POSSIBILITY OF SUCH DAMAGE.
0027  */
0028 
0029 #include <pci.h>
0030 #include <pci/access.h>
0031 
0032 /*#define DEBUG*/
0033 
0034 #ifdef DEBUG
0035 #include <rtems/bspIo.h>
0036 #define DBG(args...) printk(args)
0037 #else
0038 #define DBG(args...)
0039 #endif
0040 
0041 int pci_for_each(int (*func)(pci_dev_t, void*), void *arg)
0042 {
0043     uint32_t id;
0044     uint8_t hd;
0045     int bus, dev, fun, result, fail;
0046     int maxbus = pci_bus_count();
0047     pci_dev_t pcidev;
0048 
0049     for (bus = 0; bus < maxbus ; bus++) {
0050         for (dev = 0; dev <= PCI_SLOTMAX; dev++) {
0051             pcidev = PCI_DEV(bus, dev, 0);
0052 
0053             for (fun = 0; fun <= PCI_FUNCMAX; fun++, pcidev++) {
0054                 fail = pci_cfg_r32(pcidev, PCIR_VENDOR, &id);
0055                 if (fail || (0xffffffff == id) || (0 == id)) {
0056                     if (fun == 0)
0057                         break;
0058                     else
0059                         continue;
0060                 }
0061 
0062                 DBG("pcibus_for_each: found 0x%08lx at"
0063                     " %d/%d/%d\n", id, bus, dev, fun);
0064                 result = func(pcidev, arg);
0065                 if (result != 0)
0066                     return result; /* Stopped */
0067 
0068                 /* Stop if not a multi-function device */
0069                 if (fun == 0) {
0070                     pci_cfg_r8(pcidev, PCIR_HDRTYPE,
0071                             &hd);
0072                     if ((hd & PCIM_MFDEV) == 0)
0073                         break;
0074                 }
0075             }
0076         }
0077     }
0078 
0079     return 0; /* scanned all */
0080 }