io.h 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. /*
  2. * Copyright (c) 2019-2020, Xim
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. */
  7. #ifndef ARCH_IO_H
  8. #define ARCH_IO_H
  9. #include <rtthread.h>
  10. #define RISCV_FENCE(p, s) \
  11. __asm__ __volatile__ ("fence " #p "," #s : : : "memory")
  12. /* These barriers need to enforce ordering on both devices or memory. */
  13. #define mb() RISCV_FENCE(iorw,iorw)
  14. #define rmb() RISCV_FENCE(ir,ir)
  15. #define wmb() RISCV_FENCE(ow,ow)
  16. #define __arch_getl(a) (*(unsigned int *)(a))
  17. #define __arch_putl(v, a) (*(unsigned int *)(a) = (v))
  18. #define dmb() mb()
  19. #define __iormb() rmb()
  20. #define __iowmb() wmb()
  21. static inline void writel(uint32_t val, volatile void *addr)
  22. {
  23. __iowmb();
  24. __arch_putl(val, addr);
  25. }
  26. static inline uint32_t readl(const volatile void *addr)
  27. {
  28. uint32_t val;
  29. val = __arch_getl(addr);
  30. __iormb();
  31. return val;
  32. }
  33. static inline void write_reg(
  34. uint32_t val, volatile void *addr, unsigned offset)
  35. {
  36. writel(val, (void *)((rt_size_t)addr + offset));
  37. }
  38. static inline uint32_t read_reg(
  39. const volatile void *addr, unsigned offset)
  40. {
  41. return readl((void *)((rt_size_t)addr + offset));
  42. }
  43. #endif // ARCH_IO_H