efi_io.h

Go to the documentation of this file.
00001 #ifndef _GPXE_EFI_IO_H
00002 #define _GPXE_EFI_IO_H
00003 
00004 /** @file
00005  *
00006  * gPXE I/O API for EFI
00007  *
00008  * EFI runs with flat physical addressing, so the various mappings
00009  * between virtual addresses, I/O addresses and bus addresses are all
00010  * no-ops.  I/O is handled using the EFI_CPU_IO_PROTOCOL.
00011  */
00012 
00013 FILE_LICENCE ( GPL2_OR_LATER );
00014 
00015 #ifdef IOAPI_EFI
00016 #define IOAPI_PREFIX_efi
00017 #else
00018 #define IOAPI_PREFIX_efi __efi_
00019 #endif
00020 
00021 extern unsigned long long efi_ioread ( volatile void *io_addr,
00022                                        size_t size );
00023 extern void efi_iowrite ( unsigned long long data, volatile void *io_addr,
00024                           size_t size );
00025 extern void efi_ioreads ( volatile void *io_addr, void *data,
00026                           size_t size, unsigned int count );
00027 extern void efi_iowrites ( volatile void *io_addr, const void *data,
00028                           size_t size, unsigned int count );
00029 
00030 /*
00031  * Physical<->Bus and Bus<->I/O address mappings
00032  *
00033  * EFI runs with flat physical addressing, so these are all no-ops.
00034  *
00035  */
00036 
00037 static inline __always_inline unsigned long
00038 IOAPI_INLINE ( efi, phys_to_bus ) ( unsigned long phys_addr ) {
00039         return phys_addr;
00040 }
00041 
00042 static inline __always_inline unsigned long
00043 IOAPI_INLINE ( efi, bus_to_phys ) ( unsigned long bus_addr ) {
00044         return bus_addr;
00045 }
00046 
00047 static inline __always_inline void *
00048 IOAPI_INLINE ( efi, ioremap ) ( unsigned long bus_addr, size_t len __unused ) {
00049         return ( ( void * ) bus_addr );
00050 }
00051 
00052 static inline __always_inline void
00053 IOAPI_INLINE ( efi, iounmap ) ( volatile const void *io_addr __unused ) {
00054         /* Nothing to do */
00055 }
00056 
00057 static inline __always_inline unsigned long
00058 IOAPI_INLINE ( efi, io_to_bus ) ( volatile const void *io_addr ) {
00059         return ( ( unsigned long ) io_addr );
00060 }
00061 
00062 /*
00063  * I/O functions
00064  *
00065  */
00066 
00067 static inline __always_inline uint8_t
00068 IOAPI_INLINE ( efi, readb ) ( volatile uint8_t *io_addr ) {
00069         return efi_ioread ( io_addr, sizeof ( *io_addr ) );
00070 }
00071 
00072 static inline __always_inline uint16_t
00073 IOAPI_INLINE ( efi, readw ) ( volatile uint16_t *io_addr ) {
00074         return efi_ioread ( io_addr, sizeof ( *io_addr ) );
00075 }
00076 
00077 static inline __always_inline uint32_t
00078 IOAPI_INLINE ( efi, readl ) ( volatile uint32_t *io_addr ) {
00079         return efi_ioread ( io_addr, sizeof ( *io_addr ) );
00080 }
00081 
00082 static inline __always_inline uint64_t
00083 IOAPI_INLINE ( efi, readq ) ( volatile uint64_t *io_addr ) {
00084         return efi_ioread ( io_addr, sizeof ( *io_addr ) );
00085 }
00086 
00087 static inline __always_inline void
00088 IOAPI_INLINE ( efi, writeb ) ( uint8_t data, volatile uint8_t *io_addr ) {
00089         efi_iowrite ( data, io_addr, sizeof ( *io_addr ) );
00090 }
00091 
00092 static inline __always_inline void
00093 IOAPI_INLINE ( efi, writew ) ( uint16_t data, volatile uint16_t *io_addr ) {
00094         efi_iowrite ( data, io_addr, sizeof ( *io_addr ) );
00095 }
00096 
00097 static inline __always_inline void
00098 IOAPI_INLINE ( efi, writel ) ( uint32_t data, volatile uint32_t *io_addr ) {
00099         efi_iowrite ( data, io_addr, sizeof ( *io_addr ) );
00100 }
00101 
00102 static inline __always_inline void
00103 IOAPI_INLINE ( efi, writeq ) ( uint64_t data, volatile uint64_t *io_addr ) {
00104         efi_iowrite ( data, io_addr, sizeof ( *io_addr ) );
00105 }
00106 
00107 static inline __always_inline uint8_t
00108 IOAPI_INLINE ( efi, inb ) ( volatile uint8_t *io_addr ) {
00109         return efi_ioread ( io_addr, sizeof ( *io_addr ) );
00110 }
00111 
00112 static inline __always_inline uint16_t
00113 IOAPI_INLINE ( efi, inw ) ( volatile uint16_t *io_addr ) {
00114         return efi_ioread ( io_addr, sizeof ( *io_addr ) );
00115 }
00116 
00117 static inline __always_inline uint32_t
00118 IOAPI_INLINE ( efi, inl ) ( volatile uint32_t *io_addr ) {
00119         return efi_ioread ( io_addr, sizeof ( *io_addr ) );
00120 }
00121 
00122 static inline __always_inline void
00123 IOAPI_INLINE ( efi, outb ) ( uint8_t data, volatile uint8_t *io_addr ) {
00124         efi_iowrite ( data, io_addr, sizeof ( *io_addr ) );
00125 }
00126 
00127 static inline __always_inline void
00128 IOAPI_INLINE ( efi, outw ) ( uint16_t data, volatile uint16_t *io_addr ) {
00129         efi_iowrite ( data, io_addr, sizeof ( *io_addr ) );
00130 }
00131 
00132 static inline __always_inline void
00133 IOAPI_INLINE ( efi, outl ) ( uint32_t data, volatile uint32_t *io_addr ) {
00134         efi_iowrite ( data, io_addr, sizeof ( *io_addr ) );
00135 }
00136 
00137 static inline __always_inline void
00138 IOAPI_INLINE ( efi, insb ) ( volatile uint8_t *io_addr, uint8_t *data,
00139                              unsigned int count ) {
00140         efi_ioreads ( io_addr, data, sizeof ( *io_addr ), count );
00141 }
00142 
00143 static inline __always_inline void
00144 IOAPI_INLINE ( efi, insw ) ( volatile uint16_t *io_addr, uint16_t *data,
00145                              unsigned int count ) {
00146         efi_ioreads ( io_addr, data, sizeof ( *io_addr ), count );
00147 }
00148 
00149 static inline __always_inline void
00150 IOAPI_INLINE ( efi, insl ) ( volatile uint32_t *io_addr, uint32_t *data,
00151                              unsigned int count ) {
00152         efi_ioreads ( io_addr, data, sizeof ( *io_addr ), count );
00153 }
00154 
00155 static inline __always_inline void
00156 IOAPI_INLINE ( efi, outsb ) ( volatile uint8_t *io_addr, const uint8_t *data,
00157                               unsigned int count ) {
00158         efi_iowrites ( io_addr, data, sizeof ( *io_addr ), count );
00159 }
00160 
00161 static inline __always_inline void
00162 IOAPI_INLINE ( efi, outsw ) ( volatile uint16_t *io_addr, const uint16_t *data,
00163                               unsigned int count ) {
00164         efi_iowrites ( io_addr, data, sizeof ( *io_addr ), count );
00165 }
00166 
00167 static inline __always_inline void
00168 IOAPI_INLINE ( efi, outsl ) ( volatile uint32_t *io_addr, const uint32_t *data,
00169                               unsigned int count ) {
00170         efi_iowrites ( io_addr, data, sizeof ( *io_addr ), count );
00171 }
00172 
00173 static inline __always_inline void
00174 IOAPI_INLINE ( efi, mb ) ( void ) {
00175         /* Do nothing; EFI readl()/writel() calls already act as
00176          * memory barriers.
00177          */
00178 }
00179 
00180 #endif /* _GPXE_EFI_IO_H */

Generated on Tue Apr 6 20:01:06 2010 for gPXE by  doxygen 1.5.7.1