1*3df0ccccSAndrew Jones #ifndef _ASM_GENERIC_IO_H_ 2*3df0ccccSAndrew Jones #define _ASM_GENERIC_IO_H_ 3*3df0ccccSAndrew Jones /* 4*3df0ccccSAndrew Jones * asm-generic/io.h 5*3df0ccccSAndrew Jones * adapted from the Linux kernel's include/asm-generic/io.h 6*3df0ccccSAndrew Jones * and arch/arm/include/asm/io.h 7*3df0ccccSAndrew Jones * 8*3df0ccccSAndrew Jones * Copyright (C) 2014, Red Hat Inc, Andrew Jones <drjones@redhat.com> 9*3df0ccccSAndrew Jones * 10*3df0ccccSAndrew Jones * This work is licensed under the terms of the GNU LGPL, version 2. 11*3df0ccccSAndrew Jones */ 12*3df0ccccSAndrew Jones #include "libcflat.h" 13*3df0ccccSAndrew Jones 14*3df0ccccSAndrew Jones #ifndef __raw_readb 15*3df0ccccSAndrew Jones static inline u8 __raw_readb(const volatile void *addr) 16*3df0ccccSAndrew Jones { 17*3df0ccccSAndrew Jones return *(const volatile u8 *)addr; 18*3df0ccccSAndrew Jones } 19*3df0ccccSAndrew Jones #endif 20*3df0ccccSAndrew Jones 21*3df0ccccSAndrew Jones #ifndef __raw_readw 22*3df0ccccSAndrew Jones static inline u16 __raw_readw(const volatile void *addr) 23*3df0ccccSAndrew Jones { 24*3df0ccccSAndrew Jones return *(const volatile u16 *)addr; 25*3df0ccccSAndrew Jones } 26*3df0ccccSAndrew Jones #endif 27*3df0ccccSAndrew Jones 28*3df0ccccSAndrew Jones #ifndef __raw_readl 29*3df0ccccSAndrew Jones static inline u32 __raw_readl(const volatile void *addr) 30*3df0ccccSAndrew Jones { 31*3df0ccccSAndrew Jones return *(const volatile u32 *)addr; 32*3df0ccccSAndrew Jones } 33*3df0ccccSAndrew Jones #endif 34*3df0ccccSAndrew Jones 35*3df0ccccSAndrew Jones #ifndef __raw_readq 36*3df0ccccSAndrew Jones static inline u64 __raw_readq(const volatile void *addr) 37*3df0ccccSAndrew Jones { 38*3df0ccccSAndrew Jones assert(sizeof(unsigned long) == sizeof(u64)); 39*3df0ccccSAndrew Jones return *(const volatile u64 *)addr; 40*3df0ccccSAndrew Jones } 41*3df0ccccSAndrew Jones #endif 42*3df0ccccSAndrew Jones 43*3df0ccccSAndrew Jones #ifndef __raw_writeb 44*3df0ccccSAndrew Jones static inline void __raw_writeb(u8 b, volatile void *addr) 45*3df0ccccSAndrew Jones { 46*3df0ccccSAndrew Jones *(volatile u8 *)addr = b; 47*3df0ccccSAndrew Jones } 48*3df0ccccSAndrew Jones #endif 49*3df0ccccSAndrew Jones 50*3df0ccccSAndrew Jones #ifndef __raw_writew 51*3df0ccccSAndrew Jones static inline void __raw_writew(u16 b, volatile void *addr) 52*3df0ccccSAndrew Jones { 53*3df0ccccSAndrew Jones *(volatile u16 *)addr = b; 54*3df0ccccSAndrew Jones } 55*3df0ccccSAndrew Jones #endif 56*3df0ccccSAndrew Jones 57*3df0ccccSAndrew Jones #ifndef __raw_writel 58*3df0ccccSAndrew Jones static inline void __raw_writel(u32 b, volatile void *addr) 59*3df0ccccSAndrew Jones { 60*3df0ccccSAndrew Jones *(volatile u32 *)addr = b; 61*3df0ccccSAndrew Jones } 62*3df0ccccSAndrew Jones #endif 63*3df0ccccSAndrew Jones 64*3df0ccccSAndrew Jones #ifndef __raw_writeq 65*3df0ccccSAndrew Jones static inline void __raw_writeq(u64 b, volatile void *addr) 66*3df0ccccSAndrew Jones { 67*3df0ccccSAndrew Jones assert(sizeof(unsigned long) == sizeof(u64)); 68*3df0ccccSAndrew Jones *(volatile u64 *)addr = b; 69*3df0ccccSAndrew Jones } 70*3df0ccccSAndrew Jones #endif 71*3df0ccccSAndrew Jones 72*3df0ccccSAndrew Jones #ifndef __bswap16 73*3df0ccccSAndrew Jones static inline u16 __bswap16(u16 x) 74*3df0ccccSAndrew Jones { 75*3df0ccccSAndrew Jones return ((x >> 8) & 0xff) | ((x & 0xff) << 8); 76*3df0ccccSAndrew Jones } 77*3df0ccccSAndrew Jones #endif 78*3df0ccccSAndrew Jones 79*3df0ccccSAndrew Jones #ifndef __bswap32 80*3df0ccccSAndrew Jones static inline u32 __bswap32(u32 x) 81*3df0ccccSAndrew Jones { 82*3df0ccccSAndrew Jones return ((x & 0xff000000) >> 24) | ((x & 0x00ff0000) >> 8) | 83*3df0ccccSAndrew Jones ((x & 0x0000ff00) << 8) | ((x & 0x000000ff) << 24); 84*3df0ccccSAndrew Jones } 85*3df0ccccSAndrew Jones #endif 86*3df0ccccSAndrew Jones 87*3df0ccccSAndrew Jones #ifndef __bswap64 88*3df0ccccSAndrew Jones static inline u64 __bswap64(u64 x) 89*3df0ccccSAndrew Jones { 90*3df0ccccSAndrew Jones return ((x & 0x00000000000000ffULL) << 56) | 91*3df0ccccSAndrew Jones ((x & 0x000000000000ff00ULL) << 40) | 92*3df0ccccSAndrew Jones ((x & 0x0000000000ff0000ULL) << 24) | 93*3df0ccccSAndrew Jones ((x & 0x00000000ff000000ULL) << 8) | 94*3df0ccccSAndrew Jones ((x & 0x000000ff00000000ULL) >> 8) | 95*3df0ccccSAndrew Jones ((x & 0x0000ff0000000000ULL) >> 24) | 96*3df0ccccSAndrew Jones ((x & 0x00ff000000000000ULL) >> 40) | 97*3df0ccccSAndrew Jones ((x & 0xff00000000000000ULL) >> 56); 98*3df0ccccSAndrew Jones } 99*3df0ccccSAndrew Jones #endif 100*3df0ccccSAndrew Jones 101*3df0ccccSAndrew Jones #ifndef __cpu_is_be 102*3df0ccccSAndrew Jones #define __cpu_is_be() (0) 103*3df0ccccSAndrew Jones #endif 104*3df0ccccSAndrew Jones 105*3df0ccccSAndrew Jones #define le16_to_cpu(x) \ 106*3df0ccccSAndrew Jones ({ u16 __r = __cpu_is_be() ? __bswap16(x) : (x); __r; }) 107*3df0ccccSAndrew Jones #define cpu_to_le16 le16_to_cpu 108*3df0ccccSAndrew Jones 109*3df0ccccSAndrew Jones #define le32_to_cpu(x) \ 110*3df0ccccSAndrew Jones ({ u32 __r = __cpu_is_be() ? __bswap32(x) : (x); __r; }) 111*3df0ccccSAndrew Jones #define cpu_to_le32 le32_to_cpu 112*3df0ccccSAndrew Jones 113*3df0ccccSAndrew Jones #define le64_to_cpu(x) \ 114*3df0ccccSAndrew Jones ({ u64 __r = __cpu_is_be() ? __bswap64(x) : (x); __r; }) 115*3df0ccccSAndrew Jones #define cpu_to_le64 le64_to_cpu 116*3df0ccccSAndrew Jones 117*3df0ccccSAndrew Jones #define be16_to_cpu(x) \ 118*3df0ccccSAndrew Jones ({ u16 __r = !__cpu_is_be() ? __bswap16(x) : (x); __r; }) 119*3df0ccccSAndrew Jones #define cpu_to_be16 be16_to_cpu 120*3df0ccccSAndrew Jones 121*3df0ccccSAndrew Jones #define be32_to_cpu(x) \ 122*3df0ccccSAndrew Jones ({ u32 __r = !__cpu_is_be() ? __bswap32(x) : (x); __r; }) 123*3df0ccccSAndrew Jones #define cpu_to_be32 be32_to_cpu 124*3df0ccccSAndrew Jones 125*3df0ccccSAndrew Jones #define be64_to_cpu(x) \ 126*3df0ccccSAndrew Jones ({ u64 __r = !__cpu_is_be() ? __bswap64(x) : (x); __r; }) 127*3df0ccccSAndrew Jones #define cpu_to_be64 be64_to_cpu 128*3df0ccccSAndrew Jones 129*3df0ccccSAndrew Jones #ifndef rmb 130*3df0ccccSAndrew Jones #define rmb() do { } while (0) 131*3df0ccccSAndrew Jones #endif 132*3df0ccccSAndrew Jones #ifndef wmb 133*3df0ccccSAndrew Jones #define wmb() do { } while (0) 134*3df0ccccSAndrew Jones #endif 135*3df0ccccSAndrew Jones 136*3df0ccccSAndrew Jones #define readb(addr) \ 137*3df0ccccSAndrew Jones ({ u8 __r = __raw_readb(addr); rmb(); __r; }) 138*3df0ccccSAndrew Jones #define readw(addr) \ 139*3df0ccccSAndrew Jones ({ u16 __r = le16_to_cpu(__raw_readw(addr)); rmb(); __r; }) 140*3df0ccccSAndrew Jones #define readl(addr) \ 141*3df0ccccSAndrew Jones ({ u32 __r = le32_to_cpu(__raw_readl(addr)); rmb(); __r; }) 142*3df0ccccSAndrew Jones #define readq(addr) \ 143*3df0ccccSAndrew Jones ({ u64 __r = le64_to_cpu(__raw_readq(addr)); rmb(); __r; }) 144*3df0ccccSAndrew Jones 145*3df0ccccSAndrew Jones #define writeb(b, addr) \ 146*3df0ccccSAndrew Jones ({ wmb(); __raw_writeb(b, addr); }) 147*3df0ccccSAndrew Jones #define writew(b, addr) \ 148*3df0ccccSAndrew Jones ({ wmb(); __raw_writew(cpu_to_le16(b), addr); }) 149*3df0ccccSAndrew Jones #define writel(b, addr) \ 150*3df0ccccSAndrew Jones ({ wmb(); __raw_writel(cpu_to_le32(b), addr); }) 151*3df0ccccSAndrew Jones #define writeq(b, addr) \ 152*3df0ccccSAndrew Jones ({ wmb(); __raw_writeq(cpu_to_le64(b), addr); }) 153*3df0ccccSAndrew Jones 154*3df0ccccSAndrew Jones #ifndef ioremap 155*3df0ccccSAndrew Jones static inline void *ioremap(u64 phys_addr, size_t size __unused) 156*3df0ccccSAndrew Jones { 157*3df0ccccSAndrew Jones assert(sizeof(long) == 8 || !(phys_addr >> 32)); 158*3df0ccccSAndrew Jones return (void *)(unsigned long)phys_addr; 159*3df0ccccSAndrew Jones } 160*3df0ccccSAndrew Jones #endif 161*3df0ccccSAndrew Jones 162*3df0ccccSAndrew Jones #endif /* _ASM_GENERIC_IO_H_ */ 163