linux/arch/parisc/include/asm/io.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2#ifndef _ASM_IO_H
   3#define _ASM_IO_H
   4
   5#include <linux/types.h>
   6#include <linux/pgtable.h>
   7
   8#define virt_to_phys(a) ((unsigned long)__pa(a))
   9#define phys_to_virt(a) __va(a)
  10
  11static inline unsigned long isa_bus_to_virt(unsigned long addr) {
  12        BUG();
  13        return 0;
  14}
  15
  16static inline unsigned long isa_virt_to_bus(void *addr) {
  17        BUG();
  18        return 0;
  19}
  20
  21/*
  22 * Memory mapped I/O
  23 *
  24 * readX()/writeX() do byteswapping and take an ioremapped address
  25 * __raw_readX()/__raw_writeX() don't byteswap and take an ioremapped address.
  26 * gsc_*() don't byteswap and operate on physical addresses;
  27 *   eg dev->hpa or 0xfee00000.
  28 */
  29
  30static inline unsigned char gsc_readb(unsigned long addr)
  31{
  32        long flags;
  33        unsigned char ret;
  34
  35        __asm__ __volatile__(
  36        "       rsm     %3,%0\n"
  37        "       ldbx    0(%2),%1\n"
  38        "       mtsm    %0\n"
  39        : "=&r" (flags), "=r" (ret) : "r" (addr), "i" (PSW_SM_D) );
  40
  41        return ret;
  42}
  43
  44static inline unsigned short gsc_readw(unsigned long addr)
  45{
  46        long flags;
  47        unsigned short ret;
  48
  49        __asm__ __volatile__(
  50        "       rsm     %3,%0\n"
  51        "       ldhx    0(%2),%1\n"
  52        "       mtsm    %0\n"
  53        : "=&r" (flags), "=r" (ret) : "r" (addr), "i" (PSW_SM_D) );
  54
  55        return ret;
  56}
  57
  58static inline unsigned int gsc_readl(unsigned long addr)
  59{
  60        u32 ret;
  61
  62        __asm__ __volatile__(
  63        "       ldwax   0(%1),%0\n"
  64        : "=r" (ret) : "r" (addr) );
  65
  66        return ret;
  67}
  68
  69static inline unsigned long long gsc_readq(unsigned long addr)
  70{
  71        unsigned long long ret;
  72
  73#ifdef CONFIG_64BIT
  74        __asm__ __volatile__(
  75        "       ldda    0(%1),%0\n"
  76        :  "=r" (ret) : "r" (addr) );
  77#else
  78        /* two reads may have side effects.. */
  79        ret = ((u64) gsc_readl(addr)) << 32;
  80        ret |= gsc_readl(addr+4);
  81#endif
  82        return ret;
  83}
  84
  85static inline void gsc_writeb(unsigned char val, unsigned long addr)
  86{
  87        long flags;
  88        __asm__ __volatile__(
  89        "       rsm     %3,%0\n"
  90        "       stbs    %1,0(%2)\n"
  91        "       mtsm    %0\n"
  92        : "=&r" (flags) :  "r" (val), "r" (addr), "i" (PSW_SM_D) );
  93}
  94
  95static inline void gsc_writew(unsigned short val, unsigned long addr)
  96{
  97        long flags;
  98        __asm__ __volatile__(
  99        "       rsm     %3,%0\n"
 100        "       sths    %1,0(%2)\n"
 101        "       mtsm    %0\n"
 102        : "=&r" (flags) :  "r" (val), "r" (addr), "i" (PSW_SM_D) );
 103}
 104
 105static inline void gsc_writel(unsigned int val, unsigned long addr)
 106{
 107        __asm__ __volatile__(
 108        "       stwas   %0,0(%1)\n"
 109        : :  "r" (val), "r" (addr) );
 110}
 111
 112static inline void gsc_writeq(unsigned long long val, unsigned long addr)
 113{
 114#ifdef CONFIG_64BIT
 115        __asm__ __volatile__(
 116        "       stda    %0,0(%1)\n"
 117        : :  "r" (val), "r" (addr) );
 118#else
 119        /* two writes may have side effects.. */
 120        gsc_writel(val >> 32, addr);
 121        gsc_writel(val, addr+4);
 122#endif
 123}
 124
 125/*
 126 * The standard PCI ioremap interfaces
 127 */
 128#define ioremap_prot ioremap_prot
 129
 130#define _PAGE_IOREMAP (_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | \
 131                       _PAGE_ACCESSED | _PAGE_NO_CACHE)
 132
 133#define ioremap_wc(addr, size)  \
 134        ioremap_prot((addr), (size), __pgprot(_PAGE_IOREMAP))
 135
 136#define pci_iounmap                     pci_iounmap
 137
 138/* Port-space IO */
 139
 140#define inb_p inb
 141#define inw_p inw
 142#define inl_p inl
 143#define outb_p outb
 144#define outw_p outw
 145#define outl_p outl
 146
 147extern unsigned char eisa_in8(unsigned short port);
 148extern unsigned short eisa_in16(unsigned short port);
 149extern unsigned int eisa_in32(unsigned short port);
 150extern void eisa_out8(unsigned char data, unsigned short port);
 151extern void eisa_out16(unsigned short data, unsigned short port);
 152extern void eisa_out32(unsigned int data, unsigned short port);
 153
 154#if defined(CONFIG_PCI)
 155extern unsigned char inb(int addr);
 156extern unsigned short inw(int addr);
 157extern unsigned int inl(int addr);
 158extern void outb(unsigned char b, int addr);
 159extern void outw(unsigned short b, int addr);
 160extern void outl(unsigned int b, int addr);
 161#define inb inb
 162#define inw inw
 163#define inl inl
 164#define outb outb
 165#define outw outw
 166#define outl outl
 167#elif defined(CONFIG_EISA)
 168#define inb eisa_in8
 169#define inw eisa_in16
 170#define inl eisa_in32
 171#define outb eisa_out8
 172#define outw eisa_out16
 173#define outl eisa_out32
 174#else
 175static inline char inb(unsigned long addr)
 176{
 177        BUG();
 178        return -1;
 179}
 180
 181static inline short inw(unsigned long addr)
 182{
 183        BUG();
 184        return -1;
 185}
 186
 187static inline int inl(unsigned long addr)
 188{
 189        BUG();
 190        return -1;
 191}
 192#define inb inb
 193#define inw inw
 194#define inl inl
 195#define outb(x, y)      ({(void)(x); (void)(y); BUG(); 0;})
 196#define outw(x, y)      ({(void)(x); (void)(y); BUG(); 0;})
 197#define outl(x, y)      ({(void)(x); (void)(y); BUG(); 0;})
 198#endif
 199
 200/*
 201 * String versions of in/out ops:
 202 */
 203extern void insb (unsigned long port, void *dst, unsigned long count);
 204extern void insw (unsigned long port, void *dst, unsigned long count);
 205extern void insl (unsigned long port, void *dst, unsigned long count);
 206extern void outsb (unsigned long port, const void *src, unsigned long count);
 207extern void outsw (unsigned long port, const void *src, unsigned long count);
 208extern void outsl (unsigned long port, const void *src, unsigned long count);
 209#define insb insb
 210#define insw insw
 211#define insl insl
 212#define outsb outsb
 213#define outsw outsw
 214#define outsl outsl
 215
 216/* IO Port space is :      BBiiii   where BB is HBA number. */
 217#define IO_SPACE_LIMIT 0x00ffffff
 218
 219/* PA machines have an MM I/O space from 0xf0000000-0xffffffff in 32
 220 * bit mode and from 0xfffffffff0000000-0xfffffffffffffff in 64 bit
 221 * mode (essentially just sign extending.  This macro takes in a 32
 222 * bit I/O address (still with the leading f) and outputs the correct
 223 * value for either 32 or 64 bit mode */
 224#define F_EXTEND(x) ((unsigned long)((x) | (0xffffffff00000000ULL)))
 225
 226#ifdef CONFIG_64BIT
 227extern u64 ioread64(const void __iomem *addr);
 228extern u64 ioread64be(const void __iomem *addr);
 229#define ioread64 ioread64
 230#define ioread64be ioread64be
 231
 232extern void iowrite64(u64 val, void __iomem *addr);
 233extern void iowrite64be(u64 val, void __iomem *addr);
 234#define iowrite64 iowrite64
 235#define iowrite64be iowrite64be
 236#endif
 237
 238extern void __iomem *ioport_map(unsigned long port, unsigned int nr);
 239extern void ioport_unmap(void __iomem *);
 240#define ioport_map ioport_map
 241#define ioport_unmap ioport_unmap
 242
 243extern unsigned int ioread8(const void __iomem *);
 244extern unsigned int ioread16(const void __iomem *);
 245extern unsigned int ioread16be(const void __iomem *);
 246extern unsigned int ioread32(const void __iomem *);
 247extern unsigned int ioread32be(const void __iomem *);
 248#define ioread8 ioread8
 249#define ioread16 ioread16
 250#define ioread32 ioread32
 251#define ioread16be ioread16be
 252#define ioread32be ioread32be
 253
 254extern void iowrite8(u8, void __iomem *);
 255extern void iowrite16(u16, void __iomem *);
 256extern void iowrite16be(u16, void __iomem *);
 257extern void iowrite32(u32, void __iomem *);
 258extern void iowrite32be(u32, void __iomem *);
 259#define iowrite8 iowrite8
 260#define iowrite16 iowrite16
 261#define iowrite32 iowrite32
 262#define iowrite16be iowrite16be
 263#define iowrite32be iowrite32be
 264
 265extern void ioread8_rep(const void __iomem *port, void *buf, unsigned long count);
 266extern void ioread16_rep(const void __iomem *port, void *buf, unsigned long count);
 267extern void ioread32_rep(const void __iomem *port, void *buf, unsigned long count);
 268#define ioread8_rep ioread8_rep
 269#define ioread16_rep ioread16_rep
 270#define ioread32_rep ioread32_rep
 271
 272extern void iowrite8_rep(void __iomem *port, const void *buf, unsigned long count);
 273extern void iowrite16_rep(void __iomem *port, const void *buf, unsigned long count);
 274extern void iowrite32_rep(void __iomem *port, const void *buf, unsigned long count);
 275#define iowrite8_rep iowrite8_rep
 276#define iowrite16_rep iowrite16_rep
 277#define iowrite32_rep iowrite32_rep
 278
 279extern int devmem_is_allowed(unsigned long pfn);
 280
 281#include <asm-generic/io.h>
 282
 283#endif
 284