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