162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci#ifndef __SPARC64_IO_H 362306a36Sopenharmony_ci#define __SPARC64_IO_H 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci#include <linux/kernel.h> 662306a36Sopenharmony_ci#include <linux/compiler.h> 762306a36Sopenharmony_ci#include <linux/types.h> 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <asm/page.h> /* IO address mapping routines need this */ 1062306a36Sopenharmony_ci#include <asm/asi.h> 1162306a36Sopenharmony_ci#include <asm-generic/pci_iomap.h> 1262306a36Sopenharmony_ci#define pci_iomap pci_iomap 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci/* BIO layer definitions. */ 1562306a36Sopenharmony_ciextern unsigned long kern_base, kern_size; 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci/* __raw_{read,write}{b,w,l,q} uses direct access. 1862306a36Sopenharmony_ci * Access the memory as big endian bypassing the cache 1962306a36Sopenharmony_ci * by using ASI_PHYS_BYPASS_EC_E 2062306a36Sopenharmony_ci */ 2162306a36Sopenharmony_ci#define __raw_readb __raw_readb 2262306a36Sopenharmony_cistatic inline u8 __raw_readb(const volatile void __iomem *addr) 2362306a36Sopenharmony_ci{ 2462306a36Sopenharmony_ci u8 ret; 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci __asm__ __volatile__("lduba\t[%1] %2, %0\t/* pci_raw_readb */" 2762306a36Sopenharmony_ci : "=r" (ret) 2862306a36Sopenharmony_ci : "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E)); 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci return ret; 3162306a36Sopenharmony_ci} 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci#define __raw_readw __raw_readw 3462306a36Sopenharmony_cistatic inline u16 __raw_readw(const volatile void __iomem *addr) 3562306a36Sopenharmony_ci{ 3662306a36Sopenharmony_ci u16 ret; 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci __asm__ __volatile__("lduha\t[%1] %2, %0\t/* pci_raw_readw */" 3962306a36Sopenharmony_ci : "=r" (ret) 4062306a36Sopenharmony_ci : "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E)); 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci return ret; 4362306a36Sopenharmony_ci} 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci#define __raw_readl __raw_readl 4662306a36Sopenharmony_cistatic inline u32 __raw_readl(const volatile void __iomem *addr) 4762306a36Sopenharmony_ci{ 4862306a36Sopenharmony_ci u32 ret; 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci __asm__ __volatile__("lduwa\t[%1] %2, %0\t/* pci_raw_readl */" 5162306a36Sopenharmony_ci : "=r" (ret) 5262306a36Sopenharmony_ci : "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E)); 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci return ret; 5562306a36Sopenharmony_ci} 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci#define __raw_readq __raw_readq 5862306a36Sopenharmony_cistatic inline u64 __raw_readq(const volatile void __iomem *addr) 5962306a36Sopenharmony_ci{ 6062306a36Sopenharmony_ci u64 ret; 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci __asm__ __volatile__("ldxa\t[%1] %2, %0\t/* pci_raw_readq */" 6362306a36Sopenharmony_ci : "=r" (ret) 6462306a36Sopenharmony_ci : "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E)); 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci return ret; 6762306a36Sopenharmony_ci} 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci#define __raw_writeb __raw_writeb 7062306a36Sopenharmony_cistatic inline void __raw_writeb(u8 b, const volatile void __iomem *addr) 7162306a36Sopenharmony_ci{ 7262306a36Sopenharmony_ci __asm__ __volatile__("stba\t%r0, [%1] %2\t/* pci_raw_writeb */" 7362306a36Sopenharmony_ci : /* no outputs */ 7462306a36Sopenharmony_ci : "Jr" (b), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E)); 7562306a36Sopenharmony_ci} 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci#define __raw_writew __raw_writew 7862306a36Sopenharmony_cistatic inline void __raw_writew(u16 w, const volatile void __iomem *addr) 7962306a36Sopenharmony_ci{ 8062306a36Sopenharmony_ci __asm__ __volatile__("stha\t%r0, [%1] %2\t/* pci_raw_writew */" 8162306a36Sopenharmony_ci : /* no outputs */ 8262306a36Sopenharmony_ci : "Jr" (w), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E)); 8362306a36Sopenharmony_ci} 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci#define __raw_writel __raw_writel 8662306a36Sopenharmony_cistatic inline void __raw_writel(u32 l, const volatile void __iomem *addr) 8762306a36Sopenharmony_ci{ 8862306a36Sopenharmony_ci __asm__ __volatile__("stwa\t%r0, [%1] %2\t/* pci_raw_writel */" 8962306a36Sopenharmony_ci : /* no outputs */ 9062306a36Sopenharmony_ci : "Jr" (l), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E)); 9162306a36Sopenharmony_ci} 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci#define __raw_writeq __raw_writeq 9462306a36Sopenharmony_cistatic inline void __raw_writeq(u64 q, const volatile void __iomem *addr) 9562306a36Sopenharmony_ci{ 9662306a36Sopenharmony_ci __asm__ __volatile__("stxa\t%r0, [%1] %2\t/* pci_raw_writeq */" 9762306a36Sopenharmony_ci : /* no outputs */ 9862306a36Sopenharmony_ci : "Jr" (q), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E)); 9962306a36Sopenharmony_ci} 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_ci/* Memory functions, same as I/O accesses on Ultra. 10262306a36Sopenharmony_ci * Access memory as little endian bypassing 10362306a36Sopenharmony_ci * the cache by using ASI_PHYS_BYPASS_EC_E_L 10462306a36Sopenharmony_ci */ 10562306a36Sopenharmony_ci#define readb readb 10662306a36Sopenharmony_ci#define readb_relaxed readb 10762306a36Sopenharmony_cistatic inline u8 readb(const volatile void __iomem *addr) 10862306a36Sopenharmony_ci{ u8 ret; 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_ci __asm__ __volatile__("lduba\t[%1] %2, %0\t/* pci_readb */" 11162306a36Sopenharmony_ci : "=r" (ret) 11262306a36Sopenharmony_ci : "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L) 11362306a36Sopenharmony_ci : "memory"); 11462306a36Sopenharmony_ci return ret; 11562306a36Sopenharmony_ci} 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ci#define readw readw 11862306a36Sopenharmony_ci#define readw_relaxed readw 11962306a36Sopenharmony_cistatic inline u16 readw(const volatile void __iomem *addr) 12062306a36Sopenharmony_ci{ u16 ret; 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ci __asm__ __volatile__("lduha\t[%1] %2, %0\t/* pci_readw */" 12362306a36Sopenharmony_ci : "=r" (ret) 12462306a36Sopenharmony_ci : "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L) 12562306a36Sopenharmony_ci : "memory"); 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_ci return ret; 12862306a36Sopenharmony_ci} 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_ci#define readl readl 13162306a36Sopenharmony_ci#define readl_relaxed readl 13262306a36Sopenharmony_cistatic inline u32 readl(const volatile void __iomem *addr) 13362306a36Sopenharmony_ci{ u32 ret; 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_ci __asm__ __volatile__("lduwa\t[%1] %2, %0\t/* pci_readl */" 13662306a36Sopenharmony_ci : "=r" (ret) 13762306a36Sopenharmony_ci : "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L) 13862306a36Sopenharmony_ci : "memory"); 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_ci return ret; 14162306a36Sopenharmony_ci} 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_ci#define readq readq 14462306a36Sopenharmony_ci#define readq_relaxed readq 14562306a36Sopenharmony_cistatic inline u64 readq(const volatile void __iomem *addr) 14662306a36Sopenharmony_ci{ u64 ret; 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_ci __asm__ __volatile__("ldxa\t[%1] %2, %0\t/* pci_readq */" 14962306a36Sopenharmony_ci : "=r" (ret) 15062306a36Sopenharmony_ci : "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L) 15162306a36Sopenharmony_ci : "memory"); 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_ci return ret; 15462306a36Sopenharmony_ci} 15562306a36Sopenharmony_ci 15662306a36Sopenharmony_ci#define writeb writeb 15762306a36Sopenharmony_ci#define writeb_relaxed writeb 15862306a36Sopenharmony_cistatic inline void writeb(u8 b, volatile void __iomem *addr) 15962306a36Sopenharmony_ci{ 16062306a36Sopenharmony_ci __asm__ __volatile__("stba\t%r0, [%1] %2\t/* pci_writeb */" 16162306a36Sopenharmony_ci : /* no outputs */ 16262306a36Sopenharmony_ci : "Jr" (b), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L) 16362306a36Sopenharmony_ci : "memory"); 16462306a36Sopenharmony_ci} 16562306a36Sopenharmony_ci 16662306a36Sopenharmony_ci#define writew writew 16762306a36Sopenharmony_ci#define writew_relaxed writew 16862306a36Sopenharmony_cistatic inline void writew(u16 w, volatile void __iomem *addr) 16962306a36Sopenharmony_ci{ 17062306a36Sopenharmony_ci __asm__ __volatile__("stha\t%r0, [%1] %2\t/* pci_writew */" 17162306a36Sopenharmony_ci : /* no outputs */ 17262306a36Sopenharmony_ci : "Jr" (w), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L) 17362306a36Sopenharmony_ci : "memory"); 17462306a36Sopenharmony_ci} 17562306a36Sopenharmony_ci 17662306a36Sopenharmony_ci#define writel writel 17762306a36Sopenharmony_ci#define writel_relaxed writel 17862306a36Sopenharmony_cistatic inline void writel(u32 l, volatile void __iomem *addr) 17962306a36Sopenharmony_ci{ 18062306a36Sopenharmony_ci __asm__ __volatile__("stwa\t%r0, [%1] %2\t/* pci_writel */" 18162306a36Sopenharmony_ci : /* no outputs */ 18262306a36Sopenharmony_ci : "Jr" (l), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L) 18362306a36Sopenharmony_ci : "memory"); 18462306a36Sopenharmony_ci} 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_ci#define writeq writeq 18762306a36Sopenharmony_ci#define writeq_relaxed writeq 18862306a36Sopenharmony_cistatic inline void writeq(u64 q, volatile void __iomem *addr) 18962306a36Sopenharmony_ci{ 19062306a36Sopenharmony_ci __asm__ __volatile__("stxa\t%r0, [%1] %2\t/* pci_writeq */" 19162306a36Sopenharmony_ci : /* no outputs */ 19262306a36Sopenharmony_ci : "Jr" (q), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L) 19362306a36Sopenharmony_ci : "memory"); 19462306a36Sopenharmony_ci} 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_ci#define inb inb 19762306a36Sopenharmony_cistatic inline u8 inb(unsigned long addr) 19862306a36Sopenharmony_ci{ 19962306a36Sopenharmony_ci return readb((volatile void __iomem *)addr); 20062306a36Sopenharmony_ci} 20162306a36Sopenharmony_ci 20262306a36Sopenharmony_ci#define inw inw 20362306a36Sopenharmony_cistatic inline u16 inw(unsigned long addr) 20462306a36Sopenharmony_ci{ 20562306a36Sopenharmony_ci return readw((volatile void __iomem *)addr); 20662306a36Sopenharmony_ci} 20762306a36Sopenharmony_ci 20862306a36Sopenharmony_ci#define inl inl 20962306a36Sopenharmony_cistatic inline u32 inl(unsigned long addr) 21062306a36Sopenharmony_ci{ 21162306a36Sopenharmony_ci return readl((volatile void __iomem *)addr); 21262306a36Sopenharmony_ci} 21362306a36Sopenharmony_ci 21462306a36Sopenharmony_ci#define outb outb 21562306a36Sopenharmony_cistatic inline void outb(u8 b, unsigned long addr) 21662306a36Sopenharmony_ci{ 21762306a36Sopenharmony_ci writeb(b, (volatile void __iomem *)addr); 21862306a36Sopenharmony_ci} 21962306a36Sopenharmony_ci 22062306a36Sopenharmony_ci#define outw outw 22162306a36Sopenharmony_cistatic inline void outw(u16 w, unsigned long addr) 22262306a36Sopenharmony_ci{ 22362306a36Sopenharmony_ci writew(w, (volatile void __iomem *)addr); 22462306a36Sopenharmony_ci} 22562306a36Sopenharmony_ci 22662306a36Sopenharmony_ci#define outl outl 22762306a36Sopenharmony_cistatic inline void outl(u32 l, unsigned long addr) 22862306a36Sopenharmony_ci{ 22962306a36Sopenharmony_ci writel(l, (volatile void __iomem *)addr); 23062306a36Sopenharmony_ci} 23162306a36Sopenharmony_ci 23262306a36Sopenharmony_ci 23362306a36Sopenharmony_ci#define inb_p(__addr) inb(__addr) 23462306a36Sopenharmony_ci#define outb_p(__b, __addr) outb(__b, __addr) 23562306a36Sopenharmony_ci#define inw_p(__addr) inw(__addr) 23662306a36Sopenharmony_ci#define outw_p(__w, __addr) outw(__w, __addr) 23762306a36Sopenharmony_ci#define inl_p(__addr) inl(__addr) 23862306a36Sopenharmony_ci#define outl_p(__l, __addr) outl(__l, __addr) 23962306a36Sopenharmony_ci 24062306a36Sopenharmony_civoid outsb(unsigned long, const void *, unsigned long); 24162306a36Sopenharmony_civoid outsw(unsigned long, const void *, unsigned long); 24262306a36Sopenharmony_civoid outsl(unsigned long, const void *, unsigned long); 24362306a36Sopenharmony_ci#define outsb outsb 24462306a36Sopenharmony_ci#define outsw outsw 24562306a36Sopenharmony_ci#define outsl outsl 24662306a36Sopenharmony_civoid insb(unsigned long, void *, unsigned long); 24762306a36Sopenharmony_civoid insw(unsigned long, void *, unsigned long); 24862306a36Sopenharmony_civoid insl(unsigned long, void *, unsigned long); 24962306a36Sopenharmony_ci#define insb insb 25062306a36Sopenharmony_ci#define insw insw 25162306a36Sopenharmony_ci#define insl insl 25262306a36Sopenharmony_ci 25362306a36Sopenharmony_cistatic inline void readsb(void __iomem *port, void *buf, unsigned long count) 25462306a36Sopenharmony_ci{ 25562306a36Sopenharmony_ci insb((unsigned long __force)port, buf, count); 25662306a36Sopenharmony_ci} 25762306a36Sopenharmony_ci#define readsb readsb 25862306a36Sopenharmony_ci 25962306a36Sopenharmony_cistatic inline void readsw(void __iomem *port, void *buf, unsigned long count) 26062306a36Sopenharmony_ci{ 26162306a36Sopenharmony_ci insw((unsigned long __force)port, buf, count); 26262306a36Sopenharmony_ci} 26362306a36Sopenharmony_ci#define readsw readsw 26462306a36Sopenharmony_ci 26562306a36Sopenharmony_cistatic inline void readsl(void __iomem *port, void *buf, unsigned long count) 26662306a36Sopenharmony_ci{ 26762306a36Sopenharmony_ci insl((unsigned long __force)port, buf, count); 26862306a36Sopenharmony_ci} 26962306a36Sopenharmony_ci#define readsl readsl 27062306a36Sopenharmony_ci 27162306a36Sopenharmony_cistatic inline void writesb(void __iomem *port, const void *buf, unsigned long count) 27262306a36Sopenharmony_ci{ 27362306a36Sopenharmony_ci outsb((unsigned long __force)port, buf, count); 27462306a36Sopenharmony_ci} 27562306a36Sopenharmony_ci#define writesb writesb 27662306a36Sopenharmony_ci 27762306a36Sopenharmony_cistatic inline void writesw(void __iomem *port, const void *buf, unsigned long count) 27862306a36Sopenharmony_ci{ 27962306a36Sopenharmony_ci outsw((unsigned long __force)port, buf, count); 28062306a36Sopenharmony_ci} 28162306a36Sopenharmony_ci#define writesw writesw 28262306a36Sopenharmony_ci 28362306a36Sopenharmony_cistatic inline void writesl(void __iomem *port, const void *buf, unsigned long count) 28462306a36Sopenharmony_ci{ 28562306a36Sopenharmony_ci outsl((unsigned long __force)port, buf, count); 28662306a36Sopenharmony_ci} 28762306a36Sopenharmony_ci#define writesl writesl 28862306a36Sopenharmony_ci 28962306a36Sopenharmony_ci#define ioread8_rep(p,d,l) readsb(p,d,l) 29062306a36Sopenharmony_ci#define ioread16_rep(p,d,l) readsw(p,d,l) 29162306a36Sopenharmony_ci#define ioread32_rep(p,d,l) readsl(p,d,l) 29262306a36Sopenharmony_ci#define iowrite8_rep(p,d,l) writesb(p,d,l) 29362306a36Sopenharmony_ci#define iowrite16_rep(p,d,l) writesw(p,d,l) 29462306a36Sopenharmony_ci#define iowrite32_rep(p,d,l) writesl(p,d,l) 29562306a36Sopenharmony_ci 29662306a36Sopenharmony_ci/* Valid I/O Space regions are anywhere, because each PCI bus supported 29762306a36Sopenharmony_ci * can live in an arbitrary area of the physical address range. 29862306a36Sopenharmony_ci */ 29962306a36Sopenharmony_ci#define IO_SPACE_LIMIT 0xffffffffffffffffUL 30062306a36Sopenharmony_ci 30162306a36Sopenharmony_ci/* Now, SBUS variants, only difference from PCI is that we do 30262306a36Sopenharmony_ci * not use little-endian ASIs. 30362306a36Sopenharmony_ci */ 30462306a36Sopenharmony_cistatic inline u8 sbus_readb(const volatile void __iomem *addr) 30562306a36Sopenharmony_ci{ 30662306a36Sopenharmony_ci return __raw_readb(addr); 30762306a36Sopenharmony_ci} 30862306a36Sopenharmony_ci 30962306a36Sopenharmony_cistatic inline u16 sbus_readw(const volatile void __iomem *addr) 31062306a36Sopenharmony_ci{ 31162306a36Sopenharmony_ci return __raw_readw(addr); 31262306a36Sopenharmony_ci} 31362306a36Sopenharmony_ci 31462306a36Sopenharmony_cistatic inline u32 sbus_readl(const volatile void __iomem *addr) 31562306a36Sopenharmony_ci{ 31662306a36Sopenharmony_ci return __raw_readl(addr); 31762306a36Sopenharmony_ci} 31862306a36Sopenharmony_ci 31962306a36Sopenharmony_cistatic inline u64 sbus_readq(const volatile void __iomem *addr) 32062306a36Sopenharmony_ci{ 32162306a36Sopenharmony_ci return __raw_readq(addr); 32262306a36Sopenharmony_ci} 32362306a36Sopenharmony_ci 32462306a36Sopenharmony_cistatic inline void sbus_writeb(u8 b, volatile void __iomem *addr) 32562306a36Sopenharmony_ci{ 32662306a36Sopenharmony_ci __raw_writeb(b, addr); 32762306a36Sopenharmony_ci} 32862306a36Sopenharmony_ci 32962306a36Sopenharmony_cistatic inline void sbus_writew(u16 w, volatile void __iomem *addr) 33062306a36Sopenharmony_ci{ 33162306a36Sopenharmony_ci __raw_writew(w, addr); 33262306a36Sopenharmony_ci} 33362306a36Sopenharmony_ci 33462306a36Sopenharmony_cistatic inline void sbus_writel(u32 l, volatile void __iomem *addr) 33562306a36Sopenharmony_ci{ 33662306a36Sopenharmony_ci __raw_writel(l, addr); 33762306a36Sopenharmony_ci} 33862306a36Sopenharmony_ci 33962306a36Sopenharmony_cistatic inline void sbus_writeq(u64 q, volatile void __iomem *addr) 34062306a36Sopenharmony_ci{ 34162306a36Sopenharmony_ci __raw_writeq(q, addr); 34262306a36Sopenharmony_ci} 34362306a36Sopenharmony_ci 34462306a36Sopenharmony_cistatic inline void sbus_memset_io(volatile void __iomem *dst, int c, __kernel_size_t n) 34562306a36Sopenharmony_ci{ 34662306a36Sopenharmony_ci while(n--) { 34762306a36Sopenharmony_ci sbus_writeb(c, dst); 34862306a36Sopenharmony_ci dst++; 34962306a36Sopenharmony_ci } 35062306a36Sopenharmony_ci} 35162306a36Sopenharmony_ci 35262306a36Sopenharmony_cistatic inline void memset_io(volatile void __iomem *dst, int c, __kernel_size_t n) 35362306a36Sopenharmony_ci{ 35462306a36Sopenharmony_ci volatile void __iomem *d = dst; 35562306a36Sopenharmony_ci 35662306a36Sopenharmony_ci while (n--) { 35762306a36Sopenharmony_ci writeb(c, d); 35862306a36Sopenharmony_ci d++; 35962306a36Sopenharmony_ci } 36062306a36Sopenharmony_ci} 36162306a36Sopenharmony_ci#define memset_io memset_io 36262306a36Sopenharmony_ci 36362306a36Sopenharmony_cistatic inline void sbus_memcpy_fromio(void *dst, const volatile void __iomem *src, 36462306a36Sopenharmony_ci __kernel_size_t n) 36562306a36Sopenharmony_ci{ 36662306a36Sopenharmony_ci char *d = dst; 36762306a36Sopenharmony_ci 36862306a36Sopenharmony_ci while (n--) { 36962306a36Sopenharmony_ci char tmp = sbus_readb(src); 37062306a36Sopenharmony_ci *d++ = tmp; 37162306a36Sopenharmony_ci src++; 37262306a36Sopenharmony_ci } 37362306a36Sopenharmony_ci} 37462306a36Sopenharmony_ci 37562306a36Sopenharmony_ci 37662306a36Sopenharmony_cistatic inline void memcpy_fromio(void *dst, const volatile void __iomem *src, 37762306a36Sopenharmony_ci __kernel_size_t n) 37862306a36Sopenharmony_ci{ 37962306a36Sopenharmony_ci char *d = dst; 38062306a36Sopenharmony_ci 38162306a36Sopenharmony_ci while (n--) { 38262306a36Sopenharmony_ci char tmp = readb(src); 38362306a36Sopenharmony_ci *d++ = tmp; 38462306a36Sopenharmony_ci src++; 38562306a36Sopenharmony_ci } 38662306a36Sopenharmony_ci} 38762306a36Sopenharmony_ci#define memcpy_fromio memcpy_fromio 38862306a36Sopenharmony_ci 38962306a36Sopenharmony_cistatic inline void sbus_memcpy_toio(volatile void __iomem *dst, const void *src, 39062306a36Sopenharmony_ci __kernel_size_t n) 39162306a36Sopenharmony_ci{ 39262306a36Sopenharmony_ci const char *s = src; 39362306a36Sopenharmony_ci volatile void __iomem *d = dst; 39462306a36Sopenharmony_ci 39562306a36Sopenharmony_ci while (n--) { 39662306a36Sopenharmony_ci char tmp = *s++; 39762306a36Sopenharmony_ci sbus_writeb(tmp, d); 39862306a36Sopenharmony_ci d++; 39962306a36Sopenharmony_ci } 40062306a36Sopenharmony_ci} 40162306a36Sopenharmony_ci 40262306a36Sopenharmony_cistatic inline void memcpy_toio(volatile void __iomem *dst, const void *src, 40362306a36Sopenharmony_ci __kernel_size_t n) 40462306a36Sopenharmony_ci{ 40562306a36Sopenharmony_ci const char *s = src; 40662306a36Sopenharmony_ci volatile void __iomem *d = dst; 40762306a36Sopenharmony_ci 40862306a36Sopenharmony_ci while (n--) { 40962306a36Sopenharmony_ci char tmp = *s++; 41062306a36Sopenharmony_ci writeb(tmp, d); 41162306a36Sopenharmony_ci d++; 41262306a36Sopenharmony_ci } 41362306a36Sopenharmony_ci} 41462306a36Sopenharmony_ci#define memcpy_toio memcpy_toio 41562306a36Sopenharmony_ci 41662306a36Sopenharmony_ci#ifdef __KERNEL__ 41762306a36Sopenharmony_ci 41862306a36Sopenharmony_ci/* On sparc64 we have the whole physical IO address space accessible 41962306a36Sopenharmony_ci * using physically addressed loads and stores, so this does nothing. 42062306a36Sopenharmony_ci */ 42162306a36Sopenharmony_cistatic inline void __iomem *ioremap(unsigned long offset, unsigned long size) 42262306a36Sopenharmony_ci{ 42362306a36Sopenharmony_ci return (void __iomem *)offset; 42462306a36Sopenharmony_ci} 42562306a36Sopenharmony_ci 42662306a36Sopenharmony_ci#define ioremap_uc(X,Y) ioremap((X),(Y)) 42762306a36Sopenharmony_ci#define ioremap_wc(X,Y) ioremap((X),(Y)) 42862306a36Sopenharmony_ci#define ioremap_wt(X,Y) ioremap((X),(Y)) 42962306a36Sopenharmony_cistatic inline void __iomem *ioremap_np(unsigned long offset, unsigned long size) 43062306a36Sopenharmony_ci{ 43162306a36Sopenharmony_ci return NULL; 43262306a36Sopenharmony_ci 43362306a36Sopenharmony_ci} 43462306a36Sopenharmony_ci#define ioremap_np ioremap_np 43562306a36Sopenharmony_ci 43662306a36Sopenharmony_cistatic inline void iounmap(volatile void __iomem *addr) 43762306a36Sopenharmony_ci{ 43862306a36Sopenharmony_ci} 43962306a36Sopenharmony_ci 44062306a36Sopenharmony_ci#define ioread8 readb 44162306a36Sopenharmony_ci#define ioread16 readw 44262306a36Sopenharmony_ci#define ioread16be __raw_readw 44362306a36Sopenharmony_ci#define ioread32 readl 44462306a36Sopenharmony_ci#define ioread32be __raw_readl 44562306a36Sopenharmony_ci#define iowrite8 writeb 44662306a36Sopenharmony_ci#define iowrite16 writew 44762306a36Sopenharmony_ci#define iowrite16be __raw_writew 44862306a36Sopenharmony_ci#define iowrite32 writel 44962306a36Sopenharmony_ci#define iowrite32be __raw_writel 45062306a36Sopenharmony_ci 45162306a36Sopenharmony_ci/* Create a virtual mapping cookie for an IO port range */ 45262306a36Sopenharmony_civoid __iomem *ioport_map(unsigned long port, unsigned int nr); 45362306a36Sopenharmony_civoid ioport_unmap(void __iomem *); 45462306a36Sopenharmony_ci#define ioport_map ioport_map 45562306a36Sopenharmony_ci#define ioport_unmap ioport_unmap 45662306a36Sopenharmony_ci 45762306a36Sopenharmony_ci/* Create a virtual mapping cookie for a PCI BAR (memory or IO) */ 45862306a36Sopenharmony_cistruct pci_dev; 45962306a36Sopenharmony_civoid pci_iounmap(struct pci_dev *dev, void __iomem *); 46062306a36Sopenharmony_ci#define pci_iounmap pci_iounmap 46162306a36Sopenharmony_ci 46262306a36Sopenharmony_cistatic inline int sbus_can_dma_64bit(void) 46362306a36Sopenharmony_ci{ 46462306a36Sopenharmony_ci return 1; 46562306a36Sopenharmony_ci} 46662306a36Sopenharmony_cistatic inline int sbus_can_burst64(void) 46762306a36Sopenharmony_ci{ 46862306a36Sopenharmony_ci return 1; 46962306a36Sopenharmony_ci} 47062306a36Sopenharmony_cistruct device; 47162306a36Sopenharmony_civoid sbus_set_sbus64(struct device *, int); 47262306a36Sopenharmony_ci 47362306a36Sopenharmony_ci/* 47462306a36Sopenharmony_ci * Convert a physical pointer to a virtual kernel pointer for /dev/mem 47562306a36Sopenharmony_ci * access 47662306a36Sopenharmony_ci */ 47762306a36Sopenharmony_ci#define xlate_dev_mem_ptr(p) __va(p) 47862306a36Sopenharmony_ci 47962306a36Sopenharmony_ci#endif 48062306a36Sopenharmony_ci 48162306a36Sopenharmony_ci#endif /* !(__SPARC64_IO_H) */ 482