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 */ 29307f78f3SVladimir Kondratyev #ifndef _LINUXKPI_LINUX_IO_H_ 30307f78f3SVladimir Kondratyev #define _LINUXKPI_LINUX_IO_H_ 318d59ecb2SHans Petter Selasky 328d59ecb2SHans Petter Selasky #include <sys/endian.h> 338e7baabcSHans Petter Selasky #include <sys/types.h> 348d59ecb2SHans Petter Selasky 35588fbadfSHans Petter Selasky #include <machine/vm.h> 36588fbadfSHans Petter Selasky 37684a5fefSHans Petter Selasky #include <linux/compiler.h> 38cb564d24SMark Johnston #include <linux/types.h> 39521abc32SEmmanuel Vadot #if !defined(__arm__) 40789dbdbbSEmmanuel Vadot #include <asm/set_memory.h> 41d387a1b4SEmmanuel Vadot #endif 42684a5fefSHans Petter Selasky 438d59ecb2SHans Petter Selasky /* 448d59ecb2SHans Petter Selasky * XXX This is all x86 specific. It should be bus space access. 458d59ecb2SHans Petter Selasky */ 468d59ecb2SHans Petter Selasky 47937a05baSJustin Hibbits /* rmb and wmb are declared in machine/atomic.h, so should be included first. */ 48937a05baSJustin Hibbits #ifndef __io_br 49937a05baSJustin Hibbits #define __io_br() __compiler_membar() 50937a05baSJustin Hibbits #endif 51937a05baSJustin Hibbits 52937a05baSJustin Hibbits #ifndef __io_ar 53937a05baSJustin Hibbits #ifdef rmb 54937a05baSJustin Hibbits #define __io_ar() rmb() 55937a05baSJustin Hibbits #else 56937a05baSJustin Hibbits #define __io_ar() __compiler_membar() 57937a05baSJustin Hibbits #endif 58937a05baSJustin Hibbits #endif 59937a05baSJustin Hibbits 60937a05baSJustin Hibbits #ifndef __io_bw 61937a05baSJustin Hibbits #ifdef wmb 62937a05baSJustin Hibbits #define __io_bw() wmb() 63937a05baSJustin Hibbits #else 64937a05baSJustin Hibbits #define __io_bw() __compiler_membar() 65937a05baSJustin Hibbits #endif 66937a05baSJustin Hibbits #endif 67937a05baSJustin Hibbits 68937a05baSJustin Hibbits #ifndef __io_aw 69937a05baSJustin Hibbits #define __io_aw() __compiler_membar() 70937a05baSJustin Hibbits #endif 71937a05baSJustin Hibbits 72642909fdSTijl Coosemans /* Access MMIO registers atomically without barriers and byte swapping. */ 738d59ecb2SHans Petter Selasky 74684a5fefSHans Petter Selasky static inline uint8_t 75642909fdSTijl Coosemans __raw_readb(const volatile void *addr) 76684a5fefSHans Petter Selasky { 77642909fdSTijl Coosemans return (*(const volatile uint8_t *)addr); 78684a5fefSHans Petter Selasky } 79642909fdSTijl Coosemans #define __raw_readb(addr) __raw_readb(addr) 80684a5fefSHans Petter Selasky 81684a5fefSHans Petter Selasky static inline void 82642909fdSTijl Coosemans __raw_writeb(uint8_t v, volatile void *addr) 83684a5fefSHans Petter Selasky { 84684a5fefSHans Petter Selasky *(volatile uint8_t *)addr = v; 85684a5fefSHans Petter Selasky } 86642909fdSTijl Coosemans #define __raw_writeb(v, addr) __raw_writeb(v, addr) 87684a5fefSHans Petter Selasky 88642909fdSTijl Coosemans static inline uint16_t 89642909fdSTijl Coosemans __raw_readw(const volatile void *addr) 90642909fdSTijl Coosemans { 91642909fdSTijl Coosemans return (*(const volatile uint16_t *)addr); 92642909fdSTijl Coosemans } 93642909fdSTijl Coosemans #define __raw_readw(addr) __raw_readw(addr) 94642909fdSTijl Coosemans 95684a5fefSHans Petter Selasky static inline void 96642909fdSTijl Coosemans __raw_writew(uint16_t v, volatile void *addr) 97684a5fefSHans Petter Selasky { 98684a5fefSHans Petter Selasky *(volatile uint16_t *)addr = v; 99684a5fefSHans Petter Selasky } 100642909fdSTijl Coosemans #define __raw_writew(v, addr) __raw_writew(v, addr) 101684a5fefSHans Petter Selasky 102642909fdSTijl Coosemans static inline uint32_t 103642909fdSTijl Coosemans __raw_readl(const volatile void *addr) 104642909fdSTijl Coosemans { 105642909fdSTijl Coosemans return (*(const volatile uint32_t *)addr); 106642909fdSTijl Coosemans } 107642909fdSTijl Coosemans #define __raw_readl(addr) __raw_readl(addr) 108642909fdSTijl Coosemans 109684a5fefSHans Petter Selasky static inline void 110642909fdSTijl Coosemans __raw_writel(uint32_t v, volatile void *addr) 111684a5fefSHans Petter Selasky { 112684a5fefSHans Petter Selasky *(volatile uint32_t *)addr = v; 113684a5fefSHans Petter Selasky } 114642909fdSTijl Coosemans #define __raw_writel(v, addr) __raw_writel(v, addr) 115684a5fefSHans Petter Selasky 116642909fdSTijl Coosemans #ifdef __LP64__ 117642909fdSTijl Coosemans static inline uint64_t 118642909fdSTijl Coosemans __raw_readq(const volatile void *addr) 1198d59ecb2SHans Petter Selasky { 120642909fdSTijl Coosemans return (*(const volatile uint64_t *)addr); 1218d59ecb2SHans Petter Selasky } 122642909fdSTijl Coosemans #define __raw_readq(addr) __raw_readq(addr) 123642909fdSTijl Coosemans 124642909fdSTijl Coosemans static inline void 125642909fdSTijl Coosemans __raw_writeq(uint64_t v, volatile void *addr) 126642909fdSTijl Coosemans { 127642909fdSTijl Coosemans *(volatile uint64_t *)addr = v; 128642909fdSTijl Coosemans } 129642909fdSTijl Coosemans #define __raw_writeq(v, addr) __raw_writeq(v, addr) 130642909fdSTijl Coosemans #endif 131642909fdSTijl Coosemans 132642909fdSTijl Coosemans #define mmiowb() barrier() 133642909fdSTijl Coosemans 134642909fdSTijl Coosemans /* Access little-endian MMIO registers atomically with memory barriers. */ 1358d59ecb2SHans Petter Selasky 13686845417SHans Petter Selasky #undef readb 13786845417SHans Petter Selasky static inline uint8_t 13886845417SHans Petter Selasky readb(const volatile void *addr) 13986845417SHans Petter Selasky { 140642909fdSTijl Coosemans uint8_t v; 141642909fdSTijl Coosemans 142937a05baSJustin Hibbits __io_br(); 143642909fdSTijl Coosemans v = *(const volatile uint8_t *)addr; 144937a05baSJustin Hibbits __io_ar(); 145642909fdSTijl Coosemans return (v); 14686845417SHans Petter Selasky } 147642909fdSTijl Coosemans #define readb(addr) readb(addr) 148642909fdSTijl Coosemans 149642909fdSTijl Coosemans #undef writeb 150642909fdSTijl Coosemans static inline void 151642909fdSTijl Coosemans writeb(uint8_t v, volatile void *addr) 152642909fdSTijl Coosemans { 153937a05baSJustin Hibbits __io_bw(); 154642909fdSTijl Coosemans *(volatile uint8_t *)addr = v; 155937a05baSJustin Hibbits __io_aw(); 156642909fdSTijl Coosemans } 157642909fdSTijl Coosemans #define writeb(v, addr) writeb(v, addr) 15886845417SHans Petter Selasky 15986845417SHans Petter Selasky #undef readw 16086845417SHans Petter Selasky static inline uint16_t 16186845417SHans Petter Selasky readw(const volatile void *addr) 16286845417SHans Petter Selasky { 163642909fdSTijl Coosemans uint16_t v; 164642909fdSTijl Coosemans 165937a05baSJustin Hibbits __io_br(); 166937a05baSJustin Hibbits v = le16toh(__raw_readw(addr)); 167937a05baSJustin Hibbits __io_ar(); 168642909fdSTijl Coosemans return (v); 16986845417SHans Petter Selasky } 170642909fdSTijl Coosemans #define readw(addr) readw(addr) 171642909fdSTijl Coosemans 172642909fdSTijl Coosemans #undef writew 173642909fdSTijl Coosemans static inline void 174642909fdSTijl Coosemans writew(uint16_t v, volatile void *addr) 175642909fdSTijl Coosemans { 176937a05baSJustin Hibbits __io_bw(); 177937a05baSJustin Hibbits __raw_writew(htole16(v), addr); 178937a05baSJustin Hibbits __io_aw(); 179642909fdSTijl Coosemans } 180642909fdSTijl Coosemans #define writew(v, addr) writew(v, addr) 18186845417SHans Petter Selasky 18286845417SHans Petter Selasky #undef readl 18386845417SHans Petter Selasky static inline uint32_t 18486845417SHans Petter Selasky readl(const volatile void *addr) 18586845417SHans Petter Selasky { 186642909fdSTijl Coosemans uint32_t v; 187642909fdSTijl Coosemans 188937a05baSJustin Hibbits __io_br(); 189937a05baSJustin Hibbits v = le32toh(__raw_readl(addr)); 190937a05baSJustin Hibbits __io_ar(); 191642909fdSTijl Coosemans return (v); 19286845417SHans Petter Selasky } 193642909fdSTijl Coosemans #define readl(addr) readl(addr) 194642909fdSTijl Coosemans 195642909fdSTijl Coosemans #undef writel 196642909fdSTijl Coosemans static inline void 197642909fdSTijl Coosemans writel(uint32_t v, volatile void *addr) 198642909fdSTijl Coosemans { 199937a05baSJustin Hibbits __io_bw(); 200937a05baSJustin Hibbits __raw_writel(htole32(v), addr); 201937a05baSJustin Hibbits __io_aw(); 202642909fdSTijl Coosemans } 203642909fdSTijl Coosemans #define writel(v, addr) writel(v, addr) 204642909fdSTijl Coosemans 205642909fdSTijl Coosemans #undef readq 206642909fdSTijl Coosemans #undef writeq 207642909fdSTijl Coosemans #ifdef __LP64__ 208642909fdSTijl Coosemans static inline uint64_t 209642909fdSTijl Coosemans readq(const volatile void *addr) 210642909fdSTijl Coosemans { 211642909fdSTijl Coosemans uint64_t v; 212642909fdSTijl Coosemans 213937a05baSJustin Hibbits __io_br(); 214937a05baSJustin Hibbits v = le64toh(__raw_readq(addr)); 215937a05baSJustin Hibbits __io_ar(); 216642909fdSTijl Coosemans return (v); 217642909fdSTijl Coosemans } 218642909fdSTijl Coosemans #define readq(addr) readq(addr) 219642909fdSTijl Coosemans 220642909fdSTijl Coosemans static inline void 221642909fdSTijl Coosemans writeq(uint64_t v, volatile void *addr) 222642909fdSTijl Coosemans { 223937a05baSJustin Hibbits __io_bw(); 224937a05baSJustin Hibbits __raw_writeq(htole64(v), addr); 225937a05baSJustin Hibbits __io_aw(); 226642909fdSTijl Coosemans } 227642909fdSTijl Coosemans #define writeq(v, addr) writeq(v, addr) 228642909fdSTijl Coosemans #endif 229642909fdSTijl Coosemans 230642909fdSTijl Coosemans /* Access little-endian MMIO registers atomically without memory barriers. */ 231642909fdSTijl Coosemans 232642909fdSTijl Coosemans #undef readb_relaxed 233642909fdSTijl Coosemans static inline uint8_t 234642909fdSTijl Coosemans readb_relaxed(const volatile void *addr) 235642909fdSTijl Coosemans { 236937a05baSJustin Hibbits return (__raw_readb(addr)); 237642909fdSTijl Coosemans } 238642909fdSTijl Coosemans #define readb_relaxed(addr) readb_relaxed(addr) 239642909fdSTijl Coosemans 240642909fdSTijl Coosemans #undef writeb_relaxed 241642909fdSTijl Coosemans static inline void 242642909fdSTijl Coosemans writeb_relaxed(uint8_t v, volatile void *addr) 243642909fdSTijl Coosemans { 244937a05baSJustin Hibbits __raw_writeb(v, addr); 245642909fdSTijl Coosemans } 246642909fdSTijl Coosemans #define writeb_relaxed(v, addr) writeb_relaxed(v, addr) 247642909fdSTijl Coosemans 248642909fdSTijl Coosemans #undef readw_relaxed 249642909fdSTijl Coosemans static inline uint16_t 250642909fdSTijl Coosemans readw_relaxed(const volatile void *addr) 251642909fdSTijl Coosemans { 252937a05baSJustin Hibbits return (le16toh(__raw_readw(addr))); 253642909fdSTijl Coosemans } 254642909fdSTijl Coosemans #define readw_relaxed(addr) readw_relaxed(addr) 255642909fdSTijl Coosemans 256642909fdSTijl Coosemans #undef writew_relaxed 257642909fdSTijl Coosemans static inline void 258642909fdSTijl Coosemans writew_relaxed(uint16_t v, volatile void *addr) 259642909fdSTijl Coosemans { 260937a05baSJustin Hibbits __raw_writew(htole16(v), addr); 261642909fdSTijl Coosemans } 262642909fdSTijl Coosemans #define writew_relaxed(v, addr) writew_relaxed(v, addr) 263642909fdSTijl Coosemans 264642909fdSTijl Coosemans #undef readl_relaxed 265642909fdSTijl Coosemans static inline uint32_t 266642909fdSTijl Coosemans readl_relaxed(const volatile void *addr) 267642909fdSTijl Coosemans { 268937a05baSJustin Hibbits return (le32toh(__raw_readl(addr))); 269642909fdSTijl Coosemans } 270642909fdSTijl Coosemans #define readl_relaxed(addr) readl_relaxed(addr) 271642909fdSTijl Coosemans 272642909fdSTijl Coosemans #undef writel_relaxed 273642909fdSTijl Coosemans static inline void 274642909fdSTijl Coosemans writel_relaxed(uint32_t v, volatile void *addr) 275642909fdSTijl Coosemans { 276937a05baSJustin Hibbits __raw_writel(htole32(v), addr); 277642909fdSTijl Coosemans } 278642909fdSTijl Coosemans #define writel_relaxed(v, addr) writel_relaxed(v, addr) 279642909fdSTijl Coosemans 280642909fdSTijl Coosemans #undef readq_relaxed 281642909fdSTijl Coosemans #undef writeq_relaxed 282642909fdSTijl Coosemans #ifdef __LP64__ 283642909fdSTijl Coosemans static inline uint64_t 284642909fdSTijl Coosemans readq_relaxed(const volatile void *addr) 285642909fdSTijl Coosemans { 286937a05baSJustin Hibbits return (le64toh(__raw_readq(addr))); 287642909fdSTijl Coosemans } 288642909fdSTijl Coosemans #define readq_relaxed(addr) readq_relaxed(addr) 289642909fdSTijl Coosemans 290642909fdSTijl Coosemans static inline void 291642909fdSTijl Coosemans writeq_relaxed(uint64_t v, volatile void *addr) 292642909fdSTijl Coosemans { 293937a05baSJustin Hibbits __raw_writeq(htole64(v), addr); 294642909fdSTijl Coosemans } 295642909fdSTijl Coosemans #define writeq_relaxed(v, addr) writeq_relaxed(v, addr) 296642909fdSTijl Coosemans #endif 297642909fdSTijl Coosemans 298642909fdSTijl Coosemans /* XXX On Linux ioread and iowrite handle both MMIO and port IO. */ 299642909fdSTijl Coosemans 300642909fdSTijl Coosemans #undef ioread8 301642909fdSTijl Coosemans static inline uint8_t 302642909fdSTijl Coosemans ioread8(const volatile void *addr) 303642909fdSTijl Coosemans { 304642909fdSTijl Coosemans return (readb(addr)); 305642909fdSTijl Coosemans } 306642909fdSTijl Coosemans #define ioread8(addr) ioread8(addr) 307642909fdSTijl Coosemans 308642909fdSTijl Coosemans #undef ioread16 309642909fdSTijl Coosemans static inline uint16_t 310642909fdSTijl Coosemans ioread16(const volatile void *addr) 311642909fdSTijl Coosemans { 312642909fdSTijl Coosemans return (readw(addr)); 313642909fdSTijl Coosemans } 314642909fdSTijl Coosemans #define ioread16(addr) ioread16(addr) 315642909fdSTijl Coosemans 316642909fdSTijl Coosemans #undef ioread16be 317642909fdSTijl Coosemans static inline uint16_t 318642909fdSTijl Coosemans ioread16be(const volatile void *addr) 319642909fdSTijl Coosemans { 320937a05baSJustin Hibbits uint16_t v; 321937a05baSJustin Hibbits 322937a05baSJustin Hibbits __io_br(); 323937a05baSJustin Hibbits v = (be16toh(__raw_readw(addr))); 324937a05baSJustin Hibbits __io_ar(); 325937a05baSJustin Hibbits 326937a05baSJustin Hibbits return (v); 327642909fdSTijl Coosemans } 328642909fdSTijl Coosemans #define ioread16be(addr) ioread16be(addr) 329642909fdSTijl Coosemans 330642909fdSTijl Coosemans #undef ioread32 331642909fdSTijl Coosemans static inline uint32_t 332642909fdSTijl Coosemans ioread32(const volatile void *addr) 333642909fdSTijl Coosemans { 334642909fdSTijl Coosemans return (readl(addr)); 335642909fdSTijl Coosemans } 336642909fdSTijl Coosemans #define ioread32(addr) ioread32(addr) 337642909fdSTijl Coosemans 338642909fdSTijl Coosemans #undef ioread32be 339642909fdSTijl Coosemans static inline uint32_t 340642909fdSTijl Coosemans ioread32be(const volatile void *addr) 341642909fdSTijl Coosemans { 342937a05baSJustin Hibbits uint32_t v; 343937a05baSJustin Hibbits 344937a05baSJustin Hibbits __io_br(); 345937a05baSJustin Hibbits v = (be32toh(__raw_readl(addr))); 346937a05baSJustin Hibbits __io_ar(); 347937a05baSJustin Hibbits 348937a05baSJustin Hibbits return (v); 349642909fdSTijl Coosemans } 350642909fdSTijl Coosemans #define ioread32be(addr) ioread32be(addr) 351642909fdSTijl Coosemans 352642909fdSTijl Coosemans #undef iowrite8 353642909fdSTijl Coosemans static inline void 354642909fdSTijl Coosemans iowrite8(uint8_t v, volatile void *addr) 355642909fdSTijl Coosemans { 356642909fdSTijl Coosemans writeb(v, addr); 357642909fdSTijl Coosemans } 358642909fdSTijl Coosemans #define iowrite8(v, addr) iowrite8(v, addr) 359642909fdSTijl Coosemans 360642909fdSTijl Coosemans #undef iowrite16 361642909fdSTijl Coosemans static inline void 362642909fdSTijl Coosemans iowrite16(uint16_t v, volatile void *addr) 363642909fdSTijl Coosemans { 364642909fdSTijl Coosemans writew(v, addr); 365642909fdSTijl Coosemans } 366642909fdSTijl Coosemans #define iowrite16 iowrite16 367642909fdSTijl Coosemans 368642909fdSTijl Coosemans #undef iowrite32 369642909fdSTijl Coosemans static inline void 370642909fdSTijl Coosemans iowrite32(uint32_t v, volatile void *addr) 371642909fdSTijl Coosemans { 372642909fdSTijl Coosemans writel(v, addr); 373642909fdSTijl Coosemans } 374642909fdSTijl Coosemans #define iowrite32(v, addr) iowrite32(v, addr) 375642909fdSTijl Coosemans 376642909fdSTijl Coosemans #undef iowrite32be 377642909fdSTijl Coosemans static inline void 378642909fdSTijl Coosemans iowrite32be(uint32_t v, volatile void *addr) 379642909fdSTijl Coosemans { 380937a05baSJustin Hibbits __io_bw(); 381937a05baSJustin Hibbits __raw_writel(htobe32(v), addr); 382937a05baSJustin Hibbits __io_aw(); 383642909fdSTijl Coosemans } 384642909fdSTijl Coosemans #define iowrite32be(v, addr) iowrite32be(v, addr) 38586845417SHans Petter Selasky 38686845417SHans Petter Selasky #if defined(__i386__) || defined(__amd64__) 38794a201beSHans Petter Selasky static inline void 38894a201beSHans Petter Selasky _outb(u_char data, u_int port) 38994a201beSHans Petter Selasky { 39094a201beSHans Petter Selasky __asm __volatile("outb %0, %w1" : : "a" (data), "Nd" (port)); 39194a201beSHans Petter Selasky } 39294a201beSHans Petter Selasky #endif 39394a201beSHans Petter Selasky 39460d962e0SJessica Clarke #if defined(__i386__) || defined(__amd64__) || defined(__powerpc__) || defined(__aarch64__) || defined(__riscv) 3958d59ecb2SHans Petter Selasky void *_ioremap_attr(vm_paddr_t phys_addr, unsigned long size, int attr); 39686845417SHans Petter Selasky #else 39734dae08eSJohn Baldwin static __inline void * 39834dae08eSJohn Baldwin _ioremap_attr(vm_paddr_t _phys_addr, unsigned long _size, int _attr) 39934dae08eSJohn Baldwin { 40034dae08eSJohn Baldwin return (NULL); 40134dae08eSJohn Baldwin } 40286845417SHans Petter Selasky #endif 40386845417SHans Petter Selasky 4044cbd4277SBjoern A. Zeeb struct device; 4054cbd4277SBjoern A. Zeeb static inline void * 4064cbd4277SBjoern A. Zeeb devm_ioremap(struct device *dev, resource_size_t offset, resource_size_t size) 4074cbd4277SBjoern A. Zeeb { 4084cbd4277SBjoern A. Zeeb return (NULL); 4094cbd4277SBjoern A. Zeeb } 4104cbd4277SBjoern A. Zeeb 4114d83500fSHans Petter Selasky #ifdef VM_MEMATTR_DEVICE 4124d83500fSHans Petter Selasky #define ioremap_nocache(addr, size) \ 4134d83500fSHans Petter Selasky _ioremap_attr((addr), (size), VM_MEMATTR_DEVICE) 4144d83500fSHans Petter Selasky #define ioremap_wt(addr, size) \ 4154d83500fSHans Petter Selasky _ioremap_attr((addr), (size), VM_MEMATTR_DEVICE) 4164d83500fSHans Petter Selasky #define ioremap(addr, size) \ 4174d83500fSHans Petter Selasky _ioremap_attr((addr), (size), VM_MEMATTR_DEVICE) 4184d83500fSHans Petter Selasky #else 4198d59ecb2SHans Petter Selasky #define ioremap_nocache(addr, size) \ 4208d59ecb2SHans Petter Selasky _ioremap_attr((addr), (size), VM_MEMATTR_UNCACHEABLE) 421f2dbb750SHans Petter Selasky #define ioremap_wt(addr, size) \ 422f2dbb750SHans Petter Selasky _ioremap_attr((addr), (size), VM_MEMATTR_WRITE_THROUGH) 42386845417SHans Petter Selasky #define ioremap(addr, size) \ 42486845417SHans Petter Selasky _ioremap_attr((addr), (size), VM_MEMATTR_UNCACHEABLE) 4254d83500fSHans Petter Selasky #endif 4268167c92fSJessica Clarke #ifdef VM_MEMATTR_WRITE_COMBINING 4274d83500fSHans Petter Selasky #define ioremap_wc(addr, size) \ 4284d83500fSHans Petter Selasky _ioremap_attr((addr), (size), VM_MEMATTR_WRITE_COMBINING) 4298167c92fSJessica Clarke #else 4308167c92fSJessica Clarke #define ioremap_wc(addr, size) ioremap_nocache(addr, size) 4318167c92fSJessica Clarke #endif 432ed53e350SJean-Sébastien Pédron #define ioremap_cache(addr, size) \ 4334d83500fSHans Petter Selasky _ioremap_attr((addr), (size), VM_MEMATTR_WRITE_BACK) 4348d59ecb2SHans Petter Selasky void iounmap(void *addr); 4358d59ecb2SHans Petter Selasky 4368d59ecb2SHans Petter Selasky #define memset_io(a, b, c) memset((a), (b), (c)) 4378d59ecb2SHans Petter Selasky #define memcpy_fromio(a, b, c) memcpy((a), (b), (c)) 4388d59ecb2SHans Petter Selasky #define memcpy_toio(a, b, c) memcpy((a), (b), (c)) 4398d59ecb2SHans Petter Selasky 4408d59ecb2SHans Petter Selasky static inline void 441046b8284SBjoern A. Zeeb __iowrite32_copy(void *to, const void *from, size_t count) 44286364964SKevin Lo { 443046b8284SBjoern A. Zeeb const uint32_t *src; 44486364964SKevin Lo uint32_t *dst; 44586364964SKevin Lo int i; 44686364964SKevin Lo 44786364964SKevin Lo for (i = 0, src = from, dst = to; i < count; i++, src++, dst++) 44886364964SKevin Lo __raw_writel(*src, dst); 44986364964SKevin Lo } 45086364964SKevin Lo 45186364964SKevin Lo static inline void 452046b8284SBjoern A. Zeeb __iowrite64_copy(void *to, const void *from, size_t count) 4538d59ecb2SHans Petter Selasky { 4548d59ecb2SHans Petter Selasky #ifdef __LP64__ 455046b8284SBjoern A. Zeeb const uint64_t *src; 4568d59ecb2SHans Petter Selasky uint64_t *dst; 4578d59ecb2SHans Petter Selasky int i; 4588d59ecb2SHans Petter Selasky 4598d59ecb2SHans Petter Selasky for (i = 0, src = from, dst = to; i < count; i++, src++, dst++) 4608d59ecb2SHans Petter Selasky __raw_writeq(*src, dst); 4618d59ecb2SHans Petter Selasky #else 46286364964SKevin Lo __iowrite32_copy(to, from, count * 2); 4638d59ecb2SHans Petter Selasky #endif 4648d59ecb2SHans Petter Selasky } 4658d59ecb2SHans Petter Selasky 466046b8284SBjoern A. Zeeb static inline void 467046b8284SBjoern A. Zeeb __ioread32_copy(void *to, const void *from, size_t count) 468046b8284SBjoern A. Zeeb { 469046b8284SBjoern A. Zeeb const uint32_t *src; 470046b8284SBjoern A. Zeeb uint32_t *dst; 471046b8284SBjoern A. Zeeb int i; 472046b8284SBjoern A. Zeeb 473046b8284SBjoern A. Zeeb for (i = 0, src = from, dst = to; i < count; i++, src++, dst++) 474046b8284SBjoern A. Zeeb *dst = __raw_readl(src); 475046b8284SBjoern A. Zeeb } 476046b8284SBjoern A. Zeeb 477046b8284SBjoern A. Zeeb static inline void 478046b8284SBjoern A. Zeeb __ioread64_copy(void *to, const void *from, size_t count) 479046b8284SBjoern A. Zeeb { 480046b8284SBjoern A. Zeeb #ifdef __LP64__ 481046b8284SBjoern A. Zeeb const uint64_t *src; 482046b8284SBjoern A. Zeeb uint64_t *dst; 483046b8284SBjoern A. Zeeb int i; 484046b8284SBjoern A. Zeeb 485046b8284SBjoern A. Zeeb for (i = 0, src = from, dst = to; i < count; i++, src++, dst++) 486046b8284SBjoern A. Zeeb *dst = __raw_readq(src); 487046b8284SBjoern A. Zeeb #else 488046b8284SBjoern A. Zeeb __ioread32_copy(to, from, count * 2); 489046b8284SBjoern A. Zeeb #endif 490046b8284SBjoern A. Zeeb } 491046b8284SBjoern A. Zeeb 492684a5fefSHans Petter Selasky enum { 493684a5fefSHans Petter Selasky MEMREMAP_WB = 1 << 0, 494684a5fefSHans Petter Selasky MEMREMAP_WT = 1 << 1, 495684a5fefSHans Petter Selasky MEMREMAP_WC = 1 << 2, 496684a5fefSHans Petter Selasky }; 497684a5fefSHans Petter Selasky 498684a5fefSHans Petter Selasky static inline void * 499684a5fefSHans Petter Selasky memremap(resource_size_t offset, size_t size, unsigned long flags) 500684a5fefSHans Petter Selasky { 501684a5fefSHans Petter Selasky void *addr = NULL; 502684a5fefSHans Petter Selasky 503684a5fefSHans Petter Selasky if ((flags & MEMREMAP_WB) && 504ed53e350SJean-Sébastien Pédron (addr = ioremap_cache(offset, size)) != NULL) 505684a5fefSHans Petter Selasky goto done; 506684a5fefSHans Petter Selasky if ((flags & MEMREMAP_WT) && 507f2dbb750SHans Petter Selasky (addr = ioremap_wt(offset, size)) != NULL) 508684a5fefSHans Petter Selasky goto done; 509684a5fefSHans Petter Selasky if ((flags & MEMREMAP_WC) && 510684a5fefSHans Petter Selasky (addr = ioremap_wc(offset, size)) != NULL) 511684a5fefSHans Petter Selasky goto done; 512684a5fefSHans Petter Selasky done: 513684a5fefSHans Petter Selasky return (addr); 514684a5fefSHans Petter Selasky } 515684a5fefSHans Petter Selasky 516684a5fefSHans Petter Selasky static inline void 517684a5fefSHans Petter Selasky memunmap(void *addr) 518684a5fefSHans Petter Selasky { 519684a5fefSHans Petter Selasky /* XXX May need to check if this is RAM */ 520684a5fefSHans Petter Selasky iounmap(addr); 521684a5fefSHans Petter Selasky } 5228d59ecb2SHans Petter Selasky 52398b12978SVladimir Kondratyev #define __MTRR_ID_BASE 1 52498b12978SVladimir Kondratyev int lkpi_arch_phys_wc_add(unsigned long, unsigned long); 52598b12978SVladimir Kondratyev void lkpi_arch_phys_wc_del(int); 52698b12978SVladimir Kondratyev #define arch_phys_wc_add(...) lkpi_arch_phys_wc_add(__VA_ARGS__) 52798b12978SVladimir Kondratyev #define arch_phys_wc_del(...) lkpi_arch_phys_wc_del(__VA_ARGS__) 52898b12978SVladimir Kondratyev #define arch_phys_wc_index(x) \ 52998b12978SVladimir Kondratyev (((x) < __MTRR_ID_BASE) ? -1 : ((x) - __MTRR_ID_BASE)) 53098b12978SVladimir Kondratyev 531789dbdbbSEmmanuel Vadot #if defined(__amd64__) || defined(__i386__) || defined(__aarch64__) || defined(__powerpc__) || defined(__riscv) 532789dbdbbSEmmanuel Vadot static inline int 533789dbdbbSEmmanuel Vadot arch_io_reserve_memtype_wc(resource_size_t start, resource_size_t size) 534789dbdbbSEmmanuel Vadot { 535*1e99b2eeSJean-Sébastien Pédron vm_offset_t va; 536789dbdbbSEmmanuel Vadot 537*1e99b2eeSJean-Sébastien Pédron va = PHYS_TO_DMAP(start); 538*1e99b2eeSJean-Sébastien Pédron 539*1e99b2eeSJean-Sébastien Pédron #ifdef VM_MEMATTR_WRITE_COMBINING 540*1e99b2eeSJean-Sébastien Pédron return (-pmap_change_attr(va, size, VM_MEMATTR_WRITE_COMBINING)); 541*1e99b2eeSJean-Sébastien Pédron #else 542*1e99b2eeSJean-Sébastien Pédron return (-pmap_change_attr(va, size, VM_MEMATTR_UNCACHEABLE)); 543*1e99b2eeSJean-Sébastien Pédron #endif 544789dbdbbSEmmanuel Vadot } 545789dbdbbSEmmanuel Vadot 546789dbdbbSEmmanuel Vadot static inline void 547789dbdbbSEmmanuel Vadot arch_io_free_memtype_wc(resource_size_t start, resource_size_t size) 548789dbdbbSEmmanuel Vadot { 549*1e99b2eeSJean-Sébastien Pédron vm_offset_t va; 550*1e99b2eeSJean-Sébastien Pédron 551*1e99b2eeSJean-Sébastien Pédron va = PHYS_TO_DMAP(start); 552*1e99b2eeSJean-Sébastien Pédron 553*1e99b2eeSJean-Sébastien Pédron pmap_change_attr(va, size, VM_MEMATTR_WRITE_BACK); 554789dbdbbSEmmanuel Vadot } 555789dbdbbSEmmanuel Vadot #endif 556789dbdbbSEmmanuel Vadot 557307f78f3SVladimir Kondratyev #endif /* _LINUXKPI_LINUX_IO_H_ */ 558