diff options
author | Daniel Hellstrom <daniel@gaisler.com> | 2011-11-28 10:11:10 +0100 |
---|---|---|
committer | Daniel Hellstrom <daniel@gaisler.com> | 2015-04-17 01:10:15 +0200 |
commit | a31845f7f9b4770cf9ddd8b6820641d2f4f4c1da (patch) | |
tree | 0d7f215ec45d7c4cf6f1293af72ece2fbde1ddc3 /cpukit/libpci/pci_find_dev.c | |
parent | leon3,ngmp: simplify cpucounter initialization (diff) | |
download | rtems-a31845f7f9b4770cf9ddd8b6820641d2f4f4c1da.tar.bz2 |
LIBPCI: added PCI layer to cpukit/libpci
Diffstat (limited to 'cpukit/libpci/pci_find_dev.c')
-rw-r--r-- | cpukit/libpci/pci_find_dev.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/cpukit/libpci/pci_find_dev.c b/cpukit/libpci/pci_find_dev.c new file mode 100644 index 0000000000..184d05cb67 --- /dev/null +++ b/cpukit/libpci/pci_find_dev.c @@ -0,0 +1,49 @@ +/* PCI Help function, Find a PCI device by VENDOR/DEVICE ID + * + * COPYRIGHT (c) 2010. + * Cobham Gaisler AB. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.com/license/LICENSE. + */ + +#include <pci.h> +#include <pci/cfg.h> + +struct compare_info { + int index; + uint16_t vendor; + uint16_t device; +}; + +static int compare_dev_id(struct pci_dev *dev, void *arg) +{ + struct compare_info *info = arg; + + if ((dev->vendor != info->vendor) || (dev->device != info->device)) + return 0; + if (info->index-- == 0) + return (int)dev; + else + return 0; +} + +/* Find a Device in PCI device tree located in RAM */ +int pci_find_dev(uint16_t ven, uint16_t dev, int index, struct pci_dev **ppdev) +{ + struct compare_info info; + int result; + + info.index = index; + info.vendor = ven; + info.device = dev; + + result = pci_for_each_dev(compare_dev_id, &info); + if (ppdev) + *ppdev = (struct pci_dev *)result; + if (result == 0) + return -1; + else + return 0; +} |