xref: /kvm-unit-tests/lib/x86/asm/pci.h (revision c865f654ffe4c5955038aaf74f702ba62f3eb014)
1*c865f654SCornelia Huck #ifndef _ASMX86_PCI_H_
2*c865f654SCornelia Huck #define _ASMX86_PCI_H_
3456c55bcSAndrew Jones /*
4456c55bcSAndrew Jones  * Copyright (C) 2013, Red Hat Inc, Michael S. Tsirkin <mst@redhat.com>
5456c55bcSAndrew Jones  *
6456c55bcSAndrew Jones  * This work is licensed under the terms of the GNU LGPL, version 2.
7456c55bcSAndrew Jones  */
8456c55bcSAndrew Jones #include "libcflat.h"
9456c55bcSAndrew Jones #include "pci.h"
1055601383SAlexander Gordeev #include "x86/asm/io.h"
11456c55bcSAndrew Jones 
12d8369c77SAlexander Gordeev #define PCI_CONF1_ADDRESS(dev, reg)	((0x1 << 31) | (dev << 8) | reg)
13d8369c77SAlexander Gordeev 
pci_config_readb(pcidevaddr_t dev,uint8_t reg)14d8369c77SAlexander Gordeev static inline uint8_t pci_config_readb(pcidevaddr_t dev, uint8_t reg)
15d8369c77SAlexander Gordeev {
16d8369c77SAlexander Gordeev     outl(PCI_CONF1_ADDRESS(dev, reg), 0xCF8);
17d8369c77SAlexander Gordeev     return inb(0xCFC);
18d8369c77SAlexander Gordeev }
19d8369c77SAlexander Gordeev 
pci_config_readw(pcidevaddr_t dev,uint8_t reg)20d8369c77SAlexander Gordeev static inline uint16_t pci_config_readw(pcidevaddr_t dev, uint8_t reg)
21d8369c77SAlexander Gordeev {
22d8369c77SAlexander Gordeev     outl(PCI_CONF1_ADDRESS(dev, reg), 0xCF8);
23d8369c77SAlexander Gordeev     return inw(0xCFC);
24d8369c77SAlexander Gordeev }
25d8369c77SAlexander Gordeev 
pci_config_readl(pcidevaddr_t dev,uint8_t reg)26b8e0826eSAlexander Gordeev static inline uint32_t pci_config_readl(pcidevaddr_t dev, uint8_t reg)
27456c55bcSAndrew Jones {
28d8369c77SAlexander Gordeev     outl(PCI_CONF1_ADDRESS(dev, reg), 0xCF8);
29456c55bcSAndrew Jones     return inl(0xCFC);
30456c55bcSAndrew Jones }
31456c55bcSAndrew Jones 
pci_config_writeb(pcidevaddr_t dev,uint8_t reg,uint8_t val)32d8369c77SAlexander Gordeev static inline void pci_config_writeb(pcidevaddr_t dev, uint8_t reg,
33d8369c77SAlexander Gordeev                                      uint8_t val)
34d8369c77SAlexander Gordeev {
35d8369c77SAlexander Gordeev     outl(PCI_CONF1_ADDRESS(dev, reg), 0xCF8);
36d8369c77SAlexander Gordeev     outb(val, 0xCFC);
37d8369c77SAlexander Gordeev }
38d8369c77SAlexander Gordeev 
pci_config_writew(pcidevaddr_t dev,uint8_t reg,uint16_t val)39d8369c77SAlexander Gordeev static inline void pci_config_writew(pcidevaddr_t dev, uint8_t reg,
40d8369c77SAlexander Gordeev                                      uint16_t val)
41d8369c77SAlexander Gordeev {
42d8369c77SAlexander Gordeev     outl(PCI_CONF1_ADDRESS(dev, reg), 0xCF8);
43d8369c77SAlexander Gordeev     outw(val, 0xCFC);
44d8369c77SAlexander Gordeev }
45d8369c77SAlexander Gordeev 
pci_config_writel(pcidevaddr_t dev,uint8_t reg,uint32_t val)46d8369c77SAlexander Gordeev static inline void pci_config_writel(pcidevaddr_t dev, uint8_t reg,
47d8369c77SAlexander Gordeev                                      uint32_t val)
48d8369c77SAlexander Gordeev {
49d8369c77SAlexander Gordeev     outl(PCI_CONF1_ADDRESS(dev, reg), 0xCF8);
50d8369c77SAlexander Gordeev     outl(val, 0xCFC);
51d8369c77SAlexander Gordeev }
52d8369c77SAlexander Gordeev 
532455ef20SAlexander Gordeev static inline
pci_translate_addr(pcidevaddr_t dev __unused,uint64_t addr)542455ef20SAlexander Gordeev phys_addr_t pci_translate_addr(pcidevaddr_t dev __unused, uint64_t addr)
552455ef20SAlexander Gordeev {
562455ef20SAlexander Gordeev     return addr;
572455ef20SAlexander Gordeev }
582455ef20SAlexander Gordeev 
59456c55bcSAndrew Jones #endif
60