| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- /*
- * Copyright (c) 2013-2014, ARM Limited and Contributors. All rights reserved.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
- #ifndef __MMIO_H__
- #define __MMIO_H__
- #include <stdint.h>
- #include "types.h"
- #ifndef ARCH_ARM
- #define __raw_readb(a) (*(volatile unsigned char *)(a))
- #define __raw_readw(a) (*(volatile unsigned short *)(a))
- #define __raw_readl(a) (*(volatile unsigned int *)(a))
- #define __raw_readq(a) (*(volatile unsigned long long *)(a))
- #define __raw_writeb(v,a) (*(volatile unsigned char *)(a) = (v))
- #define __raw_writew(v,a) (*(volatile unsigned short *)(a) = (v))
- #define __raw_writel(v,a) (*(volatile unsigned int *)(a) = (v))
- #define __raw_writeq(v,a) (*(volatile unsigned long long *)(a) = (v))
- /*
- * I/O memory access primitives. Reads are ordered relative to any
- * following Normal memory access. Writes are ordered relative to any prior
- * Normal memory access. The memory barriers here are necessary as RISC-V
- * doesn't define any ordering between the memory space and the I/O space.
- */
- #define __io_br() do {} while (0)
- #define __io_ar(v) __asm__ __volatile__ ("fence i,r" : : : "memory")
- #define __io_bw() __asm__ __volatile__ ("fence w,o" : : : "memory")
- //#define __io_aw() mmiowb_set_pending()
- #define __io_aw() do {} while (0)
- #define readb(c) ({ u8 __v; __io_br(); __v = __raw_readb(c); __io_ar(__v); __v; })
- #define readw(c) ({ u16 __v; __io_br(); __v = __raw_readw(c); __io_ar(__v); __v; })
- #define readl(c) ({ u32 __v; __io_br(); __v = __raw_readl(c); __io_ar(__v); __v; })
- #define writeb(v, c) ({ __io_bw(); __raw_writeb((v), (c)); __io_aw(); })
- #define writew(v, c) ({ __io_bw(); __raw_writew((v), (c)); __io_aw(); })
- #define writel(v, c) ({ __io_bw(); __raw_writel((v), (c)); __io_aw(); })
- #ifdef CONFIG_64BIT
- #define readq(c) ({ u64 __v; __io_br(); __v = __raw_readq(c); __io_ar(__v); __v; })
- #define writeq(v, c) ({ __io_bw(); __raw_writeq((v), (c)); __io_aw(); })
- #endif // CONFIG_64BIT
- #else
- #define __raw_readb(a) (*(volatile unsigned char *)(a))
- #define __raw_readw(a) (*(volatile unsigned short *)(a))
- #define __raw_readl(a) (*(volatile unsigned int *)(a))
- #define __raw_readq(a) (*(volatile unsigned long long *)(a))
- #define __raw_writeb(v,a) (*(volatile unsigned char *)(a) = (v))
- #define __raw_writew(v,a) (*(volatile unsigned short *)(a) = (v))
- #define __raw_writel(v,a) (*(volatile unsigned int *)(a) = (v))
- #define __raw_writeq(v,a) (*(volatile unsigned long long *)(a) = (v))
- #define readb(a) __raw_readb(a)
- #define readw(a) __raw_readw(a)
- #define readl(a) __raw_readl(a)
- #define readq(a) __raw_readq(a)
- #define writeb(v, a) __raw_writeb(v,a)
- #define writew(v, a) __raw_writew(v,a)
- #define writel(v, a) __raw_writel(v,a)
- #define writeq(v, a) __raw_writeq(v,a)
- #define cpu_write8(a, v) writeb(a, v)
- #define cpu_write16(a, v) writew(a, v)
- #define cpu_write32(a, v) writel(a, v)
- #endif /* ARCH_ARM */
- #define mmio_wr32 mmio_write_32
- #define mmio_rd32 mmio_read_32
- static inline void mmio_write_8(uintptr_t addr, uint8_t value)
- {
- writeb(value, (void *) addr);
- }
- static inline uint8_t mmio_read_8(uintptr_t addr)
- {
- return readb((void *) addr);
- }
- static inline void mmio_write_16(uintptr_t addr, uint16_t value)
- {
- writew(value, (void *) addr);
- }
- static inline uint16_t mmio_read_16(uintptr_t addr)
- {
- return readw((void *) addr);
- }
- static inline void mmio_write_32(uintptr_t addr, uint32_t value)
- {
- writel(value, (void *) addr);
- }
- static inline uint32_t mmio_read_32(uintptr_t addr)
- {
- return readl((void *) addr);
- }
- static inline void mmio_write_64(uintptr_t addr, uint64_t value)
- {
- writeq(value, (void *) addr);
- }
- static inline uint64_t mmio_read_64(uintptr_t addr)
- {
- return readq((void *) addr);
- }
- static inline void mmio_clrbits_32(uintptr_t addr, uint32_t clear)
- {
- writel(readl((void *) addr) & ~clear , (void *) addr);
- }
- static inline void mmio_setbits_32(uintptr_t addr, uint32_t set)
- {
- writel(readl((void *) addr) | set , (void *) addr);
- }
- static inline void mmio_clrsetbits_32(uintptr_t addr, uint32_t clear,
- uint32_t set)
- {
- writel((readl((void *) addr) & ~clear) | set , (void *) addr);
- }
- /* from Linux usage */
- #define ioremap(a, l) (a)
- #define _reg_read(addr) mmio_read_32((addr))
- #define _reg_write(addr, data) mmio_write_32((addr), (data))
- #define _reg_write_mask(addr, mask, data) mmio_clrsetbits_32(addr, mask, data)
- #define ioread8 readb
- #define ioread16 readw
- #define ioread32 readl
- #define ioread64 readq
- #define iowrite8 writeb
- #define iowrite16 writew
- #define iowrite32 writel
- #define iowrite64 writeq
- #endif /* __MMIO_H__ */
|