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

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