1 #ifndef _ASMX86_PCI_H_
2 #define _ASMX86_PCI_H_
3 /*
4 * Copyright (C) 2013, Red Hat Inc, Michael S. Tsirkin <mst@redhat.com>
5 *
6 * This work is licensed under the terms of the GNU LGPL, version 2.
7 */
8 #include "libcflat.h"
9 #include "pci.h"
10 #include "x86/asm/io.h"
11
12 #define PCI_CONF1_ADDRESS(dev, reg) ((0x1 << 31) | (dev << 8) | reg)
13
pci_config_readb(pcidevaddr_t dev,uint8_t reg)14 static inline uint8_t pci_config_readb(pcidevaddr_t dev, uint8_t reg)
15 {
16 outl(PCI_CONF1_ADDRESS(dev, reg), 0xCF8);
17 return inb(0xCFC);
18 }
19
pci_config_readw(pcidevaddr_t dev,uint8_t reg)20 static inline uint16_t pci_config_readw(pcidevaddr_t dev, uint8_t reg)
21 {
22 outl(PCI_CONF1_ADDRESS(dev, reg), 0xCF8);
23 return inw(0xCFC);
24 }
25
pci_config_readl(pcidevaddr_t dev,uint8_t reg)26 static inline uint32_t pci_config_readl(pcidevaddr_t dev, uint8_t reg)
27 {
28 outl(PCI_CONF1_ADDRESS(dev, reg), 0xCF8);
29 return inl(0xCFC);
30 }
31
pci_config_writeb(pcidevaddr_t dev,uint8_t reg,uint8_t val)32 static inline void pci_config_writeb(pcidevaddr_t dev, uint8_t reg,
33 uint8_t val)
34 {
35 outl(PCI_CONF1_ADDRESS(dev, reg), 0xCF8);
36 outb(val, 0xCFC);
37 }
38
pci_config_writew(pcidevaddr_t dev,uint8_t reg,uint16_t val)39 static inline void pci_config_writew(pcidevaddr_t dev, uint8_t reg,
40 uint16_t val)
41 {
42 outl(PCI_CONF1_ADDRESS(dev, reg), 0xCF8);
43 outw(val, 0xCFC);
44 }
45
pci_config_writel(pcidevaddr_t dev,uint8_t reg,uint32_t val)46 static inline void pci_config_writel(pcidevaddr_t dev, uint8_t reg,
47 uint32_t val)
48 {
49 outl(PCI_CONF1_ADDRESS(dev, reg), 0xCF8);
50 outl(val, 0xCFC);
51 }
52
53 static inline
pci_translate_addr(pcidevaddr_t dev __unused,uint64_t addr)54 phys_addr_t pci_translate_addr(pcidevaddr_t dev __unused, uint64_t addr)
55 {
56 return addr;
57 }
58
59 #endif
60