#ifndef _GPXE_EFI_IO_H #define _GPXE_EFI_IO_H /** @file * * gPXE I/O API for EFI * * EFI runs with flat physical addressing, so the various mappings * between virtual addresses, I/O addresses and bus addresses are all * no-ops. I/O is handled using the EFI_CPU_IO_PROTOCOL. */ FILE_LICENCE ( GPL2_OR_LATER ); #ifdef IOAPI_EFI #define IOAPI_PREFIX_efi #else #define IOAPI_PREFIX_efi __efi_ #endif extern unsigned long long efi_ioread ( volatile void *io_addr, size_t size ); extern void efi_iowrite ( unsigned long long data, volatile void *io_addr, size_t size ); extern void efi_ioreads ( volatile void *io_addr, void *data, size_t size, unsigned int count ); extern void efi_iowrites ( volatile void *io_addr, const void *data, size_t size, unsigned int count ); /* * Physical<->Bus and Bus<->I/O address mappings * * EFI runs with flat physical addressing, so these are all no-ops. * */ static inline __always_inline unsigned long IOAPI_INLINE ( efi, phys_to_bus ) ( unsigned long phys_addr ) { return phys_addr; } static inline __always_inline unsigned long IOAPI_INLINE ( efi, bus_to_phys ) ( unsigned long bus_addr ) { return bus_addr; } static inline __always_inline void * IOAPI_INLINE ( efi, ioremap ) ( unsigned long bus_addr, size_t len __unused ) { return ( ( void * ) bus_addr ); } static inline __always_inline void IOAPI_INLINE ( efi, iounmap ) ( volatile const void *io_addr __unused ) { /* Nothing to do */ } static inline __always_inline unsigned long IOAPI_INLINE ( efi, io_to_bus ) ( volatile const void *io_addr ) { return ( ( unsigned long ) io_addr ); } /* * I/O functions * */ static inline __always_inline uint8_t IOAPI_INLINE ( efi, readb ) ( volatile uint8_t *io_addr ) { return efi_ioread ( io_addr, sizeof ( *io_addr ) ); } static inline __always_inline uint16_t IOAPI_INLINE ( efi, readw ) ( volatile uint16_t *io_addr ) { return efi_ioread ( io_addr, sizeof ( *io_addr ) ); } static inline __always_inline uint32_t IOAPI_INLINE ( efi, readl ) ( volatile uint32_t *io_addr ) { return efi_ioread ( io_addr, sizeof ( *io_addr ) ); } static inline __always_inline uint64_t IOAPI_INLINE ( efi, readq ) ( volatile uint64_t *io_addr ) { return efi_ioread ( io_addr, sizeof ( *io_addr ) ); } static inline __always_inline void IOAPI_INLINE ( efi, writeb ) ( uint8_t data, volatile uint8_t *io_addr ) { efi_iowrite ( data, io_addr, sizeof ( *io_addr ) ); } static inline __always_inline void IOAPI_INLINE ( efi, writew ) ( uint16_t data, volatile uint16_t *io_addr ) { efi_iowrite ( data, io_addr, sizeof ( *io_addr ) ); } static inline __always_inline void IOAPI_INLINE ( efi, writel ) ( uint32_t data, volatile uint32_t *io_addr ) { efi_iowrite ( data, io_addr, sizeof ( *io_addr ) ); } static inline __always_inline void IOAPI_INLINE ( efi, writeq ) ( uint64_t data, volatile uint64_t *io_addr ) { efi_iowrite ( data, io_addr, sizeof ( *io_addr ) ); } static inline __always_inline uint8_t IOAPI_INLINE ( efi, inb ) ( volatile uint8_t *io_addr ) { return efi_ioread ( io_addr, sizeof ( *io_addr ) ); } static inline __always_inline uint16_t IOAPI_INLINE ( efi, inw ) ( volatile uint16_t *io_addr ) { return efi_ioread ( io_addr, sizeof ( *io_addr ) ); } static inline __always_inline uint32_t IOAPI_INLINE ( efi, inl ) ( volatile uint32_t *io_addr ) { return efi_ioread ( io_addr, sizeof ( *io_addr ) ); } static inline __always_inline void IOAPI_INLINE ( efi, outb ) ( uint8_t data, volatile uint8_t *io_addr ) { efi_iowrite ( data, io_addr, sizeof ( *io_addr ) ); } static inline __always_inline void IOAPI_INLINE ( efi, outw ) ( uint16_t data, volatile uint16_t *io_addr ) { efi_iowrite ( data, io_addr, sizeof ( *io_addr ) ); } static inline __always_inline void IOAPI_INLINE ( efi, outl ) ( uint32_t data, volatile uint32_t *io_addr ) { efi_iowrite ( data, io_addr, sizeof ( *io_addr ) ); } static inline __always_inline void IOAPI_INLINE ( efi, insb ) ( volatile uint8_t *io_addr, uint8_t *data, unsigned int count ) { efi_ioreads ( io_addr, data, sizeof ( *io_addr ), count ); } static inline __always_inline void IOAPI_INLINE ( efi, insw ) ( volatile uint16_t *io_addr, uint16_t *data, unsigned int count ) { efi_ioreads ( io_addr, data, sizeof ( *io_addr ), count ); } static inline __always_inline void IOAPI_INLINE ( efi, insl ) ( volatile uint32_t *io_addr, uint32_t *data, unsigned int count ) { efi_ioreads ( io_addr, data, sizeof ( *io_addr ), count ); } static inline __always_inline void IOAPI_INLINE ( efi, outsb ) ( volatile uint8_t *io_addr, const uint8_t *data, unsigned int count ) { efi_iowrites ( io_addr, data, sizeof ( *io_addr ), count ); } static inline __always_inline void IOAPI_INLINE ( efi, outsw ) ( volatile uint16_t *io_addr, const uint16_t *data, unsigned int count ) { efi_iowrites ( io_addr, data, sizeof ( *io_addr ), count ); } static inline __always_inline void IOAPI_INLINE ( efi, outsl ) ( volatile uint32_t *io_addr, const uint32_t *data, unsigned int count ) { efi_iowrites ( io_addr, data, sizeof ( *io_addr ), count ); } static inline __always_inline void IOAPI_INLINE ( efi, mb ) ( void ) { /* Do nothing; EFI readl()/writel() calls already act as * memory barriers. */ } #endif /* _GPXE_EFI_IO_H */