You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

efi_io.h 5.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. #ifndef _GPXE_EFI_IO_H
  2. #define _GPXE_EFI_IO_H
  3. /** @file
  4. *
  5. * gPXE I/O API for EFI
  6. *
  7. * EFI runs with flat physical addressing, so the various mappings
  8. * between virtual addresses, I/O addresses and bus addresses are all
  9. * no-ops. I/O is handled using the EFI_CPU_IO_PROTOCOL.
  10. */
  11. #ifdef IOAPI_EFI
  12. #define IOAPI_PREFIX_efi
  13. #else
  14. #define IOAPI_PREFIX_efi __efi_
  15. #endif
  16. extern unsigned long long efi_ioread ( volatile void *io_addr,
  17. size_t size );
  18. extern void efi_iowrite ( unsigned long long data, volatile void *io_addr,
  19. size_t size );
  20. extern void efi_ioreads ( volatile void *io_addr, void *data,
  21. size_t size, unsigned int count );
  22. extern void efi_iowrites ( volatile void *io_addr, const void *data,
  23. size_t size, unsigned int count );
  24. /*
  25. * Physical<->Bus and Bus<->I/O address mappings
  26. *
  27. * EFI runs with flat physical addressing, so these are all no-ops.
  28. *
  29. */
  30. static inline __always_inline unsigned long
  31. IOAPI_INLINE ( efi, phys_to_bus ) ( unsigned long phys_addr ) {
  32. return phys_addr;
  33. }
  34. static inline __always_inline unsigned long
  35. IOAPI_INLINE ( efi, bus_to_phys ) ( unsigned long bus_addr ) {
  36. return bus_addr;
  37. }
  38. static inline __always_inline void *
  39. IOAPI_INLINE ( efi, ioremap ) ( unsigned long bus_addr, size_t len __unused ) {
  40. return ( ( void * ) bus_addr );
  41. }
  42. static inline __always_inline void
  43. IOAPI_INLINE ( efi, iounmap ) ( volatile const void *io_addr __unused ) {
  44. /* Nothing to do */
  45. }
  46. static inline __always_inline unsigned long
  47. IOAPI_INLINE ( efi, io_to_bus ) ( volatile const void *io_addr ) {
  48. return ( ( unsigned long ) io_addr );
  49. }
  50. /*
  51. * I/O functions
  52. *
  53. */
  54. static inline __always_inline uint8_t
  55. IOAPI_INLINE ( efi, readb ) ( volatile uint8_t *io_addr ) {
  56. return efi_ioread ( io_addr, sizeof ( *io_addr ) );
  57. }
  58. static inline __always_inline uint16_t
  59. IOAPI_INLINE ( efi, readw ) ( volatile uint16_t *io_addr ) {
  60. return efi_ioread ( io_addr, sizeof ( *io_addr ) );
  61. }
  62. static inline __always_inline uint32_t
  63. IOAPI_INLINE ( efi, readl ) ( volatile uint32_t *io_addr ) {
  64. return efi_ioread ( io_addr, sizeof ( *io_addr ) );
  65. }
  66. static inline __always_inline uint64_t
  67. IOAPI_INLINE ( efi, readq ) ( volatile uint64_t *io_addr ) {
  68. return efi_ioread ( io_addr, sizeof ( *io_addr ) );
  69. }
  70. static inline __always_inline void
  71. IOAPI_INLINE ( efi, writeb ) ( uint8_t data, volatile uint8_t *io_addr ) {
  72. efi_iowrite ( data, io_addr, sizeof ( *io_addr ) );
  73. }
  74. static inline __always_inline void
  75. IOAPI_INLINE ( efi, writew ) ( uint16_t data, volatile uint16_t *io_addr ) {
  76. efi_iowrite ( data, io_addr, sizeof ( *io_addr ) );
  77. }
  78. static inline __always_inline void
  79. IOAPI_INLINE ( efi, writel ) ( uint32_t data, volatile uint32_t *io_addr ) {
  80. efi_iowrite ( data, io_addr, sizeof ( *io_addr ) );
  81. }
  82. static inline __always_inline void
  83. IOAPI_INLINE ( efi, writeq ) ( uint64_t data, volatile uint64_t *io_addr ) {
  84. efi_iowrite ( data, io_addr, sizeof ( *io_addr ) );
  85. }
  86. static inline __always_inline uint8_t
  87. IOAPI_INLINE ( efi, inb ) ( volatile uint8_t *io_addr ) {
  88. return efi_ioread ( io_addr, sizeof ( *io_addr ) );
  89. }
  90. static inline __always_inline uint16_t
  91. IOAPI_INLINE ( efi, inw ) ( volatile uint16_t *io_addr ) {
  92. return efi_ioread ( io_addr, sizeof ( *io_addr ) );
  93. }
  94. static inline __always_inline uint32_t
  95. IOAPI_INLINE ( efi, inl ) ( volatile uint32_t *io_addr ) {
  96. return efi_ioread ( io_addr, sizeof ( *io_addr ) );
  97. }
  98. static inline __always_inline void
  99. IOAPI_INLINE ( efi, outb ) ( uint8_t data, volatile uint8_t *io_addr ) {
  100. efi_iowrite ( data, io_addr, sizeof ( *io_addr ) );
  101. }
  102. static inline __always_inline void
  103. IOAPI_INLINE ( efi, outw ) ( uint16_t data, volatile uint16_t *io_addr ) {
  104. efi_iowrite ( data, io_addr, sizeof ( *io_addr ) );
  105. }
  106. static inline __always_inline void
  107. IOAPI_INLINE ( efi, outl ) ( uint32_t data, volatile uint32_t *io_addr ) {
  108. efi_iowrite ( data, io_addr, sizeof ( *io_addr ) );
  109. }
  110. static inline __always_inline void
  111. IOAPI_INLINE ( efi, insb ) ( volatile uint8_t *io_addr, uint8_t *data,
  112. unsigned int count ) {
  113. efi_ioreads ( io_addr, data, sizeof ( *io_addr ), count );
  114. }
  115. static inline __always_inline void
  116. IOAPI_INLINE ( efi, insw ) ( volatile uint16_t *io_addr, uint16_t *data,
  117. unsigned int count ) {
  118. efi_ioreads ( io_addr, data, sizeof ( *io_addr ), count );
  119. }
  120. static inline __always_inline void
  121. IOAPI_INLINE ( efi, insl ) ( volatile uint32_t *io_addr, uint32_t *data,
  122. unsigned int count ) {
  123. efi_ioreads ( io_addr, data, sizeof ( *io_addr ), count );
  124. }
  125. static inline __always_inline void
  126. IOAPI_INLINE ( efi, outsb ) ( volatile uint8_t *io_addr, const uint8_t *data,
  127. unsigned int count ) {
  128. efi_iowrites ( io_addr, data, sizeof ( *io_addr ), count );
  129. }
  130. static inline __always_inline void
  131. IOAPI_INLINE ( efi, outsw ) ( volatile uint16_t *io_addr, const uint16_t *data,
  132. unsigned int count ) {
  133. efi_iowrites ( io_addr, data, sizeof ( *io_addr ), count );
  134. }
  135. static inline __always_inline void
  136. IOAPI_INLINE ( efi, outsl ) ( volatile uint32_t *io_addr, const uint32_t *data,
  137. unsigned int count ) {
  138. efi_iowrites ( io_addr, data, sizeof ( *io_addr ), count );
  139. }
  140. static inline __always_inline void
  141. IOAPI_INLINE ( efi, mb ) ( void ) {
  142. /* Do nothing; EFI readl()/writel() calls already act as
  143. * memory barriers.
  144. */
  145. }
  146. #endif /* _GPXE_EFI_IO_H */