X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=include%2Fasm-alpha%2Fcore_apecs.h;h=6785ff7e02bc464fcd6eeefdea630055f47334aa;hb=c7b5ebbddf7bcd3651947760f423e3783bbe6573;hp=b32084e51c98cdc3d7a456fa9089a93bfdc221e1;hpb=a2c21200f1c81b08cb55e417b68150bba439b646;p=linux-2.6.git diff --git a/include/asm-alpha/core_apecs.h b/include/asm-alpha/core_apecs.h index b32084e51..6785ff7e0 100644 --- a/include/asm-alpha/core_apecs.h +++ b/include/asm-alpha/core_apecs.h @@ -370,178 +370,142 @@ struct el_apecs_procdata * data to/from the right byte-lanes. */ -#define vip volatile int * -#define vuip volatile unsigned int * -#define vulp volatile unsigned long * - -__EXTERN_INLINE u8 apecs_inb(unsigned long addr) +#define vip volatile int __force * +#define vuip volatile unsigned int __force * +#define vulp volatile unsigned long __force * + +#define APECS_SET_HAE \ + do { \ + if (addr >= (1UL << 24)) { \ + unsigned long msb = addr & 0xf8000000; \ + addr -= msb; \ + set_hae(msb); \ + } \ + } while (0) + +__EXTERN_INLINE unsigned int apecs_ioread8(void __iomem *xaddr) { - long result = *(vip) ((addr << 5) + APECS_IO + 0x00); + unsigned long addr = (unsigned long) xaddr; + unsigned long result, base_and_type; + + if (addr >= APECS_DENSE_MEM) { + addr -= APECS_DENSE_MEM; + APECS_SET_HAE; + base_and_type = APECS_SPARSE_MEM + 0x00; + } else { + addr -= APECS_IO; + base_and_type = APECS_IO + 0x00; + } + + result = *(vip) ((addr << 5) + base_and_type); return __kernel_extbl(result, addr & 3); } -__EXTERN_INLINE void apecs_outb(u8 b, unsigned long addr) +__EXTERN_INLINE void apecs_iowrite8(u8 b, void __iomem *xaddr) { - unsigned long w; + unsigned long addr = (unsigned long) xaddr; + unsigned long w, base_and_type; + + if (addr >= APECS_DENSE_MEM) { + addr -= APECS_DENSE_MEM; + APECS_SET_HAE; + base_and_type = APECS_SPARSE_MEM + 0x00; + } else { + addr -= APECS_IO; + base_and_type = APECS_IO + 0x00; + } w = __kernel_insbl(b, addr & 3); - *(vuip) ((addr << 5) + APECS_IO + 0x00) = w; - mb(); -} - -__EXTERN_INLINE u16 apecs_inw(unsigned long addr) -{ - long result = *(vip) ((addr << 5) + APECS_IO + 0x08); - return __kernel_extwl(result, addr & 3); + *(vuip) ((addr << 5) + base_and_type) = w; } -__EXTERN_INLINE void apecs_outw(u16 b, unsigned long addr) -{ - unsigned long w; - - w = __kernel_inswl(b, addr & 3); - *(vuip) ((addr << 5) + APECS_IO + 0x08) = w; - mb(); -} - -__EXTERN_INLINE u32 apecs_inl(unsigned long addr) -{ - return *(vuip) ((addr << 5) + APECS_IO + 0x18); -} - -__EXTERN_INLINE void apecs_outl(u32 b, unsigned long addr) -{ - *(vuip) ((addr << 5) + APECS_IO + 0x18) = b; - mb(); -} - - -/* - * Memory functions. 64-bit and 32-bit accesses are done through - * dense memory space, everything else through sparse space. - */ - -__EXTERN_INLINE u8 apecs_readb(unsigned long addr) +__EXTERN_INLINE unsigned int apecs_ioread16(void __iomem *xaddr) { - unsigned long result, msb; - - addr -= APECS_DENSE_MEM; - if (addr >= (1UL << 24)) { - msb = addr & 0xf8000000; - addr -= msb; - set_hae(msb); + unsigned long addr = (unsigned long) xaddr; + unsigned long result, base_and_type; + + if (addr >= APECS_DENSE_MEM) { + addr -= APECS_DENSE_MEM; + APECS_SET_HAE; + base_and_type = APECS_SPARSE_MEM + 0x08; + } else { + addr -= APECS_IO; + base_and_type = APECS_IO + 0x08; } - result = *(vip) ((addr << 5) + APECS_SPARSE_MEM + 0x00); - return __kernel_extbl(result, addr & 3); -} -__EXTERN_INLINE u16 apecs_readw(unsigned long addr) -{ - unsigned long result, msb; - - addr -= APECS_DENSE_MEM; - if (addr >= (1UL << 24)) { - msb = addr & 0xf8000000; - addr -= msb; - set_hae(msb); - } - result = *(vip) ((addr << 5) + APECS_SPARSE_MEM + 0x08); + result = *(vip) ((addr << 5) + base_and_type); return __kernel_extwl(result, addr & 3); } -__EXTERN_INLINE u32 apecs_readl(unsigned long addr) -{ - return (*(vuip)addr) & 0xffffffff; -} - -__EXTERN_INLINE u64 apecs_readq(unsigned long addr) -{ - return *(vulp)addr; -} - -__EXTERN_INLINE void apecs_writeb(u8 b, unsigned long addr) +__EXTERN_INLINE void apecs_iowrite16(u16 b, void __iomem *xaddr) { - unsigned long msb; - - addr -= APECS_DENSE_MEM; - if (addr >= (1UL << 24)) { - msb = addr & 0xf8000000; - addr -= msb; - set_hae(msb); + unsigned long addr = (unsigned long) xaddr; + unsigned long w, base_and_type; + + if (addr >= APECS_DENSE_MEM) { + addr -= APECS_DENSE_MEM; + APECS_SET_HAE; + base_and_type = APECS_SPARSE_MEM + 0x08; + } else { + addr -= APECS_IO; + base_and_type = APECS_IO + 0x08; } - *(vuip) ((addr << 5) + APECS_SPARSE_MEM + 0x00) = b * 0x01010101; + + w = __kernel_inswl(b, addr & 3); + *(vuip) ((addr << 5) + base_and_type) = w; } -__EXTERN_INLINE void apecs_writew(u16 b, unsigned long addr) +__EXTERN_INLINE unsigned int apecs_ioread32(void __iomem *xaddr) { - unsigned long msb; - - addr -= APECS_DENSE_MEM; - if (addr >= (1UL << 24)) { - msb = addr & 0xf8000000; - addr -= msb; - set_hae(msb); - } - *(vuip) ((addr << 5) + APECS_SPARSE_MEM + 0x08) = b * 0x00010001; + unsigned long addr = (unsigned long) xaddr; + if (addr < APECS_DENSE_MEM) + addr = ((addr - APECS_IO) << 5) + APECS_IO + 0x18; + return *(vuip)addr; } -__EXTERN_INLINE void apecs_writel(u32 b, unsigned long addr) +__EXTERN_INLINE void apecs_iowrite32(u32 b, void __iomem *xaddr) { + unsigned long addr = (unsigned long) xaddr; + if (addr < APECS_DENSE_MEM) + addr = ((addr - APECS_IO) << 5) + APECS_IO + 0x18; *(vuip)addr = b; } -__EXTERN_INLINE void apecs_writeq(u64 b, unsigned long addr) +__EXTERN_INLINE void __iomem *apecs_ioportmap(unsigned long addr) { - *(vulp)addr = b; + return (void __iomem *)(addr + APECS_IO); } -__EXTERN_INLINE unsigned long apecs_ioremap(unsigned long addr, - unsigned long size - __attribute__((unused))) +__EXTERN_INLINE void __iomem *apecs_ioremap(unsigned long addr, + unsigned long size) { - return addr + APECS_DENSE_MEM; + return (void __iomem *)(addr + APECS_DENSE_MEM); } -__EXTERN_INLINE void apecs_iounmap(unsigned long addr) +__EXTERN_INLINE int apecs_is_ioaddr(unsigned long addr) { - return; + return addr >= IDENT_ADDR + 0x180000000UL; } -__EXTERN_INLINE int apecs_is_ioaddr(unsigned long addr) +__EXTERN_INLINE int apecs_is_mmio(const volatile void __iomem *addr) { - return addr >= IDENT_ADDR + 0x180000000UL; + return (unsigned long)addr >= APECS_DENSE_MEM; } +#undef APECS_SET_HAE + #undef vip #undef vuip #undef vulp -#ifdef __WANT_IO_DEF - -#define __inb(p) apecs_inb((unsigned long)(p)) -#define __inw(p) apecs_inw((unsigned long)(p)) -#define __inl(p) apecs_inl((unsigned long)(p)) -#define __outb(x,p) apecs_outb((x),(unsigned long)(p)) -#define __outw(x,p) apecs_outw((x),(unsigned long)(p)) -#define __outl(x,p) apecs_outl((x),(unsigned long)(p)) -#define __readb(a) apecs_readb((unsigned long)(a)) -#define __readw(a) apecs_readw((unsigned long)(a)) -#define __readl(a) apecs_readl((unsigned long)(a)) -#define __readq(a) apecs_readq((unsigned long)(a)) -#define __writeb(x,a) apecs_writeb((x),(unsigned long)(a)) -#define __writew(x,a) apecs_writew((x),(unsigned long)(a)) -#define __writel(x,a) apecs_writel((x),(unsigned long)(a)) -#define __writeq(x,a) apecs_writeq((x),(unsigned long)(a)) -#define __ioremap(a,s) apecs_ioremap((unsigned long)(a),(s)) -#define __iounmap(a) apecs_iounmap((unsigned long)(a)) -#define __is_ioaddr(a) apecs_is_ioaddr((unsigned long)(a)) - -#define __raw_readl(a) __readl(a) -#define __raw_readq(a) __readq(a) -#define __raw_writel(v,a) __writel((v),(a)) -#define __raw_writeq(v,a) __writeq((v),(a)) - -#endif /* __WANT_IO_DEF */ +#undef __IO_PREFIX +#define __IO_PREFIX apecs +#define apecs_trivial_io_bw 0 +#define apecs_trivial_io_lq 0 +#define apecs_trivial_rw_bw 2 +#define apecs_trivial_rw_lq 1 +#define apecs_trivial_iounmap 1 +#include #ifdef __IO_EXTERN_INLINE #undef __EXTERN_INLINE