[pci] Formalise the PCI I/O API
[people/asdlkf/gpxe.git] / src / arch / i386 / include / gpxe / pcidirect.h
1 #ifndef _PCIDIRECT_H
2 #define _PCIDIRECT_H
3
4 #include <stdint.h>
5 #include <gpxe/io.h>
6
7 #ifdef PCIAPI_DIRECT
8 #define PCIAPI_PREFIX_direct
9 #else
10 #define PCIAPI_PREFIX_direct __direct_
11 #endif
12
13 /** @file
14  *
15  * PCI configuration space access via Type 1 accesses
16  *
17  */
18
19 #define PCIDIRECT_CONFIG_ADDRESS        0xcf8
20 #define PCIDIRECT_CONFIG_DATA           0xcfc
21
22 struct pci_device;
23
24 extern void pcidirect_prepare ( struct pci_device *pci, int where );
25
26 /**
27  * Determine maximum PCI bus number within system
28  *
29  * @ret max_bus         Maximum bus number
30  */
31 static inline __always_inline int
32 PCIAPI_INLINE ( direct, pci_max_bus ) ( void ) {
33         /* No way to work this out via Type 1 accesses */
34         return 0xff;
35 }
36
37 /**
38  * Read byte from PCI configuration space via Type 1 access
39  *
40  * @v pci       PCI device
41  * @v where     Location within PCI configuration space
42  * @v value     Value read
43  * @ret rc      Return status code
44  */
45 static inline __always_inline int
46 PCIAPI_INLINE ( direct, pci_read_config_byte ) ( struct pci_device *pci,
47                                                  unsigned int where,
48                                                  uint8_t *value ) {
49         pcidirect_prepare ( pci, where );
50         *value = inb ( PCIDIRECT_CONFIG_DATA + ( where & 3 ) );
51         return 0;
52 }
53
54 /**
55  * Read word from PCI configuration space via Type 1 access
56  *
57  * @v pci       PCI device
58  * @v where     Location within PCI configuration space
59  * @v value     Value read
60  * @ret rc      Return status code
61  */
62 static inline __always_inline int
63 PCIAPI_INLINE ( direct, pci_read_config_word ) ( struct pci_device *pci,
64                                                  unsigned int where,
65                                                  uint16_t *value ) {
66         pcidirect_prepare ( pci, where );
67         *value = inw ( PCIDIRECT_CONFIG_DATA + ( where & 2 ) );
68         return 0;
69 }
70
71 /**
72  * Read dword from PCI configuration space via Type 1 access
73  *
74  * @v pci       PCI device
75  * @v where     Location within PCI configuration space
76  * @v value     Value read
77  * @ret rc      Return status code
78  */
79 static inline __always_inline int
80 PCIAPI_INLINE ( direct, pci_read_config_dword ) ( struct pci_device *pci,
81                                                   unsigned int where,
82                                                   uint32_t *value ) {
83         pcidirect_prepare ( pci, where );
84         *value = inl ( PCIDIRECT_CONFIG_DATA );
85         return 0;
86 }
87
88 /**
89  * Write byte to PCI configuration space via Type 1 access
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 ( direct, pci_write_config_byte ) ( struct pci_device *pci,
98                                                   unsigned int where,
99                                                   uint8_t value ) {
100         pcidirect_prepare ( pci, where );
101         outb ( value, PCIDIRECT_CONFIG_DATA + ( where & 3 ) );
102         return 0;
103 }
104
105 /**
106  * Write word to PCI configuration space via Type 1 access
107  *
108  * @v pci       PCI device
109  * @v where     Location within PCI configuration space
110  * @v value     Value to be written
111  * @ret rc      Return status code
112  */
113 static inline __always_inline int
114 PCIAPI_INLINE ( direct, pci_write_config_word ) ( struct pci_device *pci,
115                                                   unsigned int where,
116                                                   uint16_t value ) {
117         pcidirect_prepare ( pci, where );
118         outw ( value, PCIDIRECT_CONFIG_DATA + ( where & 2 ) );
119         return 0;
120 }
121
122 /**
123  * Write dword to PCI configuration space via Type 1 access
124  *
125  * @v pci       PCI device
126  * @v where     Location within PCI configuration space
127  * @v value     Value to be written
128  * @ret rc      Return status code
129  */
130 static inline __always_inline int
131 PCIAPI_INLINE ( direct, pci_write_config_dword ) ( struct pci_device *pci,
132                                                    unsigned int where,
133                                                    uint32_t value ) {
134         pcidirect_prepare ( pci, where );
135         outl ( value, PCIDIRECT_CONFIG_DATA );
136         return 0;
137 }
138
139 #endif /* _PCIDIRECT_H */