source: rtems/cpukit/libpci/pci_for_each.c

Last change on this file was 1b33b9d, checked in by Joel Sherrill <joel@…>, on 03/18/22 at 15:03:47

cpukit/libpci: Change license to BSD-2

Updates #3053.

  • Property mode set to 100644
File size: 2.5 KB
Line 
1/* SPDX-License-Identifier: BSD-2-Clause */
2
3/*  PCI Help Function, iterate over all PCI devices. Find devices by cfg access.
4 *
5 *  COPYRIGHT (c) 2010 Cobham Gaisler AB.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 * POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#include <pci.h>
30#include <pci/access.h>
31
32/*#define DEBUG*/
33
34#ifdef DEBUG
35#include <rtems/bspIo.h>
36#define DBG(args...) printk(args)
37#else
38#define DBG(args...)
39#endif
40
41int pci_for_each(int (*func)(pci_dev_t, void*), void *arg)
42{
43        uint32_t id;
44        uint8_t hd;
45        int bus, dev, fun, result, fail;
46        int maxbus = pci_bus_count();
47        pci_dev_t pcidev;
48
49        for (bus = 0; bus < maxbus ; bus++) {
50                for (dev = 0; dev <= PCI_SLOTMAX; dev++) {
51                        pcidev = PCI_DEV(bus, dev, 0);
52
53                        for (fun = 0; fun <= PCI_FUNCMAX; fun++, pcidev++) {
54                                fail = pci_cfg_r32(pcidev, PCIR_VENDOR, &id);
55                                if (fail || (0xffffffff == id) || (0 == id)) {
56                                        if (fun == 0)
57                                                break;
58                                        else
59                                                continue;
60                                }
61
62                                DBG("pcibus_for_each: found 0x%08lx at"
63                                    " %d/%d/%d\n", id, bus, dev, fun);
64                                result = func(pcidev, arg);
65                                if (result != 0)
66                                        return result; /* Stopped */
67
68                                /* Stop if not a multi-function device */
69                                if (fun == 0) {
70                                        pci_cfg_r8(pcidev, PCIR_HDRTYPE,
71                                                        &hd);
72                                        if ((hd & PCIM_MFDEV) == 0)
73                                                break;
74                                }
75                        }
76                }
77        }
78
79        return 0; /* scanned all */
80}
Note: See TracBrowser for help on using the repository browser.