[pci] Formalise the PCI I/O API
[people/asdlkf/gpxe.git] / src / arch / i386 / include / gpxe / pcibios.h
1 #ifndef _GPXE_PCIBIOS_H
2 #define _GPXE_PCIBIOS_H
3
4 #include <stdint.h>
5
6 /** @file
7  *
8  * PCI configuration space access via PCI BIOS
9  *
10  */
11
12 #ifdef PCIAPI_PCBIOS
13 #define PCIAPI_PREFIX_pcbios
14 #else
15 #define PCIAPI_PREFIX_pcbios __pcbios_
16 #endif
17
18 struct pci_device;
19
20 #define PCIBIOS_INSTALLATION_CHECK      0xb1010000
21 #define PCIBIOS_READ_CONFIG_BYTE        0xb1080000
22 #define PCIBIOS_READ_CONFIG_WORD        0xb1090000
23 #define PCIBIOS_READ_CONFIG_DWORD       0xb10a0000
24 #define PCIBIOS_WRITE_CONFIG_BYTE       0xb10b0000
25 #define PCIBIOS_WRITE_CONFIG_WORD       0xb10c0000
26 #define PCIBIOS_WRITE_CONFIG_DWORD      0xb10d0000
27
28 extern int pcibios_read ( struct pci_device *pci, uint32_t command,
29                           uint32_t *value );
30 extern int pcibios_write ( struct pci_device *pci, uint32_t command,
31                            uint32_t value );
32
33 /**
34  * Read byte from PCI configuration space via PCI BIOS
35  *
36  * @v pci       PCI device
37  * @v where     Location within PCI configuration space
38  * @v value     Value read
39  * @ret rc      Return status code
40  */
41 static inline __always_inline int
42 PCIAPI_INLINE ( pcbios, pci_read_config_byte ) ( struct pci_device *pci,
43                                                  unsigned int where,
44                                                  uint8_t *value ) {
45         uint32_t tmp;
46         int rc;
47
48         rc = pcibios_read ( pci, PCIBIOS_READ_CONFIG_BYTE | where, &tmp );
49         *value = tmp;
50         return rc;
51 }
52
53 /**
54  * Read word from PCI configuration space via PCI BIOS
55  *
56  * @v pci       PCI device
57  * @v where     Location within PCI configuration space
58  * @v value     Value read
59  * @ret rc      Return status code
60  */
61 static inline __always_inline int
62 PCIAPI_INLINE ( pcbios, pci_read_config_word ) ( struct pci_device *pci,
63                                                  unsigned int where,
64                                                  uint16_t *value ) {
65         uint32_t tmp;
66         int rc;
67
68         rc = pcibios_read ( pci, PCIBIOS_READ_CONFIG_WORD | where, &tmp );
69         *value = tmp;
70         return rc;
71 }
72
73 /**
74  * Read dword from PCI configuration space via PCI BIOS
75  *
76  * @v pci       PCI device
77  * @v where     Location within PCI configuration space
78  * @v value     Value read
79  * @ret rc      Return status code
80  */
81 static inline __always_inline int
82 PCIAPI_INLINE ( pcbios, pci_read_config_dword ) ( struct pci_device *pci,
83                                                   unsigned int where,
84                                                   uint32_t *value ) {
85         return pcibios_read ( pci, PCIBIOS_READ_CONFIG_DWORD | where, value );
86 }
87
88 /**
89  * Write byte to PCI configuration space via PCI BIOS
90  *
91  * @v pci       PCI device
92  * @v where     Location within PCI configuration space
93  * @v value     Value to be written
94  * @ret rc      Return status code
95  */
96 static inline __always_inline int
97 PCIAPI_INLINE ( pcbios, pci_write_config_byte ) ( struct pci_device *pci,
98                                                   unsigned int where,
99                                                   uint8_t value ) {
100         return pcibios_write ( pci, PCIBIOS_WRITE_CONFIG_BYTE | where, value );
101 }
102
103 /**
104  * Write word to PCI configuration space via PCI BIOS
105  *
106  * @v pci       PCI device
107  * @v where     Location within PCI configuration space
108  * @v value     Value to be written
109  * @ret rc      Return status code
110  */
111 static inline __always_inline int
112 PCIAPI_INLINE ( pcbios, pci_write_config_word ) ( struct pci_device *pci,
113                                                   unsigned int where,
114                                                   uint16_t value ) {
115         return pcibios_write ( pci, PCIBIOS_WRITE_CONFIG_WORD | where, value );
116 }
117
118 /**
119  * Write dword to PCI configuration space via PCI BIOS
120  *
121  * @v pci       PCI device
122  * @v where     Location within PCI configuration space
123  * @v value     Value to be written
124  * @ret rc      Return status code
125  */
126 static inline __always_inline int
127 PCIAPI_INLINE ( pcbios, pci_write_config_dword ) ( struct pci_device *pci,
128                                                    unsigned int where,
129                                                    uint32_t value ) {
130         return pcibios_write ( pci, PCIBIOS_WRITE_CONFIG_DWORD | where, value);
131 }
132
133 #endif /* _GPXE_PCIBIOS_H */