[efi] Add EFI image format and basic runtime environment
[people/sha0/gpxe.git] / src / include / gpxe / efi / efi_pci.h
1 #ifndef _GPXE_EFI_PCI_H
2 #define _GPXE_EFI_PCI_H
3
4 /** @file
5  *
6  * gPXE PCI I/O API for EFI
7  *
8  */
9
10 #ifdef PCIAPI_EFI
11 #define PCIAPI_PREFIX_efi
12 #else
13 #define PCIAPI_PREFIX_efi __efi_
14 #endif
15
16 /* EFI PCI width codes defined by EFI spec */
17 #define EFIPCI_WIDTH_BYTE 0
18 #define EFIPCI_WIDTH_WORD 1
19 #define EFIPCI_WIDTH_DWORD 2
20
21 #define EFIPCI_LOCATION( _offset, _width ) \
22         ( (_offset) | ( (_width) << 16 ) )
23 #define EFIPCI_OFFSET( _location ) ( (_location) & 0xffff )
24 #define EFIPCI_WIDTH( _location ) ( (_location) >> 16 )
25
26 struct pci_device;
27
28 extern int efipci_read ( struct pci_device *pci, unsigned long location,
29                          void *value );
30 extern int efipci_write ( struct pci_device *pci, unsigned long location,
31                           unsigned long value );
32
33 /**
34  * Determine maximum PCI bus number within system
35  *
36  * @ret max_bus         Maximum bus number
37  */
38 static inline __always_inline int
39 PCIAPI_INLINE ( efi, pci_max_bus ) ( void ) {
40         /* No way to work this out via EFI */
41         return 0xff;
42 }
43
44 /**
45  * Read byte from PCI configuration space via EFI
46  *
47  * @v pci       PCI device
48  * @v where     Location within PCI configuration space
49  * @v value     Value read
50  * @ret rc      Return status code
51  */
52 static inline __always_inline int
53 PCIAPI_INLINE ( efi, pci_read_config_byte ) ( struct pci_device *pci,
54                                               unsigned int where,
55                                               uint8_t *value ) {
56         return efipci_read ( pci,
57                              EFIPCI_LOCATION ( where, EFIPCI_WIDTH_BYTE ),
58                              value );
59 }
60
61 /**
62  * Read word from PCI configuration space via EFI
63  *
64  * @v pci       PCI device
65  * @v where     Location within PCI configuration space
66  * @v value     Value read
67  * @ret rc      Return status code
68  */
69 static inline __always_inline int
70 PCIAPI_INLINE ( efi, pci_read_config_word ) ( struct pci_device *pci,
71                                               unsigned int where,
72                                               uint16_t *value ) {
73         return efipci_read ( pci,
74                              EFIPCI_LOCATION ( where, EFIPCI_WIDTH_WORD ),
75                              value );
76 }
77
78 /**
79  * Read dword from PCI configuration space via EFI
80  *
81  * @v pci       PCI device
82  * @v where     Location within PCI configuration space
83  * @v value     Value read
84  * @ret rc      Return status code
85  */
86 static inline __always_inline int
87 PCIAPI_INLINE ( efi, pci_read_config_dword ) ( struct pci_device *pci,
88                                                unsigned int where,
89                                                uint32_t *value ) {
90         return efipci_read ( pci,
91                              EFIPCI_LOCATION ( where, EFIPCI_WIDTH_DWORD ),
92                              value );
93 }
94
95 /**
96  * Write byte to PCI configuration space via EFI
97  *
98  * @v pci       PCI device
99  * @v where     Location within PCI configuration space
100  * @v value     Value to be written
101  * @ret rc      Return status code
102  */
103 static inline __always_inline int
104 PCIAPI_INLINE ( efi, pci_write_config_byte ) ( struct pci_device *pci,
105                                                unsigned int where,
106                                                uint8_t value ) {
107         return efipci_write ( pci,
108                               EFIPCI_LOCATION ( where, EFIPCI_WIDTH_BYTE ),
109                               value );
110 }
111
112 /**
113  * Write word to PCI configuration space via EFI
114  *
115  * @v pci       PCI device
116  * @v where     Location within PCI configuration space
117  * @v value     Value to be written
118  * @ret rc      Return status code
119  */
120 static inline __always_inline int
121 PCIAPI_INLINE ( efi, pci_write_config_word ) ( struct pci_device *pci,
122                                                unsigned int where,
123                                                uint16_t value ) {
124         return efipci_write ( pci,
125                               EFIPCI_LOCATION ( where, EFIPCI_WIDTH_WORD ),
126                               value );
127 }
128
129 /**
130  * Write dword to PCI configuration space via EFI
131  *
132  * @v pci       PCI device
133  * @v where     Location within PCI configuration space
134  * @v value     Value to be written
135  * @ret rc      Return status code
136  */
137 static inline __always_inline int
138 PCIAPI_INLINE ( efi, pci_write_config_dword ) ( struct pci_device *pci,
139                                                 unsigned int where,
140                                                 uint32_t value ) {
141         return efipci_write ( pci,
142                               EFIPCI_LOCATION ( where, EFIPCI_WIDTH_DWORD ),
143                               value );
144 }
145
146 #endif /* _GPXE_EFI_PCI_H */