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*937a05baSJustin Hibbits 46*937a05baSJustin Hibbits /* rmb and wmb are declared in machine/atomic.h, so should be included first. */ 47*937a05baSJustin Hibbits #ifndef __io_br 48*937a05baSJustin Hibbits #define __io_br() __compiler_membar() 49*937a05baSJustin Hibbits #endif 50*937a05baSJustin Hibbits 51*937a05baSJustin Hibbits #ifndef __io_ar 52*937a05baSJustin Hibbits #ifdef rmb 53*937a05baSJustin Hibbits #define __io_ar() rmb() 54*937a05baSJustin Hibbits #else 55*937a05baSJustin Hibbits #define __io_ar() __compiler_membar() 56*937a05baSJustin Hibbits #endif 57*937a05baSJustin Hibbits #endif 58*937a05baSJustin Hibbits 59*937a05baSJustin Hibbits #ifndef __io_bw 60*937a05baSJustin Hibbits #ifdef wmb 61*937a05baSJustin Hibbits #define __io_bw() wmb() 62*937a05baSJustin Hibbits #else 63*937a05baSJustin Hibbits #define __io_bw() __compiler_membar() 64*937a05baSJustin Hibbits #endif 65*937a05baSJustin Hibbits #endif 66*937a05baSJustin Hibbits 67*937a05baSJustin Hibbits #ifndef __io_aw 68*937a05baSJustin Hibbits #define __io_aw() __compiler_membar() 69*937a05baSJustin Hibbits #endif 70*937a05baSJustin Hibbits 71642909fdSTijl Coosemans /* Access MMIO registers atomically without barriers and byte swapping. */ 728d59ecb2SHans Petter Selasky 73684a5fefSHans Petter Selasky static inline uint8_t 74642909fdSTijl Coosemans __raw_readb(const volatile void *addr) 75684a5fefSHans Petter Selasky { 76642909fdSTijl Coosemans return (*(const volatile uint8_t *)addr); 77684a5fefSHans Petter Selasky } 78642909fdSTijl Coosemans #define __raw_readb(addr) __raw_readb(addr) 79684a5fefSHans Petter Selasky 80684a5fefSHans Petter Selasky static inline void 81642909fdSTijl Coosemans __raw_writeb(uint8_t v, volatile void *addr) 82684a5fefSHans Petter Selasky { 83684a5fefSHans Petter Selasky *(volatile uint8_t *)addr = v; 84684a5fefSHans Petter Selasky } 85642909fdSTijl Coosemans #define __raw_writeb(v, addr) __raw_writeb(v, addr) 86684a5fefSHans Petter Selasky 87642909fdSTijl Coosemans static inline uint16_t 88642909fdSTijl Coosemans __raw_readw(const volatile void *addr) 89642909fdSTijl Coosemans { 90642909fdSTijl Coosemans return (*(const volatile uint16_t *)addr); 91642909fdSTijl Coosemans } 92642909fdSTijl Coosemans #define __raw_readw(addr) __raw_readw(addr) 93642909fdSTijl Coosemans 94684a5fefSHans Petter Selasky static inline void 95642909fdSTijl Coosemans __raw_writew(uint16_t v, volatile void *addr) 96684a5fefSHans Petter Selasky { 97684a5fefSHans Petter Selasky *(volatile uint16_t *)addr = v; 98684a5fefSHans Petter Selasky } 99642909fdSTijl Coosemans #define __raw_writew(v, addr) __raw_writew(v, addr) 100684a5fefSHans Petter Selasky 101642909fdSTijl Coosemans static inline uint32_t 102642909fdSTijl Coosemans __raw_readl(const volatile void *addr) 103642909fdSTijl Coosemans { 104642909fdSTijl Coosemans return (*(const volatile uint32_t *)addr); 105642909fdSTijl Coosemans } 106642909fdSTijl Coosemans #define __raw_readl(addr) __raw_readl(addr) 107642909fdSTijl Coosemans 108684a5fefSHans Petter Selasky static inline void 109642909fdSTijl Coosemans __raw_writel(uint32_t v, volatile void *addr) 110684a5fefSHans Petter Selasky { 111684a5fefSHans Petter Selasky *(volatile uint32_t *)addr = v; 112684a5fefSHans Petter Selasky } 113642909fdSTijl Coosemans #define __raw_writel(v, addr) __raw_writel(v, addr) 114684a5fefSHans Petter Selasky 115642909fdSTijl Coosemans #ifdef __LP64__ 116642909fdSTijl Coosemans static inline uint64_t 117642909fdSTijl Coosemans __raw_readq(const volatile void *addr) 1188d59ecb2SHans Petter Selasky { 119642909fdSTijl Coosemans return (*(const volatile uint64_t *)addr); 1208d59ecb2SHans Petter Selasky } 121642909fdSTijl Coosemans #define __raw_readq(addr) __raw_readq(addr) 122642909fdSTijl Coosemans 123642909fdSTijl Coosemans static inline void 124642909fdSTijl Coosemans __raw_writeq(uint64_t v, volatile void *addr) 125642909fdSTijl Coosemans { 126642909fdSTijl Coosemans *(volatile uint64_t *)addr = v; 127642909fdSTijl Coosemans } 128642909fdSTijl Coosemans #define __raw_writeq(v, addr) __raw_writeq(v, addr) 129642909fdSTijl Coosemans #endif 130642909fdSTijl Coosemans 131642909fdSTijl Coosemans #define mmiowb() barrier() 132642909fdSTijl Coosemans 133642909fdSTijl Coosemans /* Access little-endian MMIO registers atomically with memory barriers. */ 1348d59ecb2SHans Petter Selasky 13586845417SHans Petter Selasky #undef readb 13686845417SHans Petter Selasky static inline uint8_t 13786845417SHans Petter Selasky readb(const volatile void *addr) 13886845417SHans Petter Selasky { 139642909fdSTijl Coosemans uint8_t v; 140642909fdSTijl Coosemans 141*937a05baSJustin Hibbits __io_br(); 142642909fdSTijl Coosemans v = *(const volatile uint8_t *)addr; 143*937a05baSJustin Hibbits __io_ar(); 144642909fdSTijl Coosemans return (v); 14586845417SHans Petter Selasky } 146642909fdSTijl Coosemans #define readb(addr) readb(addr) 147642909fdSTijl Coosemans 148642909fdSTijl Coosemans #undef writeb 149642909fdSTijl Coosemans static inline void 150642909fdSTijl Coosemans writeb(uint8_t v, volatile void *addr) 151642909fdSTijl Coosemans { 152*937a05baSJustin Hibbits __io_bw(); 153642909fdSTijl Coosemans *(volatile uint8_t *)addr = v; 154*937a05baSJustin Hibbits __io_aw(); 155642909fdSTijl Coosemans } 156642909fdSTijl Coosemans #define writeb(v, addr) writeb(v, addr) 15786845417SHans Petter Selasky 15886845417SHans Petter Selasky #undef readw 15986845417SHans Petter Selasky static inline uint16_t 16086845417SHans Petter Selasky readw(const volatile void *addr) 16186845417SHans Petter Selasky { 162642909fdSTijl Coosemans uint16_t v; 163642909fdSTijl Coosemans 164*937a05baSJustin Hibbits __io_br(); 165*937a05baSJustin Hibbits v = le16toh(__raw_readw(addr)); 166*937a05baSJustin Hibbits __io_ar(); 167642909fdSTijl Coosemans return (v); 16886845417SHans Petter Selasky } 169642909fdSTijl Coosemans #define readw(addr) readw(addr) 170642909fdSTijl Coosemans 171642909fdSTijl Coosemans #undef writew 172642909fdSTijl Coosemans static inline void 173642909fdSTijl Coosemans writew(uint16_t v, volatile void *addr) 174642909fdSTijl Coosemans { 175*937a05baSJustin Hibbits __io_bw(); 176*937a05baSJustin Hibbits __raw_writew(htole16(v), addr); 177*937a05baSJustin Hibbits __io_aw(); 178642909fdSTijl Coosemans } 179642909fdSTijl Coosemans #define writew(v, addr) writew(v, addr) 18086845417SHans Petter Selasky 18186845417SHans Petter Selasky #undef readl 18286845417SHans Petter Selasky static inline uint32_t 18386845417SHans Petter Selasky readl(const volatile void *addr) 18486845417SHans Petter Selasky { 185642909fdSTijl Coosemans uint32_t v; 186642909fdSTijl Coosemans 187*937a05baSJustin Hibbits __io_br(); 188*937a05baSJustin Hibbits v = le32toh(__raw_readl(addr)); 189*937a05baSJustin Hibbits __io_ar(); 190642909fdSTijl Coosemans return (v); 19186845417SHans Petter Selasky } 192642909fdSTijl Coosemans #define readl(addr) readl(addr) 193642909fdSTijl Coosemans 194642909fdSTijl Coosemans #undef writel 195642909fdSTijl Coosemans static inline void 196642909fdSTijl Coosemans writel(uint32_t v, volatile void *addr) 197642909fdSTijl Coosemans { 198*937a05baSJustin Hibbits __io_bw(); 199*937a05baSJustin Hibbits __raw_writel(htole32(v), addr); 200*937a05baSJustin Hibbits __io_aw(); 201642909fdSTijl Coosemans } 202642909fdSTijl Coosemans #define writel(v, addr) writel(v, addr) 203642909fdSTijl Coosemans 204642909fdSTijl Coosemans #undef readq 205642909fdSTijl Coosemans #undef writeq 206642909fdSTijl Coosemans #ifdef __LP64__ 207642909fdSTijl Coosemans static inline uint64_t 208642909fdSTijl Coosemans readq(const volatile void *addr) 209642909fdSTijl Coosemans { 210642909fdSTijl Coosemans uint64_t v; 211642909fdSTijl Coosemans 212*937a05baSJustin Hibbits __io_br(); 213*937a05baSJustin Hibbits v = le64toh(__raw_readq(addr)); 214*937a05baSJustin Hibbits __io_ar(); 215642909fdSTijl Coosemans return (v); 216642909fdSTijl Coosemans } 217642909fdSTijl Coosemans #define readq(addr) readq(addr) 218642909fdSTijl Coosemans 219642909fdSTijl Coosemans static inline void 220642909fdSTijl Coosemans writeq(uint64_t v, volatile void *addr) 221642909fdSTijl Coosemans { 222*937a05baSJustin Hibbits __io_bw(); 223*937a05baSJustin Hibbits __raw_writeq(htole64(v), addr); 224*937a05baSJustin Hibbits __io_aw(); 225642909fdSTijl Coosemans } 226642909fdSTijl Coosemans #define writeq(v, addr) writeq(v, addr) 227642909fdSTijl Coosemans #endif 228642909fdSTijl Coosemans 229642909fdSTijl Coosemans /* Access little-endian MMIO registers atomically without memory barriers. */ 230642909fdSTijl Coosemans 231642909fdSTijl Coosemans #undef readb_relaxed 232642909fdSTijl Coosemans static inline uint8_t 233642909fdSTijl Coosemans readb_relaxed(const volatile void *addr) 234642909fdSTijl Coosemans { 235*937a05baSJustin Hibbits return (__raw_readb(addr)); 236642909fdSTijl Coosemans } 237642909fdSTijl Coosemans #define readb_relaxed(addr) readb_relaxed(addr) 238642909fdSTijl Coosemans 239642909fdSTijl Coosemans #undef writeb_relaxed 240642909fdSTijl Coosemans static inline void 241642909fdSTijl Coosemans writeb_relaxed(uint8_t v, volatile void *addr) 242642909fdSTijl Coosemans { 243*937a05baSJustin Hibbits __raw_writeb(v, addr); 244642909fdSTijl Coosemans } 245642909fdSTijl Coosemans #define writeb_relaxed(v, addr) writeb_relaxed(v, addr) 246642909fdSTijl Coosemans 247642909fdSTijl Coosemans #undef readw_relaxed 248642909fdSTijl Coosemans static inline uint16_t 249642909fdSTijl Coosemans readw_relaxed(const volatile void *addr) 250642909fdSTijl Coosemans { 251*937a05baSJustin Hibbits return (le16toh(__raw_readw(addr))); 252642909fdSTijl Coosemans } 253642909fdSTijl Coosemans #define readw_relaxed(addr) readw_relaxed(addr) 254642909fdSTijl Coosemans 255642909fdSTijl Coosemans #undef writew_relaxed 256642909fdSTijl Coosemans static inline void 257642909fdSTijl Coosemans writew_relaxed(uint16_t v, volatile void *addr) 258642909fdSTijl Coosemans { 259*937a05baSJustin Hibbits __raw_writew(htole16(v), addr); 260642909fdSTijl Coosemans } 261642909fdSTijl Coosemans #define writew_relaxed(v, addr) writew_relaxed(v, addr) 262642909fdSTijl Coosemans 263642909fdSTijl Coosemans #undef readl_relaxed 264642909fdSTijl Coosemans static inline uint32_t 265642909fdSTijl Coosemans readl_relaxed(const volatile void *addr) 266642909fdSTijl Coosemans { 267*937a05baSJustin Hibbits return (le32toh(__raw_readl(addr))); 268642909fdSTijl Coosemans } 269642909fdSTijl Coosemans #define readl_relaxed(addr) readl_relaxed(addr) 270642909fdSTijl Coosemans 271642909fdSTijl Coosemans #undef writel_relaxed 272642909fdSTijl Coosemans static inline void 273642909fdSTijl Coosemans writel_relaxed(uint32_t v, volatile void *addr) 274642909fdSTijl Coosemans { 275*937a05baSJustin Hibbits __raw_writel(htole32(v), addr); 276642909fdSTijl Coosemans } 277642909fdSTijl Coosemans #define writel_relaxed(v, addr) writel_relaxed(v, addr) 278642909fdSTijl Coosemans 279642909fdSTijl Coosemans #undef readq_relaxed 280642909fdSTijl Coosemans #undef writeq_relaxed 281642909fdSTijl Coosemans #ifdef __LP64__ 282642909fdSTijl Coosemans static inline uint64_t 283642909fdSTijl Coosemans readq_relaxed(const volatile void *addr) 284642909fdSTijl Coosemans { 285*937a05baSJustin Hibbits return (le64toh(__raw_readq(addr))); 286642909fdSTijl Coosemans } 287642909fdSTijl Coosemans #define readq_relaxed(addr) readq_relaxed(addr) 288642909fdSTijl Coosemans 289642909fdSTijl Coosemans static inline void 290642909fdSTijl Coosemans writeq_relaxed(uint64_t v, volatile void *addr) 291642909fdSTijl Coosemans { 292*937a05baSJustin Hibbits __raw_writeq(htole64(v), addr); 293642909fdSTijl Coosemans } 294642909fdSTijl Coosemans #define writeq_relaxed(v, addr) writeq_relaxed(v, addr) 295642909fdSTijl Coosemans #endif 296642909fdSTijl Coosemans 297642909fdSTijl Coosemans /* XXX On Linux ioread and iowrite handle both MMIO and port IO. */ 298642909fdSTijl Coosemans 299642909fdSTijl Coosemans #undef ioread8 300642909fdSTijl Coosemans static inline uint8_t 301642909fdSTijl Coosemans ioread8(const volatile void *addr) 302642909fdSTijl Coosemans { 303642909fdSTijl Coosemans return (readb(addr)); 304642909fdSTijl Coosemans } 305642909fdSTijl Coosemans #define ioread8(addr) ioread8(addr) 306642909fdSTijl Coosemans 307642909fdSTijl Coosemans #undef ioread16 308642909fdSTijl Coosemans static inline uint16_t 309642909fdSTijl Coosemans ioread16(const volatile void *addr) 310642909fdSTijl Coosemans { 311642909fdSTijl Coosemans return (readw(addr)); 312642909fdSTijl Coosemans } 313642909fdSTijl Coosemans #define ioread16(addr) ioread16(addr) 314642909fdSTijl Coosemans 315642909fdSTijl Coosemans #undef ioread16be 316642909fdSTijl Coosemans static inline uint16_t 317642909fdSTijl Coosemans ioread16be(const volatile void *addr) 318642909fdSTijl Coosemans { 319*937a05baSJustin Hibbits uint16_t v; 320*937a05baSJustin Hibbits 321*937a05baSJustin Hibbits __io_br(); 322*937a05baSJustin Hibbits v = (be16toh(__raw_readw(addr))); 323*937a05baSJustin Hibbits __io_ar(); 324*937a05baSJustin Hibbits 325*937a05baSJustin Hibbits return (v); 326642909fdSTijl Coosemans } 327642909fdSTijl Coosemans #define ioread16be(addr) ioread16be(addr) 328642909fdSTijl Coosemans 329642909fdSTijl Coosemans #undef ioread32 330642909fdSTijl Coosemans static inline uint32_t 331642909fdSTijl Coosemans ioread32(const volatile void *addr) 332642909fdSTijl Coosemans { 333642909fdSTijl Coosemans return (readl(addr)); 334642909fdSTijl Coosemans } 335642909fdSTijl Coosemans #define ioread32(addr) ioread32(addr) 336642909fdSTijl Coosemans 337642909fdSTijl Coosemans #undef ioread32be 338642909fdSTijl Coosemans static inline uint32_t 339642909fdSTijl Coosemans ioread32be(const volatile void *addr) 340642909fdSTijl Coosemans { 341*937a05baSJustin Hibbits uint32_t v; 342*937a05baSJustin Hibbits 343*937a05baSJustin Hibbits __io_br(); 344*937a05baSJustin Hibbits v = (be32toh(__raw_readl(addr))); 345*937a05baSJustin Hibbits __io_ar(); 346*937a05baSJustin Hibbits 347*937a05baSJustin Hibbits return (v); 348642909fdSTijl Coosemans } 349642909fdSTijl Coosemans #define ioread32be(addr) ioread32be(addr) 350642909fdSTijl Coosemans 351642909fdSTijl Coosemans #undef iowrite8 352642909fdSTijl Coosemans static inline void 353642909fdSTijl Coosemans iowrite8(uint8_t v, volatile void *addr) 354642909fdSTijl Coosemans { 355642909fdSTijl Coosemans writeb(v, addr); 356642909fdSTijl Coosemans } 357642909fdSTijl Coosemans #define iowrite8(v, addr) iowrite8(v, addr) 358642909fdSTijl Coosemans 359642909fdSTijl Coosemans #undef iowrite16 360642909fdSTijl Coosemans static inline void 361642909fdSTijl Coosemans iowrite16(uint16_t v, volatile void *addr) 362642909fdSTijl Coosemans { 363642909fdSTijl Coosemans writew(v, addr); 364642909fdSTijl Coosemans } 365642909fdSTijl Coosemans #define iowrite16 iowrite16 366642909fdSTijl Coosemans 367642909fdSTijl Coosemans #undef iowrite32 368642909fdSTijl Coosemans static inline void 369642909fdSTijl Coosemans iowrite32(uint32_t v, volatile void *addr) 370642909fdSTijl Coosemans { 371642909fdSTijl Coosemans writel(v, addr); 372642909fdSTijl Coosemans } 373642909fdSTijl Coosemans #define iowrite32(v, addr) iowrite32(v, addr) 374642909fdSTijl Coosemans 375642909fdSTijl Coosemans #undef iowrite32be 376642909fdSTijl Coosemans static inline void 377642909fdSTijl Coosemans iowrite32be(uint32_t v, volatile void *addr) 378642909fdSTijl Coosemans { 379*937a05baSJustin Hibbits __io_bw(); 380*937a05baSJustin Hibbits __raw_writel(htobe32(v), addr); 381*937a05baSJustin Hibbits __io_aw(); 382642909fdSTijl Coosemans } 383642909fdSTijl Coosemans #define iowrite32be(v, addr) iowrite32be(v, addr) 38486845417SHans Petter Selasky 38586845417SHans Petter Selasky #if defined(__i386__) || defined(__amd64__) 38694a201beSHans Petter Selasky static inline void 38794a201beSHans Petter Selasky _outb(u_char data, u_int port) 38894a201beSHans Petter Selasky { 38994a201beSHans Petter Selasky __asm __volatile("outb %0, %w1" : : "a" (data), "Nd" (port)); 39094a201beSHans Petter Selasky } 39194a201beSHans Petter Selasky #endif 39294a201beSHans Petter Selasky 393ff9be73eSEd Maste #if defined(__i386__) || defined(__amd64__) || defined(__powerpc__) || defined(__aarch64__) 3948d59ecb2SHans Petter Selasky void *_ioremap_attr(vm_paddr_t phys_addr, unsigned long size, int attr); 39586845417SHans Petter Selasky #else 39686845417SHans Petter Selasky #define _ioremap_attr(...) NULL 39786845417SHans Petter Selasky #endif 39886845417SHans Petter Selasky 3998d59ecb2SHans Petter Selasky #define ioremap_nocache(addr, size) \ 4008d59ecb2SHans Petter Selasky _ioremap_attr((addr), (size), VM_MEMATTR_UNCACHEABLE) 4018d59ecb2SHans Petter Selasky #define ioremap_wc(addr, size) \ 4028d59ecb2SHans Petter Selasky _ioremap_attr((addr), (size), VM_MEMATTR_WRITE_COMBINING) 403684a5fefSHans Petter Selasky #define ioremap_wb(addr, size) \ 404684a5fefSHans Petter Selasky _ioremap_attr((addr), (size), VM_MEMATTR_WRITE_BACK) 405f2dbb750SHans Petter Selasky #define ioremap_wt(addr, size) \ 406f2dbb750SHans Petter Selasky _ioremap_attr((addr), (size), VM_MEMATTR_WRITE_THROUGH) 40786845417SHans Petter Selasky #define ioremap(addr, size) \ 40886845417SHans Petter Selasky _ioremap_attr((addr), (size), VM_MEMATTR_UNCACHEABLE) 4098d59ecb2SHans Petter Selasky void iounmap(void *addr); 4108d59ecb2SHans Petter Selasky 4118d59ecb2SHans Petter Selasky #define memset_io(a, b, c) memset((a), (b), (c)) 4128d59ecb2SHans Petter Selasky #define memcpy_fromio(a, b, c) memcpy((a), (b), (c)) 4138d59ecb2SHans Petter Selasky #define memcpy_toio(a, b, c) memcpy((a), (b), (c)) 4148d59ecb2SHans Petter Selasky 4158d59ecb2SHans Petter Selasky static inline void 41686364964SKevin Lo __iowrite32_copy(void *to, void *from, size_t count) 41786364964SKevin Lo { 41886364964SKevin Lo uint32_t *src; 41986364964SKevin Lo uint32_t *dst; 42086364964SKevin Lo int i; 42186364964SKevin Lo 42286364964SKevin Lo for (i = 0, src = from, dst = to; i < count; i++, src++, dst++) 42386364964SKevin Lo __raw_writel(*src, dst); 42486364964SKevin Lo } 42586364964SKevin Lo 42686364964SKevin Lo static inline void 4278d59ecb2SHans Petter Selasky __iowrite64_copy(void *to, void *from, size_t count) 4288d59ecb2SHans Petter Selasky { 4298d59ecb2SHans Petter Selasky #ifdef __LP64__ 4308d59ecb2SHans Petter Selasky uint64_t *src; 4318d59ecb2SHans Petter Selasky uint64_t *dst; 4328d59ecb2SHans Petter Selasky int i; 4338d59ecb2SHans Petter Selasky 4348d59ecb2SHans Petter Selasky for (i = 0, src = from, dst = to; i < count; i++, src++, dst++) 4358d59ecb2SHans Petter Selasky __raw_writeq(*src, dst); 4368d59ecb2SHans Petter Selasky #else 43786364964SKevin Lo __iowrite32_copy(to, from, count * 2); 4388d59ecb2SHans Petter Selasky #endif 4398d59ecb2SHans Petter Selasky } 4408d59ecb2SHans Petter Selasky 441684a5fefSHans Petter Selasky enum { 442684a5fefSHans Petter Selasky MEMREMAP_WB = 1 << 0, 443684a5fefSHans Petter Selasky MEMREMAP_WT = 1 << 1, 444684a5fefSHans Petter Selasky MEMREMAP_WC = 1 << 2, 445684a5fefSHans Petter Selasky }; 446684a5fefSHans Petter Selasky 447684a5fefSHans Petter Selasky static inline void * 448684a5fefSHans Petter Selasky memremap(resource_size_t offset, size_t size, unsigned long flags) 449684a5fefSHans Petter Selasky { 450684a5fefSHans Petter Selasky void *addr = NULL; 451684a5fefSHans Petter Selasky 452684a5fefSHans Petter Selasky if ((flags & MEMREMAP_WB) && 453684a5fefSHans Petter Selasky (addr = ioremap_wb(offset, size)) != NULL) 454684a5fefSHans Petter Selasky goto done; 455684a5fefSHans Petter Selasky if ((flags & MEMREMAP_WT) && 456f2dbb750SHans Petter Selasky (addr = ioremap_wt(offset, size)) != NULL) 457684a5fefSHans Petter Selasky goto done; 458684a5fefSHans Petter Selasky if ((flags & MEMREMAP_WC) && 459684a5fefSHans Petter Selasky (addr = ioremap_wc(offset, size)) != NULL) 460684a5fefSHans Petter Selasky goto done; 461684a5fefSHans Petter Selasky done: 462684a5fefSHans Petter Selasky return (addr); 463684a5fefSHans Petter Selasky } 464684a5fefSHans Petter Selasky 465684a5fefSHans Petter Selasky static inline void 466684a5fefSHans Petter Selasky memunmap(void *addr) 467684a5fefSHans Petter Selasky { 468684a5fefSHans Petter Selasky /* XXX May need to check if this is RAM */ 469684a5fefSHans Petter Selasky iounmap(addr); 470684a5fefSHans Petter Selasky } 4718d59ecb2SHans Petter Selasky 4728d59ecb2SHans Petter Selasky #endif /* _LINUX_IO_H_ */ 473