1 /* 2 * Copyright (C) 2013, Red Hat Inc, Michael S. Tsirkin <mst@redhat.com> 3 * 4 * This work is licensed under the terms of the GNU LGPL, version 2. 5 */ 6 #include <linux/pci_regs.h> 7 #include "pci.h" 8 #include "asm/pci.h" 9 10 /* Scan bus look for a specific device. Only bus 0 scanned for now. */ 11 pcidevaddr_t pci_find_dev(uint16_t vendor_id, uint16_t device_id) 12 { 13 pcidevaddr_t dev; 14 15 for (dev = 0; dev < 256; ++dev) { 16 if (pci_config_readw(dev, PCI_VENDOR_ID) == vendor_id && 17 pci_config_readw(dev, PCI_DEVICE_ID) == device_id) 18 return dev; 19 } 20 21 return PCIDEVADDR_INVALID; 22 } 23 24 static uint32_t pci_bar_get(pcidevaddr_t dev, int bar_num) 25 { 26 return pci_config_readl(dev, PCI_BASE_ADDRESS_0 + bar_num * 4); 27 } 28 29 unsigned long pci_bar_addr(pcidevaddr_t dev, int bar_num) 30 { 31 uint32_t bar = pci_bar_get(dev, bar_num); 32 33 if (bar & PCI_BASE_ADDRESS_SPACE_IO) 34 return bar & PCI_BASE_ADDRESS_IO_MASK; 35 else 36 return bar & PCI_BASE_ADDRESS_MEM_MASK; 37 } 38 39 bool pci_bar_is_memory(pcidevaddr_t dev, int bar_num) 40 { 41 uint32_t bar = pci_bar_get(dev, bar_num); 42 43 return !(bar & PCI_BASE_ADDRESS_SPACE_IO); 44 } 45 46 bool pci_bar_is_valid(pcidevaddr_t dev, int bar_num) 47 { 48 return pci_bar_get(dev, bar_num); 49 } 50