coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
pci_io_cfg.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #ifndef _PCI_IO_CFG_H
4 #define _PCI_IO_CFG_H
5 
6 #include <stdint.h>
7 #include <arch/io.h>
8 #include <device/pci_type.h>
9 
10 static __always_inline
12 {
13  uint32_t addr = 1 << 31;
14 
15  addr |= dev >> 4;
16  addr |= reg & 0xfc;
17 
18  if (CONFIG(PCI_IO_CFG_EXT))
19  addr |= (reg & 0xf00) << 16;
20 
21  return addr;
22 }
23 
24 static __always_inline
26 {
27  uint32_t addr = pci_io_encode_addr(dev, reg);
28  outl(addr, 0xCF8);
29  return inb(0xCFC + (reg & 3));
30 }
31 
32 static __always_inline
34 {
35  uint32_t addr = pci_io_encode_addr(dev, reg);
36  outl(addr, 0xCF8);
37  return inw(0xCFC + (reg & 2));
38 }
39 
40 static __always_inline
42 {
43  uint32_t addr = pci_io_encode_addr(dev, reg);
44  outl(addr, 0xCF8);
45  return inl(0xCFC);
46 }
47 
48 static __always_inline
50 {
51  uint32_t addr = pci_io_encode_addr(dev, reg);
52  outl(addr, 0xCF8);
53  outb(value, 0xCFC + (reg & 3));
54 }
55 
56 static __always_inline
58 {
59  uint32_t addr = pci_io_encode_addr(dev, reg);
60  outl(addr, 0xCF8);
61  outw(value, 0xCFC + (reg & 2));
62 }
63 
64 static __always_inline
66 {
67  uint32_t addr = pci_io_encode_addr(dev, reg);
68  outl(addr, 0xCF8);
69  outl(value, 0xCFC);
70 }
71 
72 #if !CONFIG(ECAM_MMCONF_SUPPORT)
73 
74 /* Avoid name collisions as different stages have different signature
75  * for these functions. The _s_ stands for simple, fundamental IO or
76  * MMIO variant.
77  */
78 
79 static __always_inline
81 {
82  return pci_io_read_config8(dev, reg);
83 }
84 
85 static __always_inline
87 {
88  return pci_io_read_config16(dev, reg);
89 }
90 
91 static __always_inline
93 {
94  return pci_io_read_config32(dev, reg);
95 }
96 
97 static __always_inline
99 {
100  pci_io_write_config8(dev, reg, value);
101 }
102 
103 static __always_inline
105 {
106  pci_io_write_config16(dev, reg, value);
107 }
108 
109 static __always_inline
111 {
112  pci_io_write_config32(dev, reg, value);
113 }
114 
115 #endif
116 
117 #endif /* _PCI_IO_CFG_H */
pte_t value
Definition: mmu.c:91
static u32 addr
Definition: cirrus.c:14
#define __always_inline
Definition: compiler.h:35
u8 inb(u16 port)
void outb(u8 val, u16 port)
u16 inw(u16 port)
u32 inl(u16 port)
void outl(u32 val, u16 port)
void outw(u16 val, u16 port)
@ CONFIG
Definition: dsi_common.h:201
static __always_inline uint16_t pci_io_read_config16(pci_devfn_t dev, uint16_t reg)
Definition: pci_io_cfg.h:33
static __always_inline uint32_t pci_s_read_config32(pci_devfn_t dev, uint16_t reg)
Definition: pci_io_cfg.h:92
static __always_inline uint16_t pci_s_read_config16(pci_devfn_t dev, uint16_t reg)
Definition: pci_io_cfg.h:86
static __always_inline uint8_t pci_io_read_config8(pci_devfn_t dev, uint16_t reg)
Definition: pci_io_cfg.h:25
static __always_inline uint32_t pci_io_read_config32(pci_devfn_t dev, uint16_t reg)
Definition: pci_io_cfg.h:41
static __always_inline void pci_io_write_config8(pci_devfn_t dev, uint16_t reg, uint8_t value)
Definition: pci_io_cfg.h:49
static __always_inline void pci_io_write_config32(pci_devfn_t dev, uint16_t reg, uint32_t value)
Definition: pci_io_cfg.h:65
static __always_inline uint8_t pci_s_read_config8(pci_devfn_t dev, uint16_t reg)
Definition: pci_io_cfg.h:80
static __always_inline void pci_s_write_config8(pci_devfn_t dev, uint16_t reg, uint8_t value)
Definition: pci_io_cfg.h:98
static __always_inline void pci_io_write_config16(pci_devfn_t dev, uint16_t reg, uint16_t value)
Definition: pci_io_cfg.h:57
static __always_inline void pci_s_write_config16(pci_devfn_t dev, uint16_t reg, uint16_t value)
Definition: pci_io_cfg.h:104
static __always_inline uint32_t pci_io_encode_addr(pci_devfn_t dev, uint16_t reg)
Definition: pci_io_cfg.h:11
static __always_inline void pci_s_write_config32(pci_devfn_t dev, uint16_t reg, uint32_t value)
Definition: pci_io_cfg.h:110
u32 pci_devfn_t
Definition: pci_type.h:8
unsigned short uint16_t
Definition: stdint.h:11
unsigned int uint32_t
Definition: stdint.h:14
unsigned char uint8_t
Definition: stdint.h:8