source: rtems/c/src/lib/libbsp/sparc/shared/pci/pcifinddevice.c @ a7ff7e7

4.104.114.84.95
Last change on this file since a7ff7e7 was a7ff7e7, checked in by Joel Sherrill <joel.sherrill@…>, on Sep 6, 2007 at 4:33:32 PM

2007-09-06 Daniel Hellstrom <daniel@…>

  • shared/pci/pcifinddevice.c: New file.
  • Property mode set to 100644
File size: 1.4 KB
Line 
1
2/* Author: Till Straumann <strauman@slac.stanford.edu>, 2001 */
3
4/* find a particular PCI device
5 * (we assume, the firmware configured the PCI bus[es] for us)
6 *
7 * pcifinddevice.c,v 1.1.4.2 2003/07/18 15:48:54 joel Exp
8 */
9
10#define PCI_INVALID_VENDORDEVICEID      0xffffffff
11#define PCI_MULTI_FUNCTION                      0x80
12
13#include <pci.h>
14#include <rtems/bspIo.h>
15
16int
17BSP_pciFindDevice( unsigned short vendorid, unsigned short deviceid,
18                   int instance, int *pbus, int *pdev, int *pfun )
19{
20   unsigned int d;
21   unsigned short s;
22   unsigned char bus,dev,fun,hd;
23
24        for (bus=0; bus<BusCountPCI(); bus++) {
25      for (dev=0; dev<PCI_MAX_DEVICES; dev++) {
26
27                pci_read_config_byte(bus,dev,0, PCI_HEADER_TYPE, &hd);
28                hd = (hd & PCI_MULTI_FUNCTION ? PCI_MAX_FUNCTIONS : 1);
29
30                for (fun=0; fun<hd; fun++) {
31                        /*
32                         * The last devfn id/slot is special; must skip it
33                         */
34                        if (PCI_MAX_DEVICES-1==dev && PCI_MAX_FUNCTIONS-1 == fun)
35                                break;
36                        (void)pci_read_config_dword(bus,dev,fun,PCI_VENDOR_ID,&d);
37                        if (PCI_INVALID_VENDORDEVICEID == d)
38                                continue;
39#ifdef PCI_DEBUG
40                        printk("BSP_pciFindDevice: found 0x%08x at %d/%d/%d\n",d,bus,dev,fun);
41#endif
42                        (void) pci_read_config_word(bus,dev,fun,PCI_VENDOR_ID,&s);
43                        if (vendorid != s)
44                                continue;
45                        (void) pci_read_config_word(bus,dev,fun,PCI_DEVICE_ID,&s);
46                        if (deviceid == s) {
47                                if (instance--) continue;
48                                *pbus=bus; *pdev=dev; *pfun=fun;
49                                return 0;
50                        }
51                }
52      }
53        }
54    return -1;
55}
56
57/* eof */
Note: See TracBrowser for help on using the repository browser.