18d59ecb2SHans Petter Selasky /*- 28d59ecb2SHans Petter Selasky * Copyright (c) 2010 Isilon Systems, Inc. 38d59ecb2SHans Petter Selasky * Copyright (c) 2010 iX Systems, Inc. 48d59ecb2SHans Petter Selasky * Copyright (c) 2010 Panasas, Inc. 586845417SHans Petter Selasky * Copyright (c) 2013-2015 Mellanox Technologies, Ltd. 68d59ecb2SHans Petter Selasky * All rights reserved. 78d59ecb2SHans Petter Selasky * 88d59ecb2SHans Petter Selasky * Redistribution and use in source and binary forms, with or without 98d59ecb2SHans Petter Selasky * modification, are permitted provided that the following conditions 108d59ecb2SHans Petter Selasky * are met: 118d59ecb2SHans Petter Selasky * 1. Redistributions of source code must retain the above copyright 128d59ecb2SHans Petter Selasky * notice unmodified, this list of conditions, and the following 138d59ecb2SHans Petter Selasky * disclaimer. 148d59ecb2SHans Petter Selasky * 2. Redistributions in binary form must reproduce the above copyright 158d59ecb2SHans Petter Selasky * notice, this list of conditions and the following disclaimer in the 168d59ecb2SHans Petter Selasky * documentation and/or other materials provided with the distribution. 178d59ecb2SHans Petter Selasky * 188d59ecb2SHans Petter Selasky * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 198d59ecb2SHans Petter Selasky * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 208d59ecb2SHans Petter Selasky * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 218d59ecb2SHans Petter Selasky * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 228d59ecb2SHans Petter Selasky * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 238d59ecb2SHans Petter Selasky * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 248d59ecb2SHans Petter Selasky * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 258d59ecb2SHans Petter Selasky * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 268d59ecb2SHans Petter Selasky * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 278d59ecb2SHans Petter Selasky * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 288d59ecb2SHans Petter Selasky * 298d59ecb2SHans Petter Selasky * $FreeBSD$ 308d59ecb2SHans Petter Selasky */ 318d59ecb2SHans Petter Selasky #ifndef _LINUX_IO_H_ 328d59ecb2SHans Petter Selasky #define _LINUX_IO_H_ 338d59ecb2SHans Petter Selasky 348d59ecb2SHans Petter Selasky #include <machine/vm.h> 358d59ecb2SHans Petter Selasky #include <sys/endian.h> 368e7baabcSHans Petter Selasky #include <sys/types.h> 378d59ecb2SHans Petter Selasky 38684a5fefSHans Petter Selasky #include <linux/compiler.h> 39cb564d24SMark Johnston #include <linux/types.h> 40684a5fefSHans Petter Selasky 418d59ecb2SHans Petter Selasky /* 428d59ecb2SHans Petter Selasky * XXX This is all x86 specific. It should be bus space access. 438d59ecb2SHans Petter Selasky */ 448d59ecb2SHans Petter Selasky 45*642909fdSTijl Coosemans /* Access MMIO registers atomically without barriers and byte swapping. */ 468d59ecb2SHans Petter Selasky 47684a5fefSHans Petter Selasky static inline uint8_t 48*642909fdSTijl Coosemans __raw_readb(const volatile void *addr) 49684a5fefSHans Petter Selasky { 50*642909fdSTijl Coosemans return (*(const volatile uint8_t *)addr); 51684a5fefSHans Petter Selasky } 52*642909fdSTijl Coosemans #define __raw_readb(addr) __raw_readb(addr) 53684a5fefSHans Petter Selasky 54684a5fefSHans Petter Selasky static inline void 55*642909fdSTijl Coosemans __raw_writeb(uint8_t v, volatile void *addr) 56684a5fefSHans Petter Selasky { 57684a5fefSHans Petter Selasky *(volatile uint8_t *)addr = v; 58684a5fefSHans Petter Selasky } 59*642909fdSTijl Coosemans #define __raw_writeb(v, addr) __raw_writeb(v, addr) 60684a5fefSHans Petter Selasky 61*642909fdSTijl Coosemans static inline uint16_t 62*642909fdSTijl Coosemans __raw_readw(const volatile void *addr) 63*642909fdSTijl Coosemans { 64*642909fdSTijl Coosemans return (*(const volatile uint16_t *)addr); 65*642909fdSTijl Coosemans } 66*642909fdSTijl Coosemans #define __raw_readw(addr) __raw_readw(addr) 67*642909fdSTijl Coosemans 68684a5fefSHans Petter Selasky static inline void 69*642909fdSTijl Coosemans __raw_writew(uint16_t v, volatile void *addr) 70684a5fefSHans Petter Selasky { 71684a5fefSHans Petter Selasky *(volatile uint16_t *)addr = v; 72684a5fefSHans Petter Selasky } 73*642909fdSTijl Coosemans #define __raw_writew(v, addr) __raw_writew(v, addr) 74684a5fefSHans Petter Selasky 75*642909fdSTijl Coosemans static inline uint32_t 76*642909fdSTijl Coosemans __raw_readl(const volatile void *addr) 77*642909fdSTijl Coosemans { 78*642909fdSTijl Coosemans return (*(const volatile uint32_t *)addr); 79*642909fdSTijl Coosemans } 80*642909fdSTijl Coosemans #define __raw_readl(addr) __raw_readl(addr) 81*642909fdSTijl Coosemans 82684a5fefSHans Petter Selasky static inline void 83*642909fdSTijl Coosemans __raw_writel(uint32_t v, volatile void *addr) 84684a5fefSHans Petter Selasky { 85684a5fefSHans Petter Selasky *(volatile uint32_t *)addr = v; 86684a5fefSHans Petter Selasky } 87*642909fdSTijl Coosemans #define __raw_writel(v, addr) __raw_writel(v, addr) 88684a5fefSHans Petter Selasky 89*642909fdSTijl Coosemans #ifdef __LP64__ 90*642909fdSTijl Coosemans static inline uint64_t 91*642909fdSTijl Coosemans __raw_readq(const volatile void *addr) 928d59ecb2SHans Petter Selasky { 93*642909fdSTijl Coosemans return (*(const volatile uint64_t *)addr); 948d59ecb2SHans Petter Selasky } 95*642909fdSTijl Coosemans #define __raw_readq(addr) __raw_readq(addr) 96*642909fdSTijl Coosemans 97*642909fdSTijl Coosemans static inline void 98*642909fdSTijl Coosemans __raw_writeq(uint64_t v, volatile void *addr) 99*642909fdSTijl Coosemans { 100*642909fdSTijl Coosemans *(volatile uint64_t *)addr = v; 101*642909fdSTijl Coosemans } 102*642909fdSTijl Coosemans #define __raw_writeq(v, addr) __raw_writeq(v, addr) 103*642909fdSTijl Coosemans #endif 104*642909fdSTijl Coosemans 105*642909fdSTijl Coosemans #define mmiowb() barrier() 106*642909fdSTijl Coosemans 107*642909fdSTijl Coosemans /* Access little-endian MMIO registers atomically with memory barriers. */ 1088d59ecb2SHans Petter Selasky 10986845417SHans Petter Selasky #undef readb 11086845417SHans Petter Selasky static inline uint8_t 11186845417SHans Petter Selasky readb(const volatile void *addr) 11286845417SHans Petter Selasky { 113*642909fdSTijl Coosemans uint8_t v; 114*642909fdSTijl Coosemans 115*642909fdSTijl Coosemans __compiler_membar(); 116*642909fdSTijl Coosemans v = *(const volatile uint8_t *)addr; 117*642909fdSTijl Coosemans __compiler_membar(); 118*642909fdSTijl Coosemans return (v); 11986845417SHans Petter Selasky } 120*642909fdSTijl Coosemans #define readb(addr) readb(addr) 121*642909fdSTijl Coosemans 122*642909fdSTijl Coosemans #undef writeb 123*642909fdSTijl Coosemans static inline void 124*642909fdSTijl Coosemans writeb(uint8_t v, volatile void *addr) 125*642909fdSTijl Coosemans { 126*642909fdSTijl Coosemans __compiler_membar(); 127*642909fdSTijl Coosemans *(volatile uint8_t *)addr = v; 128*642909fdSTijl Coosemans __compiler_membar(); 129*642909fdSTijl Coosemans } 130*642909fdSTijl Coosemans #define writeb(v, addr) writeb(v, addr) 13186845417SHans Petter Selasky 13286845417SHans Petter Selasky #undef readw 13386845417SHans Petter Selasky static inline uint16_t 13486845417SHans Petter Selasky readw(const volatile void *addr) 13586845417SHans Petter Selasky { 136*642909fdSTijl Coosemans uint16_t v; 137*642909fdSTijl Coosemans 138*642909fdSTijl Coosemans __compiler_membar(); 139*642909fdSTijl Coosemans v = *(const volatile uint16_t *)addr; 140*642909fdSTijl Coosemans __compiler_membar(); 141*642909fdSTijl Coosemans return (v); 14286845417SHans Petter Selasky } 143*642909fdSTijl Coosemans #define readw(addr) readw(addr) 144*642909fdSTijl Coosemans 145*642909fdSTijl Coosemans #undef writew 146*642909fdSTijl Coosemans static inline void 147*642909fdSTijl Coosemans writew(uint16_t v, volatile void *addr) 148*642909fdSTijl Coosemans { 149*642909fdSTijl Coosemans __compiler_membar(); 150*642909fdSTijl Coosemans *(volatile uint16_t *)addr = v; 151*642909fdSTijl Coosemans __compiler_membar(); 152*642909fdSTijl Coosemans } 153*642909fdSTijl Coosemans #define writew(v, addr) writew(v, addr) 15486845417SHans Petter Selasky 15586845417SHans Petter Selasky #undef readl 15686845417SHans Petter Selasky static inline uint32_t 15786845417SHans Petter Selasky readl(const volatile void *addr) 15886845417SHans Petter Selasky { 159*642909fdSTijl Coosemans uint32_t v; 160*642909fdSTijl Coosemans 161*642909fdSTijl Coosemans __compiler_membar(); 162*642909fdSTijl Coosemans v = *(const volatile uint32_t *)addr; 163*642909fdSTijl Coosemans __compiler_membar(); 164*642909fdSTijl Coosemans return (v); 16586845417SHans Petter Selasky } 166*642909fdSTijl Coosemans #define readl(addr) readl(addr) 167*642909fdSTijl Coosemans 168*642909fdSTijl Coosemans #undef writel 169*642909fdSTijl Coosemans static inline void 170*642909fdSTijl Coosemans writel(uint32_t v, volatile void *addr) 171*642909fdSTijl Coosemans { 172*642909fdSTijl Coosemans __compiler_membar(); 173*642909fdSTijl Coosemans *(volatile uint32_t *)addr = v; 174*642909fdSTijl Coosemans __compiler_membar(); 175*642909fdSTijl Coosemans } 176*642909fdSTijl Coosemans #define writel(v, addr) writel(v, addr) 177*642909fdSTijl Coosemans 178*642909fdSTijl Coosemans #undef readq 179*642909fdSTijl Coosemans #undef writeq 180*642909fdSTijl Coosemans #ifdef __LP64__ 181*642909fdSTijl Coosemans static inline uint64_t 182*642909fdSTijl Coosemans readq(const volatile void *addr) 183*642909fdSTijl Coosemans { 184*642909fdSTijl Coosemans uint64_t v; 185*642909fdSTijl Coosemans 186*642909fdSTijl Coosemans __compiler_membar(); 187*642909fdSTijl Coosemans v = *(const volatile uint64_t *)addr; 188*642909fdSTijl Coosemans __compiler_membar(); 189*642909fdSTijl Coosemans return (v); 190*642909fdSTijl Coosemans } 191*642909fdSTijl Coosemans #define readq(addr) readq(addr) 192*642909fdSTijl Coosemans 193*642909fdSTijl Coosemans static inline void 194*642909fdSTijl Coosemans writeq(uint64_t v, volatile void *addr) 195*642909fdSTijl Coosemans { 196*642909fdSTijl Coosemans __compiler_membar(); 197*642909fdSTijl Coosemans *(volatile uint64_t *)addr = v; 198*642909fdSTijl Coosemans __compiler_membar(); 199*642909fdSTijl Coosemans } 200*642909fdSTijl Coosemans #define writeq(v, addr) writeq(v, addr) 201*642909fdSTijl Coosemans #endif 202*642909fdSTijl Coosemans 203*642909fdSTijl Coosemans /* Access little-endian MMIO registers atomically without memory barriers. */ 204*642909fdSTijl Coosemans 205*642909fdSTijl Coosemans #undef readb_relaxed 206*642909fdSTijl Coosemans static inline uint8_t 207*642909fdSTijl Coosemans readb_relaxed(const volatile void *addr) 208*642909fdSTijl Coosemans { 209*642909fdSTijl Coosemans return (*(const volatile uint8_t *)addr); 210*642909fdSTijl Coosemans } 211*642909fdSTijl Coosemans #define readb_relaxed(addr) readb_relaxed(addr) 212*642909fdSTijl Coosemans 213*642909fdSTijl Coosemans #undef writeb_relaxed 214*642909fdSTijl Coosemans static inline void 215*642909fdSTijl Coosemans writeb_relaxed(uint8_t v, volatile void *addr) 216*642909fdSTijl Coosemans { 217*642909fdSTijl Coosemans *(volatile uint8_t *)addr = v; 218*642909fdSTijl Coosemans } 219*642909fdSTijl Coosemans #define writeb_relaxed(v, addr) writeb_relaxed(v, addr) 220*642909fdSTijl Coosemans 221*642909fdSTijl Coosemans #undef readw_relaxed 222*642909fdSTijl Coosemans static inline uint16_t 223*642909fdSTijl Coosemans readw_relaxed(const volatile void *addr) 224*642909fdSTijl Coosemans { 225*642909fdSTijl Coosemans return (*(const volatile uint16_t *)addr); 226*642909fdSTijl Coosemans } 227*642909fdSTijl Coosemans #define readw_relaxed(addr) readw_relaxed(addr) 228*642909fdSTijl Coosemans 229*642909fdSTijl Coosemans #undef writew_relaxed 230*642909fdSTijl Coosemans static inline void 231*642909fdSTijl Coosemans writew_relaxed(uint16_t v, volatile void *addr) 232*642909fdSTijl Coosemans { 233*642909fdSTijl Coosemans *(volatile uint16_t *)addr = v; 234*642909fdSTijl Coosemans } 235*642909fdSTijl Coosemans #define writew_relaxed(v, addr) writew_relaxed(v, addr) 236*642909fdSTijl Coosemans 237*642909fdSTijl Coosemans #undef readl_relaxed 238*642909fdSTijl Coosemans static inline uint32_t 239*642909fdSTijl Coosemans readl_relaxed(const volatile void *addr) 240*642909fdSTijl Coosemans { 241*642909fdSTijl Coosemans return (*(const volatile uint32_t *)addr); 242*642909fdSTijl Coosemans } 243*642909fdSTijl Coosemans #define readl_relaxed(addr) readl_relaxed(addr) 244*642909fdSTijl Coosemans 245*642909fdSTijl Coosemans #undef writel_relaxed 246*642909fdSTijl Coosemans static inline void 247*642909fdSTijl Coosemans writel_relaxed(uint32_t v, volatile void *addr) 248*642909fdSTijl Coosemans { 249*642909fdSTijl Coosemans *(volatile uint32_t *)addr = v; 250*642909fdSTijl Coosemans } 251*642909fdSTijl Coosemans #define writel_relaxed(v, addr) writel_relaxed(v, addr) 252*642909fdSTijl Coosemans 253*642909fdSTijl Coosemans #undef readq_relaxed 254*642909fdSTijl Coosemans #undef writeq_relaxed 255*642909fdSTijl Coosemans #ifdef __LP64__ 256*642909fdSTijl Coosemans static inline uint64_t 257*642909fdSTijl Coosemans readq_relaxed(const volatile void *addr) 258*642909fdSTijl Coosemans { 259*642909fdSTijl Coosemans return (*(const volatile uint64_t *)addr); 260*642909fdSTijl Coosemans } 261*642909fdSTijl Coosemans #define readq_relaxed(addr) readq_relaxed(addr) 262*642909fdSTijl Coosemans 263*642909fdSTijl Coosemans static inline void 264*642909fdSTijl Coosemans writeq_relaxed(uint64_t v, volatile void *addr) 265*642909fdSTijl Coosemans { 266*642909fdSTijl Coosemans *(volatile uint64_t *)addr = v; 267*642909fdSTijl Coosemans } 268*642909fdSTijl Coosemans #define writeq_relaxed(v, addr) writeq_relaxed(v, addr) 269*642909fdSTijl Coosemans #endif 270*642909fdSTijl Coosemans 271*642909fdSTijl Coosemans /* XXX On Linux ioread and iowrite handle both MMIO and port IO. */ 272*642909fdSTijl Coosemans 273*642909fdSTijl Coosemans #undef ioread8 274*642909fdSTijl Coosemans static inline uint8_t 275*642909fdSTijl Coosemans ioread8(const volatile void *addr) 276*642909fdSTijl Coosemans { 277*642909fdSTijl Coosemans return (readb(addr)); 278*642909fdSTijl Coosemans } 279*642909fdSTijl Coosemans #define ioread8(addr) ioread8(addr) 280*642909fdSTijl Coosemans 281*642909fdSTijl Coosemans #undef ioread16 282*642909fdSTijl Coosemans static inline uint16_t 283*642909fdSTijl Coosemans ioread16(const volatile void *addr) 284*642909fdSTijl Coosemans { 285*642909fdSTijl Coosemans return (readw(addr)); 286*642909fdSTijl Coosemans } 287*642909fdSTijl Coosemans #define ioread16(addr) ioread16(addr) 288*642909fdSTijl Coosemans 289*642909fdSTijl Coosemans #undef ioread16be 290*642909fdSTijl Coosemans static inline uint16_t 291*642909fdSTijl Coosemans ioread16be(const volatile void *addr) 292*642909fdSTijl Coosemans { 293*642909fdSTijl Coosemans return (bswap16(readw(addr))); 294*642909fdSTijl Coosemans } 295*642909fdSTijl Coosemans #define ioread16be(addr) ioread16be(addr) 296*642909fdSTijl Coosemans 297*642909fdSTijl Coosemans #undef ioread32 298*642909fdSTijl Coosemans static inline uint32_t 299*642909fdSTijl Coosemans ioread32(const volatile void *addr) 300*642909fdSTijl Coosemans { 301*642909fdSTijl Coosemans return (readl(addr)); 302*642909fdSTijl Coosemans } 303*642909fdSTijl Coosemans #define ioread32(addr) ioread32(addr) 304*642909fdSTijl Coosemans 305*642909fdSTijl Coosemans #undef ioread32be 306*642909fdSTijl Coosemans static inline uint32_t 307*642909fdSTijl Coosemans ioread32be(const volatile void *addr) 308*642909fdSTijl Coosemans { 309*642909fdSTijl Coosemans return (bswap32(readl(addr))); 310*642909fdSTijl Coosemans } 311*642909fdSTijl Coosemans #define ioread32be(addr) ioread32be(addr) 312*642909fdSTijl Coosemans 313*642909fdSTijl Coosemans #undef iowrite8 314*642909fdSTijl Coosemans static inline void 315*642909fdSTijl Coosemans iowrite8(uint8_t v, volatile void *addr) 316*642909fdSTijl Coosemans { 317*642909fdSTijl Coosemans writeb(v, addr); 318*642909fdSTijl Coosemans } 319*642909fdSTijl Coosemans #define iowrite8(v, addr) iowrite8(v, addr) 320*642909fdSTijl Coosemans 321*642909fdSTijl Coosemans #undef iowrite16 322*642909fdSTijl Coosemans static inline void 323*642909fdSTijl Coosemans iowrite16(uint16_t v, volatile void *addr) 324*642909fdSTijl Coosemans { 325*642909fdSTijl Coosemans writew(v, addr); 326*642909fdSTijl Coosemans } 327*642909fdSTijl Coosemans #define iowrite16 iowrite16 328*642909fdSTijl Coosemans 329*642909fdSTijl Coosemans #undef iowrite32 330*642909fdSTijl Coosemans static inline void 331*642909fdSTijl Coosemans iowrite32(uint32_t v, volatile void *addr) 332*642909fdSTijl Coosemans { 333*642909fdSTijl Coosemans writel(v, addr); 334*642909fdSTijl Coosemans } 335*642909fdSTijl Coosemans #define iowrite32(v, addr) iowrite32(v, addr) 336*642909fdSTijl Coosemans 337*642909fdSTijl Coosemans #undef iowrite32be 338*642909fdSTijl Coosemans static inline void 339*642909fdSTijl Coosemans iowrite32be(uint32_t v, volatile void *addr) 340*642909fdSTijl Coosemans { 341*642909fdSTijl Coosemans writel(bswap32(v), addr); 342*642909fdSTijl Coosemans } 343*642909fdSTijl Coosemans #define iowrite32be(v, addr) iowrite32be(v, addr) 34486845417SHans Petter Selasky 34586845417SHans Petter Selasky #if defined(__i386__) || defined(__amd64__) 34694a201beSHans Petter Selasky static inline void 34794a201beSHans Petter Selasky _outb(u_char data, u_int port) 34894a201beSHans Petter Selasky { 34994a201beSHans Petter Selasky __asm __volatile("outb %0, %w1" : : "a" (data), "Nd" (port)); 35094a201beSHans Petter Selasky } 35194a201beSHans Petter Selasky #endif 35294a201beSHans Petter Selasky 353864092bcSJustin Hibbits #if defined(__i386__) || defined(__amd64__) || defined(__powerpc__) 3548d59ecb2SHans Petter Selasky void *_ioremap_attr(vm_paddr_t phys_addr, unsigned long size, int attr); 35586845417SHans Petter Selasky #else 35686845417SHans Petter Selasky #define _ioremap_attr(...) NULL 35786845417SHans Petter Selasky #endif 35886845417SHans Petter Selasky 3598d59ecb2SHans Petter Selasky #define ioremap_nocache(addr, size) \ 3608d59ecb2SHans Petter Selasky _ioremap_attr((addr), (size), VM_MEMATTR_UNCACHEABLE) 3618d59ecb2SHans Petter Selasky #define ioremap_wc(addr, size) \ 3628d59ecb2SHans Petter Selasky _ioremap_attr((addr), (size), VM_MEMATTR_WRITE_COMBINING) 363684a5fefSHans Petter Selasky #define ioremap_wb(addr, size) \ 364684a5fefSHans Petter Selasky _ioremap_attr((addr), (size), VM_MEMATTR_WRITE_BACK) 365f2dbb750SHans Petter Selasky #define ioremap_wt(addr, size) \ 366f2dbb750SHans Petter Selasky _ioremap_attr((addr), (size), VM_MEMATTR_WRITE_THROUGH) 36786845417SHans Petter Selasky #define ioremap(addr, size) \ 36886845417SHans Petter Selasky _ioremap_attr((addr), (size), VM_MEMATTR_UNCACHEABLE) 3698d59ecb2SHans Petter Selasky void iounmap(void *addr); 3708d59ecb2SHans Petter Selasky 3718d59ecb2SHans Petter Selasky #define memset_io(a, b, c) memset((a), (b), (c)) 3728d59ecb2SHans Petter Selasky #define memcpy_fromio(a, b, c) memcpy((a), (b), (c)) 3738d59ecb2SHans Petter Selasky #define memcpy_toio(a, b, c) memcpy((a), (b), (c)) 3748d59ecb2SHans Petter Selasky 3758d59ecb2SHans Petter Selasky static inline void 37686364964SKevin Lo __iowrite32_copy(void *to, void *from, size_t count) 37786364964SKevin Lo { 37886364964SKevin Lo uint32_t *src; 37986364964SKevin Lo uint32_t *dst; 38086364964SKevin Lo int i; 38186364964SKevin Lo 38286364964SKevin Lo for (i = 0, src = from, dst = to; i < count; i++, src++, dst++) 38386364964SKevin Lo __raw_writel(*src, dst); 38486364964SKevin Lo } 38586364964SKevin Lo 38686364964SKevin Lo static inline void 3878d59ecb2SHans Petter Selasky __iowrite64_copy(void *to, void *from, size_t count) 3888d59ecb2SHans Petter Selasky { 3898d59ecb2SHans Petter Selasky #ifdef __LP64__ 3908d59ecb2SHans Petter Selasky uint64_t *src; 3918d59ecb2SHans Petter Selasky uint64_t *dst; 3928d59ecb2SHans Petter Selasky int i; 3938d59ecb2SHans Petter Selasky 3948d59ecb2SHans Petter Selasky for (i = 0, src = from, dst = to; i < count; i++, src++, dst++) 3958d59ecb2SHans Petter Selasky __raw_writeq(*src, dst); 3968d59ecb2SHans Petter Selasky #else 39786364964SKevin Lo __iowrite32_copy(to, from, count * 2); 3988d59ecb2SHans Petter Selasky #endif 3998d59ecb2SHans Petter Selasky } 4008d59ecb2SHans Petter Selasky 401684a5fefSHans Petter Selasky enum { 402684a5fefSHans Petter Selasky MEMREMAP_WB = 1 << 0, 403684a5fefSHans Petter Selasky MEMREMAP_WT = 1 << 1, 404684a5fefSHans Petter Selasky MEMREMAP_WC = 1 << 2, 405684a5fefSHans Petter Selasky }; 406684a5fefSHans Petter Selasky 407684a5fefSHans Petter Selasky static inline void * 408684a5fefSHans Petter Selasky memremap(resource_size_t offset, size_t size, unsigned long flags) 409684a5fefSHans Petter Selasky { 410684a5fefSHans Petter Selasky void *addr = NULL; 411684a5fefSHans Petter Selasky 412684a5fefSHans Petter Selasky if ((flags & MEMREMAP_WB) && 413684a5fefSHans Petter Selasky (addr = ioremap_wb(offset, size)) != NULL) 414684a5fefSHans Petter Selasky goto done; 415684a5fefSHans Petter Selasky if ((flags & MEMREMAP_WT) && 416f2dbb750SHans Petter Selasky (addr = ioremap_wt(offset, size)) != NULL) 417684a5fefSHans Petter Selasky goto done; 418684a5fefSHans Petter Selasky if ((flags & MEMREMAP_WC) && 419684a5fefSHans Petter Selasky (addr = ioremap_wc(offset, size)) != NULL) 420684a5fefSHans Petter Selasky goto done; 421684a5fefSHans Petter Selasky done: 422684a5fefSHans Petter Selasky return (addr); 423684a5fefSHans Petter Selasky } 424684a5fefSHans Petter Selasky 425684a5fefSHans Petter Selasky static inline void 426684a5fefSHans Petter Selasky memunmap(void *addr) 427684a5fefSHans Petter Selasky { 428684a5fefSHans Petter Selasky /* XXX May need to check if this is RAM */ 429684a5fefSHans Petter Selasky iounmap(addr); 430684a5fefSHans Petter Selasky } 4318d59ecb2SHans Petter Selasky 4328d59ecb2SHans Petter Selasky #endif /* _LINUX_IO_H_ */ 433