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 */ 31*307f78f3SVladimir Kondratyev #ifndef _LINUXKPI_LINUX_IO_H_ 32*307f78f3SVladimir Kondratyev #define _LINUXKPI_LINUX_IO_H_ 338d59ecb2SHans Petter Selasky 348d59ecb2SHans Petter Selasky #include <sys/endian.h> 358e7baabcSHans Petter Selasky #include <sys/types.h> 368d59ecb2SHans Petter Selasky 37588fbadfSHans Petter Selasky #include <machine/vm.h> 38588fbadfSHans Petter Selasky 39684a5fefSHans Petter Selasky #include <linux/compiler.h> 40cb564d24SMark Johnston #include <linux/types.h> 41684a5fefSHans Petter Selasky 428d59ecb2SHans Petter Selasky /* 438d59ecb2SHans Petter Selasky * XXX This is all x86 specific. It should be bus space access. 448d59ecb2SHans Petter Selasky */ 458d59ecb2SHans Petter Selasky 46937a05baSJustin Hibbits /* rmb and wmb are declared in machine/atomic.h, so should be included first. */ 47937a05baSJustin Hibbits #ifndef __io_br 48937a05baSJustin Hibbits #define __io_br() __compiler_membar() 49937a05baSJustin Hibbits #endif 50937a05baSJustin Hibbits 51937a05baSJustin Hibbits #ifndef __io_ar 52937a05baSJustin Hibbits #ifdef rmb 53937a05baSJustin Hibbits #define __io_ar() rmb() 54937a05baSJustin Hibbits #else 55937a05baSJustin Hibbits #define __io_ar() __compiler_membar() 56937a05baSJustin Hibbits #endif 57937a05baSJustin Hibbits #endif 58937a05baSJustin Hibbits 59937a05baSJustin Hibbits #ifndef __io_bw 60937a05baSJustin Hibbits #ifdef wmb 61937a05baSJustin Hibbits #define __io_bw() wmb() 62937a05baSJustin Hibbits #else 63937a05baSJustin Hibbits #define __io_bw() __compiler_membar() 64937a05baSJustin Hibbits #endif 65937a05baSJustin Hibbits #endif 66937a05baSJustin Hibbits 67937a05baSJustin Hibbits #ifndef __io_aw 68937a05baSJustin Hibbits #define __io_aw() __compiler_membar() 69937a05baSJustin Hibbits #endif 70937a05baSJustin 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 141937a05baSJustin Hibbits __io_br(); 142642909fdSTijl Coosemans v = *(const volatile uint8_t *)addr; 143937a05baSJustin 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 { 152937a05baSJustin Hibbits __io_bw(); 153642909fdSTijl Coosemans *(volatile uint8_t *)addr = v; 154937a05baSJustin 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 164937a05baSJustin Hibbits __io_br(); 165937a05baSJustin Hibbits v = le16toh(__raw_readw(addr)); 166937a05baSJustin 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 { 175937a05baSJustin Hibbits __io_bw(); 176937a05baSJustin Hibbits __raw_writew(htole16(v), addr); 177937a05baSJustin 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 187937a05baSJustin Hibbits __io_br(); 188937a05baSJustin Hibbits v = le32toh(__raw_readl(addr)); 189937a05baSJustin 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 { 198937a05baSJustin Hibbits __io_bw(); 199937a05baSJustin Hibbits __raw_writel(htole32(v), addr); 200937a05baSJustin 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 212937a05baSJustin Hibbits __io_br(); 213937a05baSJustin Hibbits v = le64toh(__raw_readq(addr)); 214937a05baSJustin 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 { 222937a05baSJustin Hibbits __io_bw(); 223937a05baSJustin Hibbits __raw_writeq(htole64(v), addr); 224937a05baSJustin 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 { 235937a05baSJustin 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 { 243937a05baSJustin 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 { 251937a05baSJustin 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 { 259937a05baSJustin 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 { 267937a05baSJustin 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 { 275937a05baSJustin 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 { 285937a05baSJustin 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 { 292937a05baSJustin 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 { 319937a05baSJustin Hibbits uint16_t v; 320937a05baSJustin Hibbits 321937a05baSJustin Hibbits __io_br(); 322937a05baSJustin Hibbits v = (be16toh(__raw_readw(addr))); 323937a05baSJustin Hibbits __io_ar(); 324937a05baSJustin Hibbits 325937a05baSJustin 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 { 341937a05baSJustin Hibbits uint32_t v; 342937a05baSJustin Hibbits 343937a05baSJustin Hibbits __io_br(); 344937a05baSJustin Hibbits v = (be32toh(__raw_readl(addr))); 345937a05baSJustin Hibbits __io_ar(); 346937a05baSJustin Hibbits 347937a05baSJustin 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 { 379937a05baSJustin Hibbits __io_bw(); 380937a05baSJustin Hibbits __raw_writel(htobe32(v), addr); 381937a05baSJustin 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 39360d962e0SJessica Clarke #if defined(__i386__) || defined(__amd64__) || defined(__powerpc__) || defined(__aarch64__) || defined(__riscv) 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 3994d83500fSHans Petter Selasky #ifdef VM_MEMATTR_DEVICE 4004d83500fSHans Petter Selasky #define ioremap_nocache(addr, size) \ 4014d83500fSHans Petter Selasky _ioremap_attr((addr), (size), VM_MEMATTR_DEVICE) 4024d83500fSHans Petter Selasky #define ioremap_wt(addr, size) \ 4034d83500fSHans Petter Selasky _ioremap_attr((addr), (size), VM_MEMATTR_DEVICE) 4044d83500fSHans Petter Selasky #define ioremap(addr, size) \ 4054d83500fSHans Petter Selasky _ioremap_attr((addr), (size), VM_MEMATTR_DEVICE) 4064d83500fSHans Petter Selasky #else 4078d59ecb2SHans Petter Selasky #define ioremap_nocache(addr, size) \ 4088d59ecb2SHans Petter Selasky _ioremap_attr((addr), (size), VM_MEMATTR_UNCACHEABLE) 409f2dbb750SHans Petter Selasky #define ioremap_wt(addr, size) \ 410f2dbb750SHans Petter Selasky _ioremap_attr((addr), (size), VM_MEMATTR_WRITE_THROUGH) 41186845417SHans Petter Selasky #define ioremap(addr, size) \ 41286845417SHans Petter Selasky _ioremap_attr((addr), (size), VM_MEMATTR_UNCACHEABLE) 4134d83500fSHans Petter Selasky #endif 4148167c92fSJessica Clarke #ifdef VM_MEMATTR_WRITE_COMBINING 4154d83500fSHans Petter Selasky #define ioremap_wc(addr, size) \ 4164d83500fSHans Petter Selasky _ioremap_attr((addr), (size), VM_MEMATTR_WRITE_COMBINING) 4178167c92fSJessica Clarke #else 4188167c92fSJessica Clarke #define ioremap_wc(addr, size) ioremap_nocache(addr, size) 4198167c92fSJessica Clarke #endif 4204d83500fSHans Petter Selasky #define ioremap_wb(addr, size) \ 4214d83500fSHans Petter Selasky _ioremap_attr((addr), (size), VM_MEMATTR_WRITE_BACK) 4228d59ecb2SHans Petter Selasky void iounmap(void *addr); 4238d59ecb2SHans Petter Selasky 4248d59ecb2SHans Petter Selasky #define memset_io(a, b, c) memset((a), (b), (c)) 4258d59ecb2SHans Petter Selasky #define memcpy_fromio(a, b, c) memcpy((a), (b), (c)) 4268d59ecb2SHans Petter Selasky #define memcpy_toio(a, b, c) memcpy((a), (b), (c)) 4278d59ecb2SHans Petter Selasky 4288d59ecb2SHans Petter Selasky static inline void 42986364964SKevin Lo __iowrite32_copy(void *to, void *from, size_t count) 43086364964SKevin Lo { 43186364964SKevin Lo uint32_t *src; 43286364964SKevin Lo uint32_t *dst; 43386364964SKevin Lo int i; 43486364964SKevin Lo 43586364964SKevin Lo for (i = 0, src = from, dst = to; i < count; i++, src++, dst++) 43686364964SKevin Lo __raw_writel(*src, dst); 43786364964SKevin Lo } 43886364964SKevin Lo 43986364964SKevin Lo static inline void 4408d59ecb2SHans Petter Selasky __iowrite64_copy(void *to, void *from, size_t count) 4418d59ecb2SHans Petter Selasky { 4428d59ecb2SHans Petter Selasky #ifdef __LP64__ 4438d59ecb2SHans Petter Selasky uint64_t *src; 4448d59ecb2SHans Petter Selasky uint64_t *dst; 4458d59ecb2SHans Petter Selasky int i; 4468d59ecb2SHans Petter Selasky 4478d59ecb2SHans Petter Selasky for (i = 0, src = from, dst = to; i < count; i++, src++, dst++) 4488d59ecb2SHans Petter Selasky __raw_writeq(*src, dst); 4498d59ecb2SHans Petter Selasky #else 45086364964SKevin Lo __iowrite32_copy(to, from, count * 2); 4518d59ecb2SHans Petter Selasky #endif 4528d59ecb2SHans Petter Selasky } 4538d59ecb2SHans Petter Selasky 454684a5fefSHans Petter Selasky enum { 455684a5fefSHans Petter Selasky MEMREMAP_WB = 1 << 0, 456684a5fefSHans Petter Selasky MEMREMAP_WT = 1 << 1, 457684a5fefSHans Petter Selasky MEMREMAP_WC = 1 << 2, 458684a5fefSHans Petter Selasky }; 459684a5fefSHans Petter Selasky 460684a5fefSHans Petter Selasky static inline void * 461684a5fefSHans Petter Selasky memremap(resource_size_t offset, size_t size, unsigned long flags) 462684a5fefSHans Petter Selasky { 463684a5fefSHans Petter Selasky void *addr = NULL; 464684a5fefSHans Petter Selasky 465684a5fefSHans Petter Selasky if ((flags & MEMREMAP_WB) && 466684a5fefSHans Petter Selasky (addr = ioremap_wb(offset, size)) != NULL) 467684a5fefSHans Petter Selasky goto done; 468684a5fefSHans Petter Selasky if ((flags & MEMREMAP_WT) && 469f2dbb750SHans Petter Selasky (addr = ioremap_wt(offset, size)) != NULL) 470684a5fefSHans Petter Selasky goto done; 471684a5fefSHans Petter Selasky if ((flags & MEMREMAP_WC) && 472684a5fefSHans Petter Selasky (addr = ioremap_wc(offset, size)) != NULL) 473684a5fefSHans Petter Selasky goto done; 474684a5fefSHans Petter Selasky done: 475684a5fefSHans Petter Selasky return (addr); 476684a5fefSHans Petter Selasky } 477684a5fefSHans Petter Selasky 478684a5fefSHans Petter Selasky static inline void 479684a5fefSHans Petter Selasky memunmap(void *addr) 480684a5fefSHans Petter Selasky { 481684a5fefSHans Petter Selasky /* XXX May need to check if this is RAM */ 482684a5fefSHans Petter Selasky iounmap(addr); 483684a5fefSHans Petter Selasky } 4848d59ecb2SHans Petter Selasky 48598b12978SVladimir Kondratyev #define __MTRR_ID_BASE 1 48698b12978SVladimir Kondratyev int lkpi_arch_phys_wc_add(unsigned long, unsigned long); 48798b12978SVladimir Kondratyev void lkpi_arch_phys_wc_del(int); 48898b12978SVladimir Kondratyev #define arch_phys_wc_add(...) lkpi_arch_phys_wc_add(__VA_ARGS__) 48998b12978SVladimir Kondratyev #define arch_phys_wc_del(...) lkpi_arch_phys_wc_del(__VA_ARGS__) 49098b12978SVladimir Kondratyev #define arch_phys_wc_index(x) \ 49198b12978SVladimir Kondratyev (((x) < __MTRR_ID_BASE) ? -1 : ((x) - __MTRR_ID_BASE)) 49298b12978SVladimir Kondratyev 493*307f78f3SVladimir Kondratyev #endif /* _LINUXKPI_LINUX_IO_H_ */ 494