Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.17 298 lines 8.0 kB view raw
1#ifndef _ASM_IO_H 2#define _ASM_IO_H 3 4#include <linux/config.h> 5#include <linux/types.h> 6#include <asm/pgtable.h> 7 8extern unsigned long parisc_vmerge_boundary; 9extern unsigned long parisc_vmerge_max_size; 10 11#define BIO_VMERGE_BOUNDARY parisc_vmerge_boundary 12#define BIO_VMERGE_MAX_SIZE parisc_vmerge_max_size 13 14#define virt_to_phys(a) ((unsigned long)__pa(a)) 15#define phys_to_virt(a) __va(a) 16#define virt_to_bus virt_to_phys 17#define bus_to_virt phys_to_virt 18 19/* 20 * Memory mapped I/O 21 * 22 * readX()/writeX() do byteswapping and take an ioremapped address 23 * __raw_readX()/__raw_writeX() don't byteswap and take an ioremapped address. 24 * gsc_*() don't byteswap and operate on physical addresses; 25 * eg dev->hpa or 0xfee00000. 26 */ 27 28static inline unsigned char gsc_readb(unsigned long addr) 29{ 30 long flags; 31 unsigned char ret; 32 33 __asm__ __volatile__( 34 " rsm 2,%0\n" 35 " ldbx 0(%2),%1\n" 36 " mtsm %0\n" 37 : "=&r" (flags), "=r" (ret) : "r" (addr) ); 38 39 return ret; 40} 41 42static inline unsigned short gsc_readw(unsigned long addr) 43{ 44 long flags; 45 unsigned short ret; 46 47 __asm__ __volatile__( 48 " rsm 2,%0\n" 49 " ldhx 0(%2),%1\n" 50 " mtsm %0\n" 51 : "=&r" (flags), "=r" (ret) : "r" (addr) ); 52 53 return ret; 54} 55 56static inline unsigned int gsc_readl(unsigned long addr) 57{ 58 u32 ret; 59 60 __asm__ __volatile__( 61 " ldwax 0(%1),%0\n" 62 : "=r" (ret) : "r" (addr) ); 63 64 return ret; 65} 66 67static inline unsigned long long gsc_readq(unsigned long addr) 68{ 69 unsigned long long ret; 70 71#ifdef __LP64__ 72 __asm__ __volatile__( 73 " ldda 0(%1),%0\n" 74 : "=r" (ret) : "r" (addr) ); 75#else 76 /* two reads may have side effects.. */ 77 ret = ((u64) gsc_readl(addr)) << 32; 78 ret |= gsc_readl(addr+4); 79#endif 80 return ret; 81} 82 83static inline void gsc_writeb(unsigned char val, unsigned long addr) 84{ 85 long flags; 86 __asm__ __volatile__( 87 " rsm 2,%0\n" 88 " stbs %1,0(%2)\n" 89 " mtsm %0\n" 90 : "=&r" (flags) : "r" (val), "r" (addr) ); 91} 92 93static inline void gsc_writew(unsigned short val, unsigned long addr) 94{ 95 long flags; 96 __asm__ __volatile__( 97 " rsm 2,%0\n" 98 " sths %1,0(%2)\n" 99 " mtsm %0\n" 100 : "=&r" (flags) : "r" (val), "r" (addr) ); 101} 102 103static inline void gsc_writel(unsigned int val, unsigned long addr) 104{ 105 __asm__ __volatile__( 106 " stwas %0,0(%1)\n" 107 : : "r" (val), "r" (addr) ); 108} 109 110static inline void gsc_writeq(unsigned long long val, unsigned long addr) 111{ 112#ifdef __LP64__ 113 __asm__ __volatile__( 114 " stda %0,0(%1)\n" 115 : : "r" (val), "r" (addr) ); 116#else 117 /* two writes may have side effects.. */ 118 gsc_writel(val >> 32, addr); 119 gsc_writel(val, addr+4); 120#endif 121} 122 123/* 124 * The standard PCI ioremap interfaces 125 */ 126 127extern void __iomem * __ioremap(unsigned long offset, unsigned long size, unsigned long flags); 128 129/* Most machines react poorly to I/O-space being cacheable... Instead let's 130 * define ioremap() in terms of ioremap_nocache(). 131 */ 132extern inline void __iomem * ioremap(unsigned long offset, unsigned long size) 133{ 134 return __ioremap(offset, size, _PAGE_NO_CACHE); 135} 136#define ioremap_nocache(off, sz) ioremap((off), (sz)) 137 138extern void iounmap(void __iomem *addr); 139 140static inline unsigned char __raw_readb(const volatile void __iomem *addr) 141{ 142 return (*(volatile unsigned char __force *) (addr)); 143} 144static inline unsigned short __raw_readw(const volatile void __iomem *addr) 145{ 146 return *(volatile unsigned short __force *) addr; 147} 148static inline unsigned int __raw_readl(const volatile void __iomem *addr) 149{ 150 return *(volatile unsigned int __force *) addr; 151} 152static inline unsigned long long __raw_readq(const volatile void __iomem *addr) 153{ 154 return *(volatile unsigned long long __force *) addr; 155} 156 157static inline void __raw_writeb(unsigned char b, volatile void __iomem *addr) 158{ 159 *(volatile unsigned char __force *) addr = b; 160} 161static inline void __raw_writew(unsigned short b, volatile void __iomem *addr) 162{ 163 *(volatile unsigned short __force *) addr = b; 164} 165static inline void __raw_writel(unsigned int b, volatile void __iomem *addr) 166{ 167 *(volatile unsigned int __force *) addr = b; 168} 169static inline void __raw_writeq(unsigned long long b, volatile void __iomem *addr) 170{ 171 *(volatile unsigned long long __force *) addr = b; 172} 173 174/* readb can never be const, so use __fswab instead of le*_to_cpu */ 175#define readb(addr) __raw_readb(addr) 176#define readw(addr) __fswab16(__raw_readw(addr)) 177#define readl(addr) __fswab32(__raw_readl(addr)) 178#define readq(addr) __fswab64(__raw_readq(addr)) 179#define writeb(b, addr) __raw_writeb(b, addr) 180#define writew(b, addr) __raw_writew(cpu_to_le16(b), addr) 181#define writel(b, addr) __raw_writel(cpu_to_le32(b), addr) 182#define writeq(b, addr) __raw_writeq(cpu_to_le64(b), addr) 183 184#define readb_relaxed(addr) readb(addr) 185#define readw_relaxed(addr) readw(addr) 186#define readl_relaxed(addr) readl(addr) 187#define readq_relaxed(addr) readq(addr) 188 189#define mmiowb() do { } while (0) 190 191void memset_io(volatile void __iomem *addr, unsigned char val, int count); 192void memcpy_fromio(void *dst, const volatile void __iomem *src, int count); 193void memcpy_toio(volatile void __iomem *dst, const void *src, int count); 194 195/* 196 * XXX - We don't have csum_partial_copy_fromio() yet, so we cheat here and 197 * just copy it. The net code will then do the checksum later. Presently 198 * only used by some shared memory 8390 Ethernet cards anyway. 199 */ 200 201#define eth_io_copy_and_sum(skb,src,len,unused) \ 202 memcpy_fromio((skb)->data,(src),(len)) 203 204/* Port-space IO */ 205 206#define inb_p inb 207#define inw_p inw 208#define inl_p inl 209#define outb_p outb 210#define outw_p outw 211#define outl_p outl 212 213extern unsigned char eisa_in8(unsigned short port); 214extern unsigned short eisa_in16(unsigned short port); 215extern unsigned int eisa_in32(unsigned short port); 216extern void eisa_out8(unsigned char data, unsigned short port); 217extern void eisa_out16(unsigned short data, unsigned short port); 218extern void eisa_out32(unsigned int data, unsigned short port); 219 220#if defined(CONFIG_PCI) 221extern unsigned char inb(int addr); 222extern unsigned short inw(int addr); 223extern unsigned int inl(int addr); 224 225extern void outb(unsigned char b, int addr); 226extern void outw(unsigned short b, int addr); 227extern void outl(unsigned int b, int addr); 228#elif defined(CONFIG_EISA) 229#define inb eisa_in8 230#define inw eisa_in16 231#define inl eisa_in32 232#define outb eisa_out8 233#define outw eisa_out16 234#define outl eisa_out32 235#else 236static inline char inb(unsigned long addr) 237{ 238 BUG(); 239 return -1; 240} 241 242static inline short inw(unsigned long addr) 243{ 244 BUG(); 245 return -1; 246} 247 248static inline int inl(unsigned long addr) 249{ 250 BUG(); 251 return -1; 252} 253 254#define outb(x, y) BUG() 255#define outw(x, y) BUG() 256#define outl(x, y) BUG() 257#endif 258 259/* 260 * String versions of in/out ops: 261 */ 262extern void insb (unsigned long port, void *dst, unsigned long count); 263extern void insw (unsigned long port, void *dst, unsigned long count); 264extern void insl (unsigned long port, void *dst, unsigned long count); 265extern void outsb (unsigned long port, const void *src, unsigned long count); 266extern void outsw (unsigned long port, const void *src, unsigned long count); 267extern void outsl (unsigned long port, const void *src, unsigned long count); 268 269 270/* IO Port space is : BBiiii where BB is HBA number. */ 271#define IO_SPACE_LIMIT 0x00ffffff 272 273 274#define dma_cache_inv(_start,_size) do { flush_kernel_dcache_range(_start,_size); } while (0) 275#define dma_cache_wback(_start,_size) do { flush_kernel_dcache_range(_start,_size); } while (0) 276#define dma_cache_wback_inv(_start,_size) do { flush_kernel_dcache_range(_start,_size); } while (0) 277 278/* PA machines have an MM I/O space from 0xf0000000-0xffffffff in 32 279 * bit mode and from 0xfffffffff0000000-0xfffffffffffffff in 64 bit 280 * mode (essentially just sign extending. This macro takes in a 32 281 * bit I/O address (still with the leading f) and outputs the correct 282 * value for either 32 or 64 bit mode */ 283#define F_EXTEND(x) ((unsigned long)((x) | (0xffffffff00000000ULL))) 284 285#include <asm-generic/iomap.h> 286 287/* 288 * Convert a physical pointer to a virtual kernel pointer for /dev/mem 289 * access 290 */ 291#define xlate_dev_mem_ptr(p) __va(p) 292 293/* 294 * Convert a virtual cached pointer to an uncached pointer 295 */ 296#define xlate_dev_kmem_ptr(p) p 297 298#endif