13df0ccccSAndrew Jones #ifndef _ASM_GENERIC_IO_H_
23df0ccccSAndrew Jones #define _ASM_GENERIC_IO_H_
33df0ccccSAndrew Jones /*
43df0ccccSAndrew Jones * asm-generic/io.h
53df0ccccSAndrew Jones * adapted from the Linux kernel's include/asm-generic/io.h
63df0ccccSAndrew Jones * and arch/arm/include/asm/io.h
73df0ccccSAndrew Jones *
849f758b8SAndrew Jones * Copyright (C) 2017, Red Hat Inc, Andrew Jones <drjones@redhat.com>
93df0ccccSAndrew Jones *
1049f758b8SAndrew Jones * This work is licensed under the terms of the GNU GPL, version 2.
113df0ccccSAndrew Jones */
123df0ccccSAndrew Jones #include "libcflat.h"
13f4f73de7SAndrew Jones #include "asm/page.h"
142b0de978SAlexander Gordeev #include "asm/barrier.h"
153df0ccccSAndrew Jones
16*677a747dSPierre Morel #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
17*677a747dSPierre Morel #define __cpu_is_be() (0)
18*677a747dSPierre Morel #elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
19*677a747dSPierre Morel #define __cpu_is_be() (1)
20*677a747dSPierre Morel #else
21*677a747dSPierre Morel #error Undefined byte order
22*677a747dSPierre Morel #endif
23*677a747dSPierre Morel
243df0ccccSAndrew Jones #ifndef __raw_readb
__raw_readb(const volatile void * addr)253df0ccccSAndrew Jones static inline u8 __raw_readb(const volatile void *addr)
263df0ccccSAndrew Jones {
273df0ccccSAndrew Jones return *(const volatile u8 *)addr;
283df0ccccSAndrew Jones }
293df0ccccSAndrew Jones #endif
303df0ccccSAndrew Jones
313df0ccccSAndrew Jones #ifndef __raw_readw
__raw_readw(const volatile void * addr)323df0ccccSAndrew Jones static inline u16 __raw_readw(const volatile void *addr)
333df0ccccSAndrew Jones {
343df0ccccSAndrew Jones return *(const volatile u16 *)addr;
353df0ccccSAndrew Jones }
363df0ccccSAndrew Jones #endif
373df0ccccSAndrew Jones
383df0ccccSAndrew Jones #ifndef __raw_readl
__raw_readl(const volatile void * addr)393df0ccccSAndrew Jones static inline u32 __raw_readl(const volatile void *addr)
403df0ccccSAndrew Jones {
413df0ccccSAndrew Jones return *(const volatile u32 *)addr;
423df0ccccSAndrew Jones }
433df0ccccSAndrew Jones #endif
443df0ccccSAndrew Jones
453df0ccccSAndrew Jones #ifndef __raw_readq
__raw_readq(const volatile void * addr)463df0ccccSAndrew Jones static inline u64 __raw_readq(const volatile void *addr)
473df0ccccSAndrew Jones {
483df0ccccSAndrew Jones assert(sizeof(unsigned long) == sizeof(u64));
493df0ccccSAndrew Jones return *(const volatile u64 *)addr;
503df0ccccSAndrew Jones }
513df0ccccSAndrew Jones #endif
523df0ccccSAndrew Jones
533df0ccccSAndrew Jones #ifndef __raw_writeb
__raw_writeb(u8 b,volatile void * addr)543df0ccccSAndrew Jones static inline void __raw_writeb(u8 b, volatile void *addr)
553df0ccccSAndrew Jones {
563df0ccccSAndrew Jones *(volatile u8 *)addr = b;
573df0ccccSAndrew Jones }
583df0ccccSAndrew Jones #endif
593df0ccccSAndrew Jones
603df0ccccSAndrew Jones #ifndef __raw_writew
__raw_writew(u16 b,volatile void * addr)613df0ccccSAndrew Jones static inline void __raw_writew(u16 b, volatile void *addr)
623df0ccccSAndrew Jones {
633df0ccccSAndrew Jones *(volatile u16 *)addr = b;
643df0ccccSAndrew Jones }
653df0ccccSAndrew Jones #endif
663df0ccccSAndrew Jones
673df0ccccSAndrew Jones #ifndef __raw_writel
__raw_writel(u32 b,volatile void * addr)683df0ccccSAndrew Jones static inline void __raw_writel(u32 b, volatile void *addr)
693df0ccccSAndrew Jones {
703df0ccccSAndrew Jones *(volatile u32 *)addr = b;
713df0ccccSAndrew Jones }
723df0ccccSAndrew Jones #endif
733df0ccccSAndrew Jones
743df0ccccSAndrew Jones #ifndef __raw_writeq
__raw_writeq(u64 b,volatile void * addr)753df0ccccSAndrew Jones static inline void __raw_writeq(u64 b, volatile void *addr)
763df0ccccSAndrew Jones {
773df0ccccSAndrew Jones assert(sizeof(unsigned long) == sizeof(u64));
783df0ccccSAndrew Jones *(volatile u64 *)addr = b;
793df0ccccSAndrew Jones }
803df0ccccSAndrew Jones #endif
813df0ccccSAndrew Jones
823df0ccccSAndrew Jones #ifndef __bswap16
__bswap16(u16 x)833df0ccccSAndrew Jones static inline u16 __bswap16(u16 x)
843df0ccccSAndrew Jones {
853df0ccccSAndrew Jones return ((x >> 8) & 0xff) | ((x & 0xff) << 8);
863df0ccccSAndrew Jones }
873df0ccccSAndrew Jones #endif
883df0ccccSAndrew Jones
893df0ccccSAndrew Jones #ifndef __bswap32
__bswap32(u32 x)903df0ccccSAndrew Jones static inline u32 __bswap32(u32 x)
913df0ccccSAndrew Jones {
923df0ccccSAndrew Jones return ((x & 0xff000000) >> 24) | ((x & 0x00ff0000) >> 8) |
933df0ccccSAndrew Jones ((x & 0x0000ff00) << 8) | ((x & 0x000000ff) << 24);
943df0ccccSAndrew Jones }
953df0ccccSAndrew Jones #endif
963df0ccccSAndrew Jones
973df0ccccSAndrew Jones #ifndef __bswap64
__bswap64(u64 x)983df0ccccSAndrew Jones static inline u64 __bswap64(u64 x)
993df0ccccSAndrew Jones {
1003df0ccccSAndrew Jones return ((x & 0x00000000000000ffULL) << 56) |
1013df0ccccSAndrew Jones ((x & 0x000000000000ff00ULL) << 40) |
1023df0ccccSAndrew Jones ((x & 0x0000000000ff0000ULL) << 24) |
1033df0ccccSAndrew Jones ((x & 0x00000000ff000000ULL) << 8) |
1043df0ccccSAndrew Jones ((x & 0x000000ff00000000ULL) >> 8) |
1053df0ccccSAndrew Jones ((x & 0x0000ff0000000000ULL) >> 24) |
1063df0ccccSAndrew Jones ((x & 0x00ff000000000000ULL) >> 40) |
1073df0ccccSAndrew Jones ((x & 0xff00000000000000ULL) >> 56);
1083df0ccccSAndrew Jones }
1093df0ccccSAndrew Jones #endif
1103df0ccccSAndrew Jones
1113df0ccccSAndrew Jones #define le16_to_cpu(x) \
11255243010SAndrew Jones ({ u16 __r = __cpu_is_be() ? __bswap16(x) : ((u16)x); __r; })
1133df0ccccSAndrew Jones #define cpu_to_le16 le16_to_cpu
1143df0ccccSAndrew Jones
1153df0ccccSAndrew Jones #define le32_to_cpu(x) \
11655243010SAndrew Jones ({ u32 __r = __cpu_is_be() ? __bswap32(x) : ((u32)x); __r; })
1173df0ccccSAndrew Jones #define cpu_to_le32 le32_to_cpu
1183df0ccccSAndrew Jones
1193df0ccccSAndrew Jones #define le64_to_cpu(x) \
12055243010SAndrew Jones ({ u64 __r = __cpu_is_be() ? __bswap64(x) : ((u64)x); __r; })
1213df0ccccSAndrew Jones #define cpu_to_le64 le64_to_cpu
1223df0ccccSAndrew Jones
1233df0ccccSAndrew Jones #define be16_to_cpu(x) \
12455243010SAndrew Jones ({ u16 __r = !__cpu_is_be() ? __bswap16(x) : ((u16)x); __r; })
1253df0ccccSAndrew Jones #define cpu_to_be16 be16_to_cpu
1263df0ccccSAndrew Jones
1273df0ccccSAndrew Jones #define be32_to_cpu(x) \
12855243010SAndrew Jones ({ u32 __r = !__cpu_is_be() ? __bswap32(x) : ((u32)x); __r; })
1293df0ccccSAndrew Jones #define cpu_to_be32 be32_to_cpu
1303df0ccccSAndrew Jones
1313df0ccccSAndrew Jones #define be64_to_cpu(x) \
13255243010SAndrew Jones ({ u64 __r = !__cpu_is_be() ? __bswap64(x) : ((u64)x); __r; })
1333df0ccccSAndrew Jones #define cpu_to_be64 be64_to_cpu
1343df0ccccSAndrew Jones
1353df0ccccSAndrew Jones #define readb(addr) \
1363df0ccccSAndrew Jones ({ u8 __r = __raw_readb(addr); rmb(); __r; })
1373df0ccccSAndrew Jones #define readw(addr) \
1383df0ccccSAndrew Jones ({ u16 __r = le16_to_cpu(__raw_readw(addr)); rmb(); __r; })
1393df0ccccSAndrew Jones #define readl(addr) \
1403df0ccccSAndrew Jones ({ u32 __r = le32_to_cpu(__raw_readl(addr)); rmb(); __r; })
1413df0ccccSAndrew Jones #define readq(addr) \
1423df0ccccSAndrew Jones ({ u64 __r = le64_to_cpu(__raw_readq(addr)); rmb(); __r; })
1433df0ccccSAndrew Jones
1443df0ccccSAndrew Jones #define writeb(b, addr) \
1453df0ccccSAndrew Jones ({ wmb(); __raw_writeb(b, addr); })
1463df0ccccSAndrew Jones #define writew(b, addr) \
1473df0ccccSAndrew Jones ({ wmb(); __raw_writew(cpu_to_le16(b), addr); })
1483df0ccccSAndrew Jones #define writel(b, addr) \
1493df0ccccSAndrew Jones ({ wmb(); __raw_writel(cpu_to_le32(b), addr); })
1503df0ccccSAndrew Jones #define writeq(b, addr) \
1513df0ccccSAndrew Jones ({ wmb(); __raw_writeq(cpu_to_le64(b), addr); })
1523df0ccccSAndrew Jones
153a0940b31SAlexander Gordeev #ifndef inb
inb(unsigned long port)154a0940b31SAlexander Gordeev static inline uint8_t inb(unsigned long port)
155a0940b31SAlexander Gordeev {
156a0940b31SAlexander Gordeev return readb((const volatile void __iomem *)port);
157a0940b31SAlexander Gordeev }
158a0940b31SAlexander Gordeev #endif
159a0940b31SAlexander Gordeev
160a0940b31SAlexander Gordeev #ifndef inw
inw(unsigned long port)161a0940b31SAlexander Gordeev static inline uint16_t inw(unsigned long port)
162a0940b31SAlexander Gordeev {
163a0940b31SAlexander Gordeev return readw((const volatile void __iomem *)port);
164a0940b31SAlexander Gordeev }
165a0940b31SAlexander Gordeev #endif
166a0940b31SAlexander Gordeev
167a0940b31SAlexander Gordeev #ifndef inl
inl(unsigned long port)168a0940b31SAlexander Gordeev static inline uint32_t inl(unsigned long port)
169a0940b31SAlexander Gordeev {
170a0940b31SAlexander Gordeev return readl((const volatile void __iomem *)port);
171a0940b31SAlexander Gordeev }
172a0940b31SAlexander Gordeev #endif
173a0940b31SAlexander Gordeev
174a0940b31SAlexander Gordeev #ifndef outb
outb(uint8_t value,unsigned long port)175a0940b31SAlexander Gordeev static inline void outb(uint8_t value, unsigned long port)
176a0940b31SAlexander Gordeev {
177a0940b31SAlexander Gordeev writeb(value, (volatile void __iomem *)port);
178a0940b31SAlexander Gordeev }
179a0940b31SAlexander Gordeev #endif
180a0940b31SAlexander Gordeev
181a0940b31SAlexander Gordeev #ifndef outw
outw(uint16_t value,unsigned long port)182a0940b31SAlexander Gordeev static inline void outw(uint16_t value, unsigned long port)
183a0940b31SAlexander Gordeev {
184a0940b31SAlexander Gordeev writew(value, (volatile void __iomem *)port);
185a0940b31SAlexander Gordeev }
186a0940b31SAlexander Gordeev #endif
187a0940b31SAlexander Gordeev
188a0940b31SAlexander Gordeev #ifndef outl
outl(uint32_t value,unsigned long port)189a0940b31SAlexander Gordeev static inline void outl(uint32_t value, unsigned long port)
190a0940b31SAlexander Gordeev {
191a0940b31SAlexander Gordeev writel(value, (volatile void __iomem *)port);
192a0940b31SAlexander Gordeev }
193a0940b31SAlexander Gordeev #endif
194a0940b31SAlexander Gordeev
1953df0ccccSAndrew Jones #ifndef ioremap
ioremap(phys_addr_t phys_addr,size_t size __unused)1964f37c3a9SAlexander Gordeev static inline void __iomem *ioremap(phys_addr_t phys_addr, size_t size __unused)
1973df0ccccSAndrew Jones {
1983df0ccccSAndrew Jones assert(sizeof(long) == 8 || !(phys_addr >> 32));
1994f37c3a9SAlexander Gordeev return (void __iomem *)(unsigned long)phys_addr;
2003df0ccccSAndrew Jones }
2013df0ccccSAndrew Jones #endif
2023df0ccccSAndrew Jones
203f4f73de7SAndrew Jones #ifndef virt_to_phys
virt_to_phys(volatile void * address)204f4f73de7SAndrew Jones static inline unsigned long virt_to_phys(volatile void *address)
205f4f73de7SAndrew Jones {
206f4f73de7SAndrew Jones return __pa((unsigned long)address);
207f4f73de7SAndrew Jones }
20845aeebbfSAlexander Gordeev #endif
209f4f73de7SAndrew Jones
21045aeebbfSAlexander Gordeev #ifndef phys_to_virt
phys_to_virt(unsigned long address)211f4f73de7SAndrew Jones static inline void *phys_to_virt(unsigned long address)
212f4f73de7SAndrew Jones {
213f4f73de7SAndrew Jones return __va(address);
214f4f73de7SAndrew Jones }
215f4f73de7SAndrew Jones #endif
216f4f73de7SAndrew Jones
2173df0ccccSAndrew Jones #endif /* _ASM_GENERIC_IO_H_ */
218