[legacy] Add missing #include <gpxe/io.h>
[people/asdlkf/gpxe.git] / src / arch / i386 / include / pcidirect.h
1 #ifndef _PCIDIRECT_H
2 #define _PCIDIRECT_H
3
4 #include <stdint.h>
5 #include <gpxe/io.h>
6
7 /** @file
8  *
9  * PCI configuration space access via Type 1 accesses
10  *
11  */
12
13 #define PCIDIRECT_CONFIG_ADDRESS        0xcf8
14 #define PCIDIRECT_CONFIG_DATA           0xcfc
15
16 struct pci_device;
17
18 extern void pcidirect_prepare ( struct pci_device *pci, int where );
19
20 /**
21  * Determine maximum PCI bus number within system
22  *
23  * @ret max_bus         Maximum bus number
24  */
25 static inline int pcidirect_max_bus ( void ) {
26         /* No way to work this out via Type 1 accesses */
27         return 0xff;
28 }
29
30 /**
31  * Read byte from PCI configuration space via Type 1 access
32  *
33  * @v pci       PCI device
34  * @v where     Location within PCI configuration space
35  * @v value     Value read
36  * @ret rc      Return status code
37  */
38 static inline __attribute__ (( always_inline )) int
39 pcidirect_read_config_byte ( struct pci_device *pci, unsigned int where,
40                              uint8_t *value ) {
41         pcidirect_prepare ( pci, where );
42         *value = inb ( PCIDIRECT_CONFIG_DATA + ( where & 3 ) );
43         return 0;
44 }
45
46 /**
47  * Read word from PCI configuration space via Type 1 access
48  *
49  * @v pci       PCI device
50  * @v where     Location within PCI configuration space
51  * @v value     Value read
52  * @ret rc      Return status code
53  */
54 static inline __attribute__ (( always_inline )) int
55 pcidirect_read_config_word ( struct pci_device *pci, unsigned int where,
56                              uint16_t *value ) {
57         pcidirect_prepare ( pci, where );
58         *value = inw ( PCIDIRECT_CONFIG_DATA + ( where & 2 ) );
59         return 0;
60 }
61
62 /**
63  * Read dword from PCI configuration space via Type 1 access
64  *
65  * @v pci       PCI device
66  * @v where     Location within PCI configuration space
67  * @v value     Value read
68  * @ret rc      Return status code
69  */
70 static inline __attribute__ (( always_inline )) int
71 pcidirect_read_config_dword ( struct pci_device *pci, unsigned int where,
72                               uint32_t *value ) {
73         pcidirect_prepare ( pci, where );
74         *value = inl ( PCIDIRECT_CONFIG_DATA );
75         return 0;
76 }
77
78 /**
79  * Write byte to PCI configuration space via Type 1 access
80  *
81  * @v pci       PCI device
82  * @v where     Location within PCI configuration space
83  * @v value     Value to be written
84  * @ret rc      Return status code
85  */
86 static inline __attribute__ (( always_inline )) int
87 pcidirect_write_config_byte ( struct pci_device *pci, unsigned int where,
88                               uint8_t value ) {
89         pcidirect_prepare ( pci, where );
90         outb ( value, PCIDIRECT_CONFIG_DATA + ( where & 3 ) );
91         return 0;
92 }
93
94 /**
95  * Write word to PCI configuration space via Type 1 access
96  *
97  * @v pci       PCI device
98  * @v where     Location within PCI configuration space
99  * @v value     Value to be written
100  * @ret rc      Return status code
101  */
102 static inline __attribute__ (( always_inline )) int
103 pcidirect_write_config_word ( struct pci_device *pci, unsigned int where,
104                               uint16_t value ) {
105         pcidirect_prepare ( pci, where );
106         outw ( value, PCIDIRECT_CONFIG_DATA + ( where & 2 ) );
107         return 0;
108 }
109
110 /**
111  * Write dword to PCI configuration space via Type 1 access
112  *
113  * @v pci       PCI device
114  * @v where     Location within PCI configuration space
115  * @v value     Value to be written
116  * @ret rc      Return status code
117  */
118 static inline __attribute__ (( always_inline )) int
119 pcidirect_write_config_dword ( struct pci_device *pci, unsigned int where,
120                                uint32_t value ) {
121         pcidirect_prepare ( pci, where );
122         outl ( value, PCIDIRECT_CONFIG_DATA );
123         return 0;
124 }
125
126 #endif /* _PCIDIRECT_H */