cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

io.h (23455B)


      1/* SPDX-License-Identifier: GPL-2.0-or-later */
      2/* Generic I/O port emulation.
      3 *
      4 * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
      5 * Written by David Howells (dhowells@redhat.com)
      6 */
      7#ifndef __ASM_GENERIC_IO_H
      8#define __ASM_GENERIC_IO_H
      9
     10#include <asm/page.h> /* I/O is all done through memory accesses */
     11#include <linux/string.h> /* for memset() and memcpy() */
     12#include <linux/types.h>
     13
     14#ifdef CONFIG_GENERIC_IOMAP
     15#include <asm-generic/iomap.h>
     16#endif
     17
     18#include <asm/mmiowb.h>
     19#include <asm-generic/pci_iomap.h>
     20
     21#ifndef __io_br
     22#define __io_br()      barrier()
     23#endif
     24
     25/* prevent prefetching of coherent DMA data ahead of a dma-complete */
     26#ifndef __io_ar
     27#ifdef rmb
     28#define __io_ar(v)      rmb()
     29#else
     30#define __io_ar(v)      barrier()
     31#endif
     32#endif
     33
     34/* flush writes to coherent DMA data before possibly triggering a DMA read */
     35#ifndef __io_bw
     36#ifdef wmb
     37#define __io_bw()      wmb()
     38#else
     39#define __io_bw()      barrier()
     40#endif
     41#endif
     42
     43/* serialize device access against a spin_unlock, usually handled there. */
     44#ifndef __io_aw
     45#define __io_aw()      mmiowb_set_pending()
     46#endif
     47
     48#ifndef __io_pbw
     49#define __io_pbw()     __io_bw()
     50#endif
     51
     52#ifndef __io_paw
     53#define __io_paw()     __io_aw()
     54#endif
     55
     56#ifndef __io_pbr
     57#define __io_pbr()     __io_br()
     58#endif
     59
     60#ifndef __io_par
     61#define __io_par(v)     __io_ar(v)
     62#endif
     63
     64
     65/*
     66 * __raw_{read,write}{b,w,l,q}() access memory in native endianness.
     67 *
     68 * On some architectures memory mapped IO needs to be accessed differently.
     69 * On the simple architectures, we just read/write the memory location
     70 * directly.
     71 */
     72
     73#ifndef __raw_readb
     74#define __raw_readb __raw_readb
     75static inline u8 __raw_readb(const volatile void __iomem *addr)
     76{
     77	return *(const volatile u8 __force *)addr;
     78}
     79#endif
     80
     81#ifndef __raw_readw
     82#define __raw_readw __raw_readw
     83static inline u16 __raw_readw(const volatile void __iomem *addr)
     84{
     85	return *(const volatile u16 __force *)addr;
     86}
     87#endif
     88
     89#ifndef __raw_readl
     90#define __raw_readl __raw_readl
     91static inline u32 __raw_readl(const volatile void __iomem *addr)
     92{
     93	return *(const volatile u32 __force *)addr;
     94}
     95#endif
     96
     97#ifdef CONFIG_64BIT
     98#ifndef __raw_readq
     99#define __raw_readq __raw_readq
    100static inline u64 __raw_readq(const volatile void __iomem *addr)
    101{
    102	return *(const volatile u64 __force *)addr;
    103}
    104#endif
    105#endif /* CONFIG_64BIT */
    106
    107#ifndef __raw_writeb
    108#define __raw_writeb __raw_writeb
    109static inline void __raw_writeb(u8 value, volatile void __iomem *addr)
    110{
    111	*(volatile u8 __force *)addr = value;
    112}
    113#endif
    114
    115#ifndef __raw_writew
    116#define __raw_writew __raw_writew
    117static inline void __raw_writew(u16 value, volatile void __iomem *addr)
    118{
    119	*(volatile u16 __force *)addr = value;
    120}
    121#endif
    122
    123#ifndef __raw_writel
    124#define __raw_writel __raw_writel
    125static inline void __raw_writel(u32 value, volatile void __iomem *addr)
    126{
    127	*(volatile u32 __force *)addr = value;
    128}
    129#endif
    130
    131#ifdef CONFIG_64BIT
    132#ifndef __raw_writeq
    133#define __raw_writeq __raw_writeq
    134static inline void __raw_writeq(u64 value, volatile void __iomem *addr)
    135{
    136	*(volatile u64 __force *)addr = value;
    137}
    138#endif
    139#endif /* CONFIG_64BIT */
    140
    141/*
    142 * {read,write}{b,w,l,q}() access little endian memory and return result in
    143 * native endianness.
    144 */
    145
    146#ifndef readb
    147#define readb readb
    148static inline u8 readb(const volatile void __iomem *addr)
    149{
    150	u8 val;
    151
    152	__io_br();
    153	val = __raw_readb(addr);
    154	__io_ar(val);
    155	return val;
    156}
    157#endif
    158
    159#ifndef readw
    160#define readw readw
    161static inline u16 readw(const volatile void __iomem *addr)
    162{
    163	u16 val;
    164
    165	__io_br();
    166	val = __le16_to_cpu((__le16 __force)__raw_readw(addr));
    167	__io_ar(val);
    168	return val;
    169}
    170#endif
    171
    172#ifndef readl
    173#define readl readl
    174static inline u32 readl(const volatile void __iomem *addr)
    175{
    176	u32 val;
    177
    178	__io_br();
    179	val = __le32_to_cpu((__le32 __force)__raw_readl(addr));
    180	__io_ar(val);
    181	return val;
    182}
    183#endif
    184
    185#ifdef CONFIG_64BIT
    186#ifndef readq
    187#define readq readq
    188static inline u64 readq(const volatile void __iomem *addr)
    189{
    190	u64 val;
    191
    192	__io_br();
    193	val = __le64_to_cpu(__raw_readq(addr));
    194	__io_ar(val);
    195	return val;
    196}
    197#endif
    198#endif /* CONFIG_64BIT */
    199
    200#ifndef writeb
    201#define writeb writeb
    202static inline void writeb(u8 value, volatile void __iomem *addr)
    203{
    204	__io_bw();
    205	__raw_writeb(value, addr);
    206	__io_aw();
    207}
    208#endif
    209
    210#ifndef writew
    211#define writew writew
    212static inline void writew(u16 value, volatile void __iomem *addr)
    213{
    214	__io_bw();
    215	__raw_writew((u16 __force)cpu_to_le16(value), addr);
    216	__io_aw();
    217}
    218#endif
    219
    220#ifndef writel
    221#define writel writel
    222static inline void writel(u32 value, volatile void __iomem *addr)
    223{
    224	__io_bw();
    225	__raw_writel((u32 __force)__cpu_to_le32(value), addr);
    226	__io_aw();
    227}
    228#endif
    229
    230#ifdef CONFIG_64BIT
    231#ifndef writeq
    232#define writeq writeq
    233static inline void writeq(u64 value, volatile void __iomem *addr)
    234{
    235	__io_bw();
    236	__raw_writeq(__cpu_to_le64(value), addr);
    237	__io_aw();
    238}
    239#endif
    240#endif /* CONFIG_64BIT */
    241
    242/*
    243 * {read,write}{b,w,l,q}_relaxed() are like the regular version, but
    244 * are not guaranteed to provide ordering against spinlocks or memory
    245 * accesses.
    246 */
    247#ifndef readb_relaxed
    248#define readb_relaxed readb_relaxed
    249static inline u8 readb_relaxed(const volatile void __iomem *addr)
    250{
    251	return __raw_readb(addr);
    252}
    253#endif
    254
    255#ifndef readw_relaxed
    256#define readw_relaxed readw_relaxed
    257static inline u16 readw_relaxed(const volatile void __iomem *addr)
    258{
    259	return __le16_to_cpu(__raw_readw(addr));
    260}
    261#endif
    262
    263#ifndef readl_relaxed
    264#define readl_relaxed readl_relaxed
    265static inline u32 readl_relaxed(const volatile void __iomem *addr)
    266{
    267	return __le32_to_cpu(__raw_readl(addr));
    268}
    269#endif
    270
    271#if defined(readq) && !defined(readq_relaxed)
    272#define readq_relaxed readq_relaxed
    273static inline u64 readq_relaxed(const volatile void __iomem *addr)
    274{
    275	return __le64_to_cpu(__raw_readq(addr));
    276}
    277#endif
    278
    279#ifndef writeb_relaxed
    280#define writeb_relaxed writeb_relaxed
    281static inline void writeb_relaxed(u8 value, volatile void __iomem *addr)
    282{
    283	__raw_writeb(value, addr);
    284}
    285#endif
    286
    287#ifndef writew_relaxed
    288#define writew_relaxed writew_relaxed
    289static inline void writew_relaxed(u16 value, volatile void __iomem *addr)
    290{
    291	__raw_writew(cpu_to_le16(value), addr);
    292}
    293#endif
    294
    295#ifndef writel_relaxed
    296#define writel_relaxed writel_relaxed
    297static inline void writel_relaxed(u32 value, volatile void __iomem *addr)
    298{
    299	__raw_writel(__cpu_to_le32(value), addr);
    300}
    301#endif
    302
    303#if defined(writeq) && !defined(writeq_relaxed)
    304#define writeq_relaxed writeq_relaxed
    305static inline void writeq_relaxed(u64 value, volatile void __iomem *addr)
    306{
    307	__raw_writeq(__cpu_to_le64(value), addr);
    308}
    309#endif
    310
    311/*
    312 * {read,write}s{b,w,l,q}() repeatedly access the same memory address in
    313 * native endianness in 8-, 16-, 32- or 64-bit chunks (@count times).
    314 */
    315#ifndef readsb
    316#define readsb readsb
    317static inline void readsb(const volatile void __iomem *addr, void *buffer,
    318			  unsigned int count)
    319{
    320	if (count) {
    321		u8 *buf = buffer;
    322
    323		do {
    324			u8 x = __raw_readb(addr);
    325			*buf++ = x;
    326		} while (--count);
    327	}
    328}
    329#endif
    330
    331#ifndef readsw
    332#define readsw readsw
    333static inline void readsw(const volatile void __iomem *addr, void *buffer,
    334			  unsigned int count)
    335{
    336	if (count) {
    337		u16 *buf = buffer;
    338
    339		do {
    340			u16 x = __raw_readw(addr);
    341			*buf++ = x;
    342		} while (--count);
    343	}
    344}
    345#endif
    346
    347#ifndef readsl
    348#define readsl readsl
    349static inline void readsl(const volatile void __iomem *addr, void *buffer,
    350			  unsigned int count)
    351{
    352	if (count) {
    353		u32 *buf = buffer;
    354
    355		do {
    356			u32 x = __raw_readl(addr);
    357			*buf++ = x;
    358		} while (--count);
    359	}
    360}
    361#endif
    362
    363#ifdef CONFIG_64BIT
    364#ifndef readsq
    365#define readsq readsq
    366static inline void readsq(const volatile void __iomem *addr, void *buffer,
    367			  unsigned int count)
    368{
    369	if (count) {
    370		u64 *buf = buffer;
    371
    372		do {
    373			u64 x = __raw_readq(addr);
    374			*buf++ = x;
    375		} while (--count);
    376	}
    377}
    378#endif
    379#endif /* CONFIG_64BIT */
    380
    381#ifndef writesb
    382#define writesb writesb
    383static inline void writesb(volatile void __iomem *addr, const void *buffer,
    384			   unsigned int count)
    385{
    386	if (count) {
    387		const u8 *buf = buffer;
    388
    389		do {
    390			__raw_writeb(*buf++, addr);
    391		} while (--count);
    392	}
    393}
    394#endif
    395
    396#ifndef writesw
    397#define writesw writesw
    398static inline void writesw(volatile void __iomem *addr, const void *buffer,
    399			   unsigned int count)
    400{
    401	if (count) {
    402		const u16 *buf = buffer;
    403
    404		do {
    405			__raw_writew(*buf++, addr);
    406		} while (--count);
    407	}
    408}
    409#endif
    410
    411#ifndef writesl
    412#define writesl writesl
    413static inline void writesl(volatile void __iomem *addr, const void *buffer,
    414			   unsigned int count)
    415{
    416	if (count) {
    417		const u32 *buf = buffer;
    418
    419		do {
    420			__raw_writel(*buf++, addr);
    421		} while (--count);
    422	}
    423}
    424#endif
    425
    426#ifdef CONFIG_64BIT
    427#ifndef writesq
    428#define writesq writesq
    429static inline void writesq(volatile void __iomem *addr, const void *buffer,
    430			   unsigned int count)
    431{
    432	if (count) {
    433		const u64 *buf = buffer;
    434
    435		do {
    436			__raw_writeq(*buf++, addr);
    437		} while (--count);
    438	}
    439}
    440#endif
    441#endif /* CONFIG_64BIT */
    442
    443#ifndef PCI_IOBASE
    444#define PCI_IOBASE ((void __iomem *)0)
    445#endif
    446
    447#ifndef IO_SPACE_LIMIT
    448#define IO_SPACE_LIMIT 0xffff
    449#endif
    450
    451/*
    452 * {in,out}{b,w,l}() access little endian I/O. {in,out}{b,w,l}_p() can be
    453 * implemented on hardware that needs an additional delay for I/O accesses to
    454 * take effect.
    455 */
    456
    457#if !defined(inb) && !defined(_inb)
    458#define _inb _inb
    459static inline u8 _inb(unsigned long addr)
    460{
    461	u8 val;
    462
    463	__io_pbr();
    464	val = __raw_readb(PCI_IOBASE + addr);
    465	__io_par(val);
    466	return val;
    467}
    468#endif
    469
    470#if !defined(inw) && !defined(_inw)
    471#define _inw _inw
    472static inline u16 _inw(unsigned long addr)
    473{
    474	u16 val;
    475
    476	__io_pbr();
    477	val = __le16_to_cpu((__le16 __force)__raw_readw(PCI_IOBASE + addr));
    478	__io_par(val);
    479	return val;
    480}
    481#endif
    482
    483#if !defined(inl) && !defined(_inl)
    484#define _inl _inl
    485static inline u32 _inl(unsigned long addr)
    486{
    487	u32 val;
    488
    489	__io_pbr();
    490	val = __le32_to_cpu((__le32 __force)__raw_readl(PCI_IOBASE + addr));
    491	__io_par(val);
    492	return val;
    493}
    494#endif
    495
    496#if !defined(outb) && !defined(_outb)
    497#define _outb _outb
    498static inline void _outb(u8 value, unsigned long addr)
    499{
    500	__io_pbw();
    501	__raw_writeb(value, PCI_IOBASE + addr);
    502	__io_paw();
    503}
    504#endif
    505
    506#if !defined(outw) && !defined(_outw)
    507#define _outw _outw
    508static inline void _outw(u16 value, unsigned long addr)
    509{
    510	__io_pbw();
    511	__raw_writew((u16 __force)cpu_to_le16(value), PCI_IOBASE + addr);
    512	__io_paw();
    513}
    514#endif
    515
    516#if !defined(outl) && !defined(_outl)
    517#define _outl _outl
    518static inline void _outl(u32 value, unsigned long addr)
    519{
    520	__io_pbw();
    521	__raw_writel((u32 __force)cpu_to_le32(value), PCI_IOBASE + addr);
    522	__io_paw();
    523}
    524#endif
    525
    526#include <linux/logic_pio.h>
    527
    528#ifndef inb
    529#define inb _inb
    530#endif
    531
    532#ifndef inw
    533#define inw _inw
    534#endif
    535
    536#ifndef inl
    537#define inl _inl
    538#endif
    539
    540#ifndef outb
    541#define outb _outb
    542#endif
    543
    544#ifndef outw
    545#define outw _outw
    546#endif
    547
    548#ifndef outl
    549#define outl _outl
    550#endif
    551
    552#ifndef inb_p
    553#define inb_p inb_p
    554static inline u8 inb_p(unsigned long addr)
    555{
    556	return inb(addr);
    557}
    558#endif
    559
    560#ifndef inw_p
    561#define inw_p inw_p
    562static inline u16 inw_p(unsigned long addr)
    563{
    564	return inw(addr);
    565}
    566#endif
    567
    568#ifndef inl_p
    569#define inl_p inl_p
    570static inline u32 inl_p(unsigned long addr)
    571{
    572	return inl(addr);
    573}
    574#endif
    575
    576#ifndef outb_p
    577#define outb_p outb_p
    578static inline void outb_p(u8 value, unsigned long addr)
    579{
    580	outb(value, addr);
    581}
    582#endif
    583
    584#ifndef outw_p
    585#define outw_p outw_p
    586static inline void outw_p(u16 value, unsigned long addr)
    587{
    588	outw(value, addr);
    589}
    590#endif
    591
    592#ifndef outl_p
    593#define outl_p outl_p
    594static inline void outl_p(u32 value, unsigned long addr)
    595{
    596	outl(value, addr);
    597}
    598#endif
    599
    600/*
    601 * {in,out}s{b,w,l}{,_p}() are variants of the above that repeatedly access a
    602 * single I/O port multiple times.
    603 */
    604
    605#ifndef insb
    606#define insb insb
    607static inline void insb(unsigned long addr, void *buffer, unsigned int count)
    608{
    609	readsb(PCI_IOBASE + addr, buffer, count);
    610}
    611#endif
    612
    613#ifndef insw
    614#define insw insw
    615static inline void insw(unsigned long addr, void *buffer, unsigned int count)
    616{
    617	readsw(PCI_IOBASE + addr, buffer, count);
    618}
    619#endif
    620
    621#ifndef insl
    622#define insl insl
    623static inline void insl(unsigned long addr, void *buffer, unsigned int count)
    624{
    625	readsl(PCI_IOBASE + addr, buffer, count);
    626}
    627#endif
    628
    629#ifndef outsb
    630#define outsb outsb
    631static inline void outsb(unsigned long addr, const void *buffer,
    632			 unsigned int count)
    633{
    634	writesb(PCI_IOBASE + addr, buffer, count);
    635}
    636#endif
    637
    638#ifndef outsw
    639#define outsw outsw
    640static inline void outsw(unsigned long addr, const void *buffer,
    641			 unsigned int count)
    642{
    643	writesw(PCI_IOBASE + addr, buffer, count);
    644}
    645#endif
    646
    647#ifndef outsl
    648#define outsl outsl
    649static inline void outsl(unsigned long addr, const void *buffer,
    650			 unsigned int count)
    651{
    652	writesl(PCI_IOBASE + addr, buffer, count);
    653}
    654#endif
    655
    656#ifndef insb_p
    657#define insb_p insb_p
    658static inline void insb_p(unsigned long addr, void *buffer, unsigned int count)
    659{
    660	insb(addr, buffer, count);
    661}
    662#endif
    663
    664#ifndef insw_p
    665#define insw_p insw_p
    666static inline void insw_p(unsigned long addr, void *buffer, unsigned int count)
    667{
    668	insw(addr, buffer, count);
    669}
    670#endif
    671
    672#ifndef insl_p
    673#define insl_p insl_p
    674static inline void insl_p(unsigned long addr, void *buffer, unsigned int count)
    675{
    676	insl(addr, buffer, count);
    677}
    678#endif
    679
    680#ifndef outsb_p
    681#define outsb_p outsb_p
    682static inline void outsb_p(unsigned long addr, const void *buffer,
    683			   unsigned int count)
    684{
    685	outsb(addr, buffer, count);
    686}
    687#endif
    688
    689#ifndef outsw_p
    690#define outsw_p outsw_p
    691static inline void outsw_p(unsigned long addr, const void *buffer,
    692			   unsigned int count)
    693{
    694	outsw(addr, buffer, count);
    695}
    696#endif
    697
    698#ifndef outsl_p
    699#define outsl_p outsl_p
    700static inline void outsl_p(unsigned long addr, const void *buffer,
    701			   unsigned int count)
    702{
    703	outsl(addr, buffer, count);
    704}
    705#endif
    706
    707#ifndef CONFIG_GENERIC_IOMAP
    708#ifndef ioread8
    709#define ioread8 ioread8
    710static inline u8 ioread8(const volatile void __iomem *addr)
    711{
    712	return readb(addr);
    713}
    714#endif
    715
    716#ifndef ioread16
    717#define ioread16 ioread16
    718static inline u16 ioread16(const volatile void __iomem *addr)
    719{
    720	return readw(addr);
    721}
    722#endif
    723
    724#ifndef ioread32
    725#define ioread32 ioread32
    726static inline u32 ioread32(const volatile void __iomem *addr)
    727{
    728	return readl(addr);
    729}
    730#endif
    731
    732#ifdef CONFIG_64BIT
    733#ifndef ioread64
    734#define ioread64 ioread64
    735static inline u64 ioread64(const volatile void __iomem *addr)
    736{
    737	return readq(addr);
    738}
    739#endif
    740#endif /* CONFIG_64BIT */
    741
    742#ifndef iowrite8
    743#define iowrite8 iowrite8
    744static inline void iowrite8(u8 value, volatile void __iomem *addr)
    745{
    746	writeb(value, addr);
    747}
    748#endif
    749
    750#ifndef iowrite16
    751#define iowrite16 iowrite16
    752static inline void iowrite16(u16 value, volatile void __iomem *addr)
    753{
    754	writew(value, addr);
    755}
    756#endif
    757
    758#ifndef iowrite32
    759#define iowrite32 iowrite32
    760static inline void iowrite32(u32 value, volatile void __iomem *addr)
    761{
    762	writel(value, addr);
    763}
    764#endif
    765
    766#ifdef CONFIG_64BIT
    767#ifndef iowrite64
    768#define iowrite64 iowrite64
    769static inline void iowrite64(u64 value, volatile void __iomem *addr)
    770{
    771	writeq(value, addr);
    772}
    773#endif
    774#endif /* CONFIG_64BIT */
    775
    776#ifndef ioread16be
    777#define ioread16be ioread16be
    778static inline u16 ioread16be(const volatile void __iomem *addr)
    779{
    780	return swab16(readw(addr));
    781}
    782#endif
    783
    784#ifndef ioread32be
    785#define ioread32be ioread32be
    786static inline u32 ioread32be(const volatile void __iomem *addr)
    787{
    788	return swab32(readl(addr));
    789}
    790#endif
    791
    792#ifdef CONFIG_64BIT
    793#ifndef ioread64be
    794#define ioread64be ioread64be
    795static inline u64 ioread64be(const volatile void __iomem *addr)
    796{
    797	return swab64(readq(addr));
    798}
    799#endif
    800#endif /* CONFIG_64BIT */
    801
    802#ifndef iowrite16be
    803#define iowrite16be iowrite16be
    804static inline void iowrite16be(u16 value, void volatile __iomem *addr)
    805{
    806	writew(swab16(value), addr);
    807}
    808#endif
    809
    810#ifndef iowrite32be
    811#define iowrite32be iowrite32be
    812static inline void iowrite32be(u32 value, volatile void __iomem *addr)
    813{
    814	writel(swab32(value), addr);
    815}
    816#endif
    817
    818#ifdef CONFIG_64BIT
    819#ifndef iowrite64be
    820#define iowrite64be iowrite64be
    821static inline void iowrite64be(u64 value, volatile void __iomem *addr)
    822{
    823	writeq(swab64(value), addr);
    824}
    825#endif
    826#endif /* CONFIG_64BIT */
    827
    828#ifndef ioread8_rep
    829#define ioread8_rep ioread8_rep
    830static inline void ioread8_rep(const volatile void __iomem *addr, void *buffer,
    831			       unsigned int count)
    832{
    833	readsb(addr, buffer, count);
    834}
    835#endif
    836
    837#ifndef ioread16_rep
    838#define ioread16_rep ioread16_rep
    839static inline void ioread16_rep(const volatile void __iomem *addr,
    840				void *buffer, unsigned int count)
    841{
    842	readsw(addr, buffer, count);
    843}
    844#endif
    845
    846#ifndef ioread32_rep
    847#define ioread32_rep ioread32_rep
    848static inline void ioread32_rep(const volatile void __iomem *addr,
    849				void *buffer, unsigned int count)
    850{
    851	readsl(addr, buffer, count);
    852}
    853#endif
    854
    855#ifdef CONFIG_64BIT
    856#ifndef ioread64_rep
    857#define ioread64_rep ioread64_rep
    858static inline void ioread64_rep(const volatile void __iomem *addr,
    859				void *buffer, unsigned int count)
    860{
    861	readsq(addr, buffer, count);
    862}
    863#endif
    864#endif /* CONFIG_64BIT */
    865
    866#ifndef iowrite8_rep
    867#define iowrite8_rep iowrite8_rep
    868static inline void iowrite8_rep(volatile void __iomem *addr,
    869				const void *buffer,
    870				unsigned int count)
    871{
    872	writesb(addr, buffer, count);
    873}
    874#endif
    875
    876#ifndef iowrite16_rep
    877#define iowrite16_rep iowrite16_rep
    878static inline void iowrite16_rep(volatile void __iomem *addr,
    879				 const void *buffer,
    880				 unsigned int count)
    881{
    882	writesw(addr, buffer, count);
    883}
    884#endif
    885
    886#ifndef iowrite32_rep
    887#define iowrite32_rep iowrite32_rep
    888static inline void iowrite32_rep(volatile void __iomem *addr,
    889				 const void *buffer,
    890				 unsigned int count)
    891{
    892	writesl(addr, buffer, count);
    893}
    894#endif
    895
    896#ifdef CONFIG_64BIT
    897#ifndef iowrite64_rep
    898#define iowrite64_rep iowrite64_rep
    899static inline void iowrite64_rep(volatile void __iomem *addr,
    900				 const void *buffer,
    901				 unsigned int count)
    902{
    903	writesq(addr, buffer, count);
    904}
    905#endif
    906#endif /* CONFIG_64BIT */
    907#endif /* CONFIG_GENERIC_IOMAP */
    908
    909#ifdef __KERNEL__
    910
    911#include <linux/vmalloc.h>
    912#define __io_virt(x) ((void __force *)(x))
    913
    914/*
    915 * Change virtual addresses to physical addresses and vv.
    916 * These are pretty trivial
    917 */
    918#ifndef virt_to_phys
    919#define virt_to_phys virt_to_phys
    920static inline unsigned long virt_to_phys(volatile void *address)
    921{
    922	return __pa((unsigned long)address);
    923}
    924#endif
    925
    926#ifndef phys_to_virt
    927#define phys_to_virt phys_to_virt
    928static inline void *phys_to_virt(unsigned long address)
    929{
    930	return __va(address);
    931}
    932#endif
    933
    934/**
    935 * DOC: ioremap() and ioremap_*() variants
    936 *
    937 * Architectures with an MMU are expected to provide ioremap() and iounmap()
    938 * themselves or rely on GENERIC_IOREMAP.  For NOMMU architectures we provide
    939 * a default nop-op implementation that expect that the physical address used
    940 * for MMIO are already marked as uncached, and can be used as kernel virtual
    941 * addresses.
    942 *
    943 * ioremap_wc() and ioremap_wt() can provide more relaxed caching attributes
    944 * for specific drivers if the architecture choses to implement them.  If they
    945 * are not implemented we fall back to plain ioremap. Conversely, ioremap_np()
    946 * can provide stricter non-posted write semantics if the architecture
    947 * implements them.
    948 */
    949#ifndef CONFIG_MMU
    950#ifndef ioremap
    951#define ioremap ioremap
    952static inline void __iomem *ioremap(phys_addr_t offset, size_t size)
    953{
    954	return (void __iomem *)(unsigned long)offset;
    955}
    956#endif
    957
    958#ifndef iounmap
    959#define iounmap iounmap
    960static inline void iounmap(volatile void __iomem *addr)
    961{
    962}
    963#endif
    964#elif defined(CONFIG_GENERIC_IOREMAP)
    965#include <linux/pgtable.h>
    966
    967void __iomem *ioremap_prot(phys_addr_t addr, size_t size, unsigned long prot);
    968void iounmap(volatile void __iomem *addr);
    969
    970static inline void __iomem *ioremap(phys_addr_t addr, size_t size)
    971{
    972	/* _PAGE_IOREMAP needs to be supplied by the architecture */
    973	return ioremap_prot(addr, size, _PAGE_IOREMAP);
    974}
    975#endif /* !CONFIG_MMU || CONFIG_GENERIC_IOREMAP */
    976
    977#ifndef ioremap_wc
    978#define ioremap_wc ioremap
    979#endif
    980
    981#ifndef ioremap_wt
    982#define ioremap_wt ioremap
    983#endif
    984
    985/*
    986 * ioremap_uc is special in that we do require an explicit architecture
    987 * implementation.  In general you do not want to use this function in a
    988 * driver and use plain ioremap, which is uncached by default.  Similarly
    989 * architectures should not implement it unless they have a very good
    990 * reason.
    991 */
    992#ifndef ioremap_uc
    993#define ioremap_uc ioremap_uc
    994static inline void __iomem *ioremap_uc(phys_addr_t offset, size_t size)
    995{
    996	return NULL;
    997}
    998#endif
    999
   1000/*
   1001 * ioremap_np needs an explicit architecture implementation, as it
   1002 * requests stronger semantics than regular ioremap(). Portable drivers
   1003 * should instead use one of the higher-level abstractions, like
   1004 * devm_ioremap_resource(), to choose the correct variant for any given
   1005 * device and bus. Portable drivers with a good reason to want non-posted
   1006 * write semantics should always provide an ioremap() fallback in case
   1007 * ioremap_np() is not available.
   1008 */
   1009#ifndef ioremap_np
   1010#define ioremap_np ioremap_np
   1011static inline void __iomem *ioremap_np(phys_addr_t offset, size_t size)
   1012{
   1013	return NULL;
   1014}
   1015#endif
   1016
   1017#ifdef CONFIG_HAS_IOPORT_MAP
   1018#ifndef CONFIG_GENERIC_IOMAP
   1019#ifndef ioport_map
   1020#define ioport_map ioport_map
   1021static inline void __iomem *ioport_map(unsigned long port, unsigned int nr)
   1022{
   1023	port &= IO_SPACE_LIMIT;
   1024	return (port > MMIO_UPPER_LIMIT) ? NULL : PCI_IOBASE + port;
   1025}
   1026#define ARCH_HAS_GENERIC_IOPORT_MAP
   1027#endif
   1028
   1029#ifndef ioport_unmap
   1030#define ioport_unmap ioport_unmap
   1031static inline void ioport_unmap(void __iomem *p)
   1032{
   1033}
   1034#endif
   1035#else /* CONFIG_GENERIC_IOMAP */
   1036extern void __iomem *ioport_map(unsigned long port, unsigned int nr);
   1037extern void ioport_unmap(void __iomem *p);
   1038#endif /* CONFIG_GENERIC_IOMAP */
   1039#endif /* CONFIG_HAS_IOPORT_MAP */
   1040
   1041#ifndef CONFIG_GENERIC_IOMAP
   1042#ifndef pci_iounmap
   1043#define ARCH_WANTS_GENERIC_PCI_IOUNMAP
   1044#endif
   1045#endif
   1046
   1047#ifndef xlate_dev_mem_ptr
   1048#define xlate_dev_mem_ptr xlate_dev_mem_ptr
   1049static inline void *xlate_dev_mem_ptr(phys_addr_t addr)
   1050{
   1051	return __va(addr);
   1052}
   1053#endif
   1054
   1055#ifndef unxlate_dev_mem_ptr
   1056#define unxlate_dev_mem_ptr unxlate_dev_mem_ptr
   1057static inline void unxlate_dev_mem_ptr(phys_addr_t phys, void *addr)
   1058{
   1059}
   1060#endif
   1061
   1062#ifdef CONFIG_VIRT_TO_BUS
   1063#ifndef virt_to_bus
   1064static inline unsigned long virt_to_bus(void *address)
   1065{
   1066	return (unsigned long)address;
   1067}
   1068
   1069static inline void *bus_to_virt(unsigned long address)
   1070{
   1071	return (void *)address;
   1072}
   1073#endif
   1074#endif
   1075
   1076#ifndef memset_io
   1077#define memset_io memset_io
   1078/**
   1079 * memset_io	Set a range of I/O memory to a constant value
   1080 * @addr:	The beginning of the I/O-memory range to set
   1081 * @val:	The value to set the memory to
   1082 * @count:	The number of bytes to set
   1083 *
   1084 * Set a range of I/O memory to a given value.
   1085 */
   1086static inline void memset_io(volatile void __iomem *addr, int value,
   1087			     size_t size)
   1088{
   1089	memset(__io_virt(addr), value, size);
   1090}
   1091#endif
   1092
   1093#ifndef memcpy_fromio
   1094#define memcpy_fromio memcpy_fromio
   1095/**
   1096 * memcpy_fromio	Copy a block of data from I/O memory
   1097 * @dst:		The (RAM) destination for the copy
   1098 * @src:		The (I/O memory) source for the data
   1099 * @count:		The number of bytes to copy
   1100 *
   1101 * Copy a block of data from I/O memory.
   1102 */
   1103static inline void memcpy_fromio(void *buffer,
   1104				 const volatile void __iomem *addr,
   1105				 size_t size)
   1106{
   1107	memcpy(buffer, __io_virt(addr), size);
   1108}
   1109#endif
   1110
   1111#ifndef memcpy_toio
   1112#define memcpy_toio memcpy_toio
   1113/**
   1114 * memcpy_toio		Copy a block of data into I/O memory
   1115 * @dst:		The (I/O memory) destination for the copy
   1116 * @src:		The (RAM) source for the data
   1117 * @count:		The number of bytes to copy
   1118 *
   1119 * Copy a block of data to I/O memory.
   1120 */
   1121static inline void memcpy_toio(volatile void __iomem *addr, const void *buffer,
   1122			       size_t size)
   1123{
   1124	memcpy(__io_virt(addr), buffer, size);
   1125}
   1126#endif
   1127
   1128#ifndef CONFIG_GENERIC_DEVMEM_IS_ALLOWED
   1129extern int devmem_is_allowed(unsigned long pfn);
   1130#endif
   1131
   1132#endif /* __KERNEL__ */
   1133
   1134#endif /* __ASM_GENERIC_IO_H */