![]() |
|
|||
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 }
[ Source navigation ] | [ Diff markup ] | [ Identifier search ] | [ general search ] |
This page was automatically generated by the 2.3.7 LXR engine. The LXR team |
![]() ![]() |