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 unsigned long pci_bar_addr(pcidevaddr_t dev, int bar_num) 25 { 26 uint32_t bar = pci_config_readl(dev, PCI_BASE_ADDRESS_0 + bar_num * 4); 27 28 if (bar & PCI_BASE_ADDRESS_SPACE_IO) 29 return bar & PCI_BASE_ADDRESS_IO_MASK; 30 else 31 return bar & PCI_BASE_ADDRESS_MEM_MASK; 32 } 33 34 bool pci_bar_is_memory(pcidevaddr_t dev, int bar_num) 35 { 36 uint32_t bar = pci_config_readl(dev, PCI_BASE_ADDRESS_0 + bar_num * 4); 37 38 return !(bar & PCI_BASE_ADDRESS_SPACE_IO); 39 } 40 41 bool pci_bar_is_valid(pcidevaddr_t dev, int bar_num) 42 { 43 return pci_config_readl(dev, PCI_BASE_ADDRESS_0 + bar_num * 4); 44 } 45