|
@@ -233,3 +233,149 @@ struct el_MCPCIA_uncorrected_frame_mcheck {
|
|
*
|
|
*
|
|
* ZZ = SBZ
|
|
* ZZ = SBZ
|
|
* BB = Byte offset
|
|
* BB = Byte offset
|
|
|
|
+ * LL = Transfer length
|
|
|
|
+ *
|
|
|
|
+ * PCI Address:
|
|
|
|
+ *
|
|
|
|
+ * 3 2 1
|
|
|
|
+ * 10987654321098765432109876543210
|
|
|
|
+ * HHH....PCI.QW.Address........ 00
|
|
|
|
+ *
|
|
|
|
+ * HHH = 31:29 HAE_MEM CSR
|
|
|
|
+ *
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+#define vip volatile int __force *
|
|
|
|
+#define vuip volatile unsigned int __force *
|
|
|
|
+
|
|
|
|
+#ifndef MCPCIA_ONE_HAE_WINDOW
|
|
|
|
+#define MCPCIA_FROB_MMIO \
|
|
|
|
+ if (__mcpcia_is_mmio(hose)) { \
|
|
|
|
+ set_hae(hose & 0xffffffff); \
|
|
|
|
+ hose = hose - MCPCIA_DENSE(4) + MCPCIA_SPARSE(4); \
|
|
|
|
+ }
|
|
|
|
+#else
|
|
|
|
+#define MCPCIA_FROB_MMIO \
|
|
|
|
+ if (__mcpcia_is_mmio(hose)) { \
|
|
|
|
+ hose = hose - MCPCIA_DENSE(4) + MCPCIA_SPARSE(4); \
|
|
|
|
+ }
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+extern inline int __mcpcia_is_mmio(unsigned long addr)
|
|
|
|
+{
|
|
|
|
+ return (addr & 0x80000000UL) == 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+__EXTERN_INLINE unsigned int mcpcia_ioread8(void __iomem *xaddr)
|
|
|
|
+{
|
|
|
|
+ unsigned long addr = (unsigned long)xaddr & MCPCIA_MEM_MASK;
|
|
|
|
+ unsigned long hose = (unsigned long)xaddr & ~MCPCIA_MEM_MASK;
|
|
|
|
+ unsigned long result;
|
|
|
|
+
|
|
|
|
+ MCPCIA_FROB_MMIO;
|
|
|
|
+
|
|
|
|
+ result = *(vip) ((addr << 5) + hose + 0x00);
|
|
|
|
+ return __kernel_extbl(result, addr & 3);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+__EXTERN_INLINE void mcpcia_iowrite8(u8 b, void __iomem *xaddr)
|
|
|
|
+{
|
|
|
|
+ unsigned long addr = (unsigned long)xaddr & MCPCIA_MEM_MASK;
|
|
|
|
+ unsigned long hose = (unsigned long)xaddr & ~MCPCIA_MEM_MASK;
|
|
|
|
+ unsigned long w;
|
|
|
|
+
|
|
|
|
+ MCPCIA_FROB_MMIO;
|
|
|
|
+
|
|
|
|
+ w = __kernel_insbl(b, addr & 3);
|
|
|
|
+ *(vuip) ((addr << 5) + hose + 0x00) = w;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+__EXTERN_INLINE unsigned int mcpcia_ioread16(void __iomem *xaddr)
|
|
|
|
+{
|
|
|
|
+ unsigned long addr = (unsigned long)xaddr & MCPCIA_MEM_MASK;
|
|
|
|
+ unsigned long hose = (unsigned long)xaddr & ~MCPCIA_MEM_MASK;
|
|
|
|
+ unsigned long result;
|
|
|
|
+
|
|
|
|
+ MCPCIA_FROB_MMIO;
|
|
|
|
+
|
|
|
|
+ result = *(vip) ((addr << 5) + hose + 0x08);
|
|
|
|
+ return __kernel_extwl(result, addr & 3);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+__EXTERN_INLINE void mcpcia_iowrite16(u16 b, void __iomem *xaddr)
|
|
|
|
+{
|
|
|
|
+ unsigned long addr = (unsigned long)xaddr & MCPCIA_MEM_MASK;
|
|
|
|
+ unsigned long hose = (unsigned long)xaddr & ~MCPCIA_MEM_MASK;
|
|
|
|
+ unsigned long w;
|
|
|
|
+
|
|
|
|
+ MCPCIA_FROB_MMIO;
|
|
|
|
+
|
|
|
|
+ w = __kernel_inswl(b, addr & 3);
|
|
|
|
+ *(vuip) ((addr << 5) + hose + 0x08) = w;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+__EXTERN_INLINE unsigned int mcpcia_ioread32(void __iomem *xaddr)
|
|
|
|
+{
|
|
|
|
+ unsigned long addr = (unsigned long)xaddr;
|
|
|
|
+
|
|
|
|
+ if (!__mcpcia_is_mmio(addr))
|
|
|
|
+ addr = ((addr & 0xffff) << 5) + (addr & ~0xfffful) + 0x18;
|
|
|
|
+
|
|
|
|
+ return *(vuip)addr;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+__EXTERN_INLINE void mcpcia_iowrite32(u32 b, void __iomem *xaddr)
|
|
|
|
+{
|
|
|
|
+ unsigned long addr = (unsigned long)xaddr;
|
|
|
|
+
|
|
|
|
+ if (!__mcpcia_is_mmio(addr))
|
|
|
|
+ addr = ((addr & 0xffff) << 5) + (addr & ~0xfffful) + 0x18;
|
|
|
|
+
|
|
|
|
+ *(vuip)addr = b;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+__EXTERN_INLINE void __iomem *mcpcia_ioportmap(unsigned long addr)
|
|
|
|
+{
|
|
|
|
+ return (void __iomem *)(addr + MCPCIA_IO_BIAS);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+__EXTERN_INLINE void __iomem *mcpcia_ioremap(unsigned long addr,
|
|
|
|
+ unsigned long size)
|
|
|
|
+{
|
|
|
|
+ return (void __iomem *)(addr + MCPCIA_MEM_BIAS);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+__EXTERN_INLINE int mcpcia_is_ioaddr(unsigned long addr)
|
|
|
|
+{
|
|
|
|
+ return addr >= MCPCIA_SPARSE(0);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+__EXTERN_INLINE int mcpcia_is_mmio(const volatile void __iomem *xaddr)
|
|
|
|
+{
|
|
|
|
+ unsigned long addr = (unsigned long) xaddr;
|
|
|
|
+ return __mcpcia_is_mmio(addr);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+#undef MCPCIA_FROB_MMIO
|
|
|
|
+
|
|
|
|
+#undef vip
|
|
|
|
+#undef vuip
|
|
|
|
+
|
|
|
|
+#undef __IO_PREFIX
|
|
|
|
+#define __IO_PREFIX mcpcia
|
|
|
|
+#define mcpcia_trivial_rw_bw 2
|
|
|
|
+#define mcpcia_trivial_rw_lq 1
|
|
|
|
+#define mcpcia_trivial_io_bw 0
|
|
|
|
+#define mcpcia_trivial_io_lq 0
|
|
|
|
+#define mcpcia_trivial_iounmap 1
|
|
|
|
+#include <asm/io_trivial.h>
|
|
|
|
+
|
|
|
|
+#ifdef __IO_EXTERN_INLINE
|
|
|
|
+#undef __EXTERN_INLINE
|
|
|
|
+#undef __IO_EXTERN_INLINE
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+#endif /* __KERNEL__ */
|
|
|
|
+
|
|
|
|
+#endif /* __ALPHA_MCPCIA__H__ */
|