From a31845f7f9b4770cf9ddd8b6820641d2f4f4c1da Mon Sep 17 00:00:00 2001 From: Daniel Hellstrom Date: Mon, 28 Nov 2011 10:11:10 +0100 Subject: LIBPCI: added PCI layer to cpukit/libpci --- cpukit/libpci/pci_find.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 cpukit/libpci/pci_find.c (limited to 'cpukit/libpci/pci_find.c') diff --git a/cpukit/libpci/pci_find.c b/cpukit/libpci/pci_find.c new file mode 100644 index 0000000000..945cb56ea9 --- /dev/null +++ b/cpukit/libpci/pci_find.c @@ -0,0 +1,52 @@ +/* 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 +#include + +struct compare_info { + int index; + uint16_t vendor; + uint16_t device; +}; + +static int compare_dev_id(pci_dev_t pcidev, void *arg) +{ + struct compare_info *info = arg; + uint16_t vid, did; + + pci_cfg_r16(pcidev, PCI_VENDOR_ID, &vid); + pci_cfg_r16(pcidev, PCI_DEVICE_ID, &did); + if ((vid != info->vendor) || (did != info->device)) + return 0; + if (info->index-- == 0) + return pcidev; + else + return 0; +} + +/* Find a Device in PCI configuration space */ +int pci_find(uint16_t ven, uint16_t dev, int index, pci_dev_t *pdev) +{ + struct compare_info info; + int result; + + info.index = index; + info.vendor = ven; + info.device = dev; + + result = pci_for_each(compare_dev_id, &info); + if (pdev) + *pdev = (pci_dev_t)result; + if (result == 0) + return -1; + else + return 0; +} -- cgit v1.2.3