diff options
Diffstat (limited to 'lib/iomap.c')
| -rw-r--r-- | lib/iomap.c | 140 | 
1 files changed, 136 insertions, 4 deletions
diff --git a/lib/iomap.c b/lib/iomap.c index 541d926da95e..e909ab71e995 100644 --- a/lib/iomap.c +++ b/lib/iomap.c @@ -65,8 +65,9 @@ static void bad_io_access(unsigned long port, const char *access)  #endif  #ifndef mmio_read16be -#define mmio_read16be(addr) be16_to_cpu(__raw_readw(addr)) -#define mmio_read32be(addr) be32_to_cpu(__raw_readl(addr)) +#define mmio_read16be(addr) swab16(readw(addr)) +#define mmio_read32be(addr) swab32(readl(addr)) +#define mmio_read64be(addr) swab64(readq(addr))  #endif  unsigned int ioread8(void __iomem *addr) @@ -100,14 +101,89 @@ EXPORT_SYMBOL(ioread16be);  EXPORT_SYMBOL(ioread32);  EXPORT_SYMBOL(ioread32be); +#ifdef readq +static u64 pio_read64_lo_hi(unsigned long port) +{ +	u64 lo, hi; + +	lo = inl(port); +	hi = inl(port + sizeof(u32)); + +	return lo | (hi << 32); +} + +static u64 pio_read64_hi_lo(unsigned long port) +{ +	u64 lo, hi; + +	hi = inl(port + sizeof(u32)); +	lo = inl(port); + +	return lo | (hi << 32); +} + +static u64 pio_read64be_lo_hi(unsigned long port) +{ +	u64 lo, hi; + +	lo = pio_read32be(port + sizeof(u32)); +	hi = pio_read32be(port); + +	return lo | (hi << 32); +} + +static u64 pio_read64be_hi_lo(unsigned long port) +{ +	u64 lo, hi; + +	hi = pio_read32be(port); +	lo = pio_read32be(port + sizeof(u32)); + +	return lo | (hi << 32); +} + +u64 ioread64_lo_hi(void __iomem *addr) +{ +	IO_COND(addr, return pio_read64_lo_hi(port), return readq(addr)); +	return 0xffffffffffffffffULL; +} + +u64 ioread64_hi_lo(void __iomem *addr) +{ +	IO_COND(addr, return pio_read64_hi_lo(port), return readq(addr)); +	return 0xffffffffffffffffULL; +} + +u64 ioread64be_lo_hi(void __iomem *addr) +{ +	IO_COND(addr, return pio_read64be_lo_hi(port), +		return mmio_read64be(addr)); +	return 0xffffffffffffffffULL; +} + +u64 ioread64be_hi_lo(void __iomem *addr) +{ +	IO_COND(addr, return pio_read64be_hi_lo(port), +		return mmio_read64be(addr)); +	return 0xffffffffffffffffULL; +} + +EXPORT_SYMBOL(ioread64_lo_hi); +EXPORT_SYMBOL(ioread64_hi_lo); +EXPORT_SYMBOL(ioread64be_lo_hi); +EXPORT_SYMBOL(ioread64be_hi_lo); + +#endif /* readq */ +  #ifndef pio_write16be  #define pio_write16be(val,port) outw(swab16(val),port)  #define pio_write32be(val,port) outl(swab32(val),port)  #endif  #ifndef mmio_write16be -#define mmio_write16be(val,port) __raw_writew(be16_to_cpu(val),port) -#define mmio_write32be(val,port) __raw_writel(be32_to_cpu(val),port) +#define mmio_write16be(val,port) writew(swab16(val),port) +#define mmio_write32be(val,port) writel(swab32(val),port) +#define mmio_write64be(val,port) writeq(swab64(val),port)  #endif  void iowrite8(u8 val, void __iomem *addr) @@ -136,6 +212,62 @@ EXPORT_SYMBOL(iowrite16be);  EXPORT_SYMBOL(iowrite32);  EXPORT_SYMBOL(iowrite32be); +#ifdef writeq +static void pio_write64_lo_hi(u64 val, unsigned long port) +{ +	outl(val, port); +	outl(val >> 32, port + sizeof(u32)); +} + +static void pio_write64_hi_lo(u64 val, unsigned long port) +{ +	outl(val >> 32, port + sizeof(u32)); +	outl(val, port); +} + +static void pio_write64be_lo_hi(u64 val, unsigned long port) +{ +	pio_write32be(val, port + sizeof(u32)); +	pio_write32be(val >> 32, port); +} + +static void pio_write64be_hi_lo(u64 val, unsigned long port) +{ +	pio_write32be(val >> 32, port); +	pio_write32be(val, port + sizeof(u32)); +} + +void iowrite64_lo_hi(u64 val, void __iomem *addr) +{ +	IO_COND(addr, pio_write64_lo_hi(val, port), +		writeq(val, addr)); +} + +void iowrite64_hi_lo(u64 val, void __iomem *addr) +{ +	IO_COND(addr, pio_write64_hi_lo(val, port), +		writeq(val, addr)); +} + +void iowrite64be_lo_hi(u64 val, void __iomem *addr) +{ +	IO_COND(addr, pio_write64be_lo_hi(val, port), +		mmio_write64be(val, addr)); +} + +void iowrite64be_hi_lo(u64 val, void __iomem *addr) +{ +	IO_COND(addr, pio_write64be_hi_lo(val, port), +		mmio_write64be(val, addr)); +} + +EXPORT_SYMBOL(iowrite64_lo_hi); +EXPORT_SYMBOL(iowrite64_hi_lo); +EXPORT_SYMBOL(iowrite64be_lo_hi); +EXPORT_SYMBOL(iowrite64be_hi_lo); + +#endif /* readq */ +  /*   * These are the "repeat MMIO read/write" functions.   * Note the "__raw" accesses, since we don't want to  |