source: rtems/cpukit/libpci/pci_for_each.c @ b2ed712

5
Last change on this file since b2ed712 was e53daed, checked in by Daniel Hellstrom <daniel@…>, on 04/09/15 at 14:09:42

LIBPCI: updated license to rtems.org

  • Property mode set to 100644
File size: 1.3 KB
Line 
1/*  PCI Help Function, iterate over all PCI devices. Find devices by cfg access.
2 *
3 *  COPYRIGHT (c) 2010 Cobham Gaisler AB.
4 *
5 *  The license and distribution terms for this file may be
6 *  found in the file LICENSE in this distribution or at
7 *  http://www.rtems.org/license/LICENSE.
8 */
9
10#include <pci.h>
11#include <pci/access.h>
12
13/*#define DEBUG*/
14
15#ifdef DEBUG
16#include <rtems/bspIo.h>
17#define DBG(args...) printk(args)
18#else
19#define DBG(args...)
20#endif
21
22int pci_for_each(int (*func)(pci_dev_t, void*), void *arg)
23{
24        uint32_t id;
25        uint8_t hd;
26        int bus, dev, fun, result, fail;
27        int maxbus = pci_bus_count();
28        pci_dev_t pcidev;
29
30        for (bus = 0; bus < maxbus ; bus++) {
31                for (dev = 0; dev <= PCI_SLOTMAX; dev++) {
32                        pcidev = PCI_DEV(bus, dev, 0);
33
34                        for (fun = 0; fun <= PCI_FUNCMAX; fun++, pcidev++) {
35                                fail = pci_cfg_r32(pcidev, PCIR_VENDOR, &id);
36                                if (fail || (0xffffffff == id) || (0 == id)) {
37                                        if (fun == 0)
38                                                break;
39                                        else
40                                                continue;
41                                }
42
43                                DBG("pcibus_for_each: found 0x%08lx at"
44                                    " %d/%d/%d\n", id, bus, dev, fun);
45                                result = func(pcidev, arg);
46                                if (result != 0)
47                                        return result; /* Stopped */
48
49                                /* Stop if not a multi-function device */
50                                if (fun == 0) {
51                                        pci_cfg_r8(pcidev, PCIR_HDRTYPE,
52                                                        &hd);
53                                        if ((hd & PCIM_MFDEV) == 0)
54                                                break;
55                                }
56                        }
57                }
58        }
59
60        return 0; /* scanned all */
61}
Note: See TracBrowser for help on using the repository browser.