mmio.h 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. /*
  2. * Copyright (c) 2013-2014, ARM Limited and Contributors. All rights reserved.
  3. *
  4. * SPDX-License-Identifier: BSD-3-Clause
  5. */
  6. #ifndef __MMIO_H__
  7. #define __MMIO_H__
  8. #include <stdint.h>
  9. #include "types.h"
  10. #ifndef ARCH_ARM
  11. #define __raw_readb(a) (*(volatile unsigned char *)(a))
  12. #define __raw_readw(a) (*(volatile unsigned short *)(a))
  13. #define __raw_readl(a) (*(volatile unsigned int *)(a))
  14. #define __raw_readq(a) (*(volatile unsigned long long *)(a))
  15. #define __raw_writeb(v,a) (*(volatile unsigned char *)(a) = (v))
  16. #define __raw_writew(v,a) (*(volatile unsigned short *)(a) = (v))
  17. #define __raw_writel(v,a) (*(volatile unsigned int *)(a) = (v))
  18. #define __raw_writeq(v,a) (*(volatile unsigned long long *)(a) = (v))
  19. /*
  20. * I/O memory access primitives. Reads are ordered relative to any
  21. * following Normal memory access. Writes are ordered relative to any prior
  22. * Normal memory access. The memory barriers here are necessary as RISC-V
  23. * doesn't define any ordering between the memory space and the I/O space.
  24. */
  25. #define __io_br() do {} while (0)
  26. #define __io_ar(v) __asm__ __volatile__ ("fence i,r" : : : "memory")
  27. #define __io_bw() __asm__ __volatile__ ("fence w,o" : : : "memory")
  28. //#define __io_aw() mmiowb_set_pending()
  29. #define __io_aw() do {} while (0)
  30. #define readb(c) ({ u8 __v; __io_br(); __v = __raw_readb(c); __io_ar(__v); __v; })
  31. #define readw(c) ({ u16 __v; __io_br(); __v = __raw_readw(c); __io_ar(__v); __v; })
  32. #define readl(c) ({ u32 __v; __io_br(); __v = __raw_readl(c); __io_ar(__v); __v; })
  33. #define writeb(v, c) ({ __io_bw(); __raw_writeb((v), (c)); __io_aw(); })
  34. #define writew(v, c) ({ __io_bw(); __raw_writew((v), (c)); __io_aw(); })
  35. #define writel(v, c) ({ __io_bw(); __raw_writel((v), (c)); __io_aw(); })
  36. #ifdef CONFIG_64BIT
  37. #define readq(c) ({ u64 __v; __io_br(); __v = __raw_readq(c); __io_ar(__v); __v; })
  38. #define writeq(v, c) ({ __io_bw(); __raw_writeq((v), (c)); __io_aw(); })
  39. #endif // CONFIG_64BIT
  40. #else
  41. #define __raw_readb(a) (*(volatile unsigned char *)(a))
  42. #define __raw_readw(a) (*(volatile unsigned short *)(a))
  43. #define __raw_readl(a) (*(volatile unsigned int *)(a))
  44. #define __raw_readq(a) (*(volatile unsigned long long *)(a))
  45. #define __raw_writeb(v,a) (*(volatile unsigned char *)(a) = (v))
  46. #define __raw_writew(v,a) (*(volatile unsigned short *)(a) = (v))
  47. #define __raw_writel(v,a) (*(volatile unsigned int *)(a) = (v))
  48. #define __raw_writeq(v,a) (*(volatile unsigned long long *)(a) = (v))
  49. #define readb(a) __raw_readb(a)
  50. #define readw(a) __raw_readw(a)
  51. #define readl(a) __raw_readl(a)
  52. #define readq(a) __raw_readq(a)
  53. #define writeb(v, a) __raw_writeb(v,a)
  54. #define writew(v, a) __raw_writew(v,a)
  55. #define writel(v, a) __raw_writel(v,a)
  56. #define writeq(v, a) __raw_writeq(v,a)
  57. #define cpu_write8(a, v) writeb(a, v)
  58. #define cpu_write16(a, v) writew(a, v)
  59. #define cpu_write32(a, v) writel(a, v)
  60. #endif /* ARCH_ARM */
  61. #define mmio_wr32 mmio_write_32
  62. #define mmio_rd32 mmio_read_32
  63. static inline void mmio_write_8(uintptr_t addr, uint8_t value)
  64. {
  65. writeb(value, (void *) addr);
  66. }
  67. static inline uint8_t mmio_read_8(uintptr_t addr)
  68. {
  69. return readb((void *) addr);
  70. }
  71. static inline void mmio_write_16(uintptr_t addr, uint16_t value)
  72. {
  73. writew(value, (void *) addr);
  74. }
  75. static inline uint16_t mmio_read_16(uintptr_t addr)
  76. {
  77. return readw((void *) addr);
  78. }
  79. static inline void mmio_write_32(uintptr_t addr, uint32_t value)
  80. {
  81. writel(value, (void *) addr);
  82. }
  83. static inline uint32_t mmio_read_32(uintptr_t addr)
  84. {
  85. return readl((void *) addr);
  86. }
  87. static inline void mmio_write_64(uintptr_t addr, uint64_t value)
  88. {
  89. writeq(value, (void *) addr);
  90. }
  91. static inline uint64_t mmio_read_64(uintptr_t addr)
  92. {
  93. return readq((void *) addr);
  94. }
  95. static inline void mmio_clrbits_32(uintptr_t addr, uint32_t clear)
  96. {
  97. writel(readl((void *) addr) & ~clear , (void *) addr);
  98. }
  99. static inline void mmio_setbits_32(uintptr_t addr, uint32_t set)
  100. {
  101. writel(readl((void *) addr) | set , (void *) addr);
  102. }
  103. static inline void mmio_clrsetbits_32(uintptr_t addr, uint32_t clear,
  104. uint32_t set)
  105. {
  106. writel((readl((void *) addr) & ~clear) | set , (void *) addr);
  107. }
  108. /* from Linux usage */
  109. #define ioremap(a, l) (a)
  110. #define _reg_read(addr) mmio_read_32((addr))
  111. #define _reg_write(addr, data) mmio_write_32((addr), (data))
  112. #define _reg_write_mask(addr, mask, data) mmio_clrsetbits_32(addr, mask, data)
  113. #define ioread8 readb
  114. #define ioread16 readw
  115. #define ioread32 readl
  116. #define ioread64 readq
  117. #define iowrite8 writeb
  118. #define iowrite16 writew
  119. #define iowrite32 writel
  120. #define iowrite64 writeq
  121. #endif /* __MMIO_H__ */