|
@@ -208,3 +208,170 @@ typedef struct {
|
|
|
union IO7_POx_WBASE {
|
|
|
struct {
|
|
|
unsigned ena : 1; /* <0> */
|
|
|
+ unsigned sg : 1; /* <1> */
|
|
|
+ unsigned dac : 1; /* <2> -- window 3 only */
|
|
|
+ unsigned rsvd1 : 17;
|
|
|
+ unsigned addr : 12; /* <31:20> */
|
|
|
+ unsigned rsvd2 : 32;
|
|
|
+ } bits;
|
|
|
+ unsigned as_long[2];
|
|
|
+ unsigned as_quad;
|
|
|
+};
|
|
|
+
|
|
|
+/*
|
|
|
+ * IO7 IID (Interrupt IDentifier) format
|
|
|
+ *
|
|
|
+ * For level-sensative interrupts, int_num is encoded as:
|
|
|
+ *
|
|
|
+ * bus/port slot/device INTx
|
|
|
+ * <7:5> <4:2> <1:0>
|
|
|
+ */
|
|
|
+union IO7_IID {
|
|
|
+ struct {
|
|
|
+ unsigned int_num : 9; /* <8:0> */
|
|
|
+ unsigned tpu_mask : 4; /* <12:9> rsvd */
|
|
|
+ unsigned msi : 1; /* 13 */
|
|
|
+ unsigned ipe : 10; /* <23:14> */
|
|
|
+ unsigned long rsvd : 40;
|
|
|
+ } bits;
|
|
|
+ unsigned int as_long[2];
|
|
|
+ unsigned long as_quad;
|
|
|
+};
|
|
|
+
|
|
|
+/*
|
|
|
+ * IO7 addressing macros
|
|
|
+ */
|
|
|
+#define IO7_KERN_ADDR(addr) (EV7_KERN_ADDR(addr))
|
|
|
+
|
|
|
+#define IO7_PORT_MASK 0x07UL /* 3 bits of port */
|
|
|
+
|
|
|
+#define IO7_IPE(pe) (EV7_IPE(pe))
|
|
|
+#define IO7_IPORT(port) ((~((long)(port)) & IO7_PORT_MASK) << 32)
|
|
|
+
|
|
|
+#define IO7_HOSE(pe, port) (IO7_IPE(pe) | IO7_IPORT(port))
|
|
|
+
|
|
|
+#define IO7_MEM_PHYS(pe, port) (IO7_HOSE(pe, port) | 0x00000000UL)
|
|
|
+#define IO7_CONF_PHYS(pe, port) (IO7_HOSE(pe, port) | 0xFE000000UL)
|
|
|
+#define IO7_IO_PHYS(pe, port) (IO7_HOSE(pe, port) | 0xFF000000UL)
|
|
|
+#define IO7_CSR_PHYS(pe, port, off) \
|
|
|
+ (IO7_HOSE(pe, port) | 0xFF800000UL | (off))
|
|
|
+#define IO7_CSRS_PHYS(pe, port) (IO7_CSR_PHYS(pe, port, 0UL))
|
|
|
+#define IO7_PORT7_CSRS_PHYS(pe) (IO7_CSR_PHYS(pe, 7, 0x300000UL))
|
|
|
+
|
|
|
+#define IO7_MEM_KERN(pe, port) (IO7_KERN_ADDR(IO7_MEM_PHYS(pe, port)))
|
|
|
+#define IO7_CONF_KERN(pe, port) (IO7_KERN_ADDR(IO7_CONF_PHYS(pe, port)))
|
|
|
+#define IO7_IO_KERN(pe, port) (IO7_KERN_ADDR(IO7_IO_PHYS(pe, port)))
|
|
|
+#define IO7_CSR_KERN(pe, port, off) (IO7_KERN_ADDR(IO7_CSR_PHYS(pe,port,off)))
|
|
|
+#define IO7_CSRS_KERN(pe, port) (IO7_KERN_ADDR(IO7_CSRS_PHYS(pe, port)))
|
|
|
+#define IO7_PORT7_CSRS_KERN(pe) (IO7_KERN_ADDR(IO7_PORT7_CSRS_PHYS(pe)))
|
|
|
+
|
|
|
+#define IO7_PLL_RNGA(pll) (((pll) >> 3) & 0x7)
|
|
|
+#define IO7_PLL_RNGB(pll) (((pll) >> 6) & 0x7)
|
|
|
+
|
|
|
+#define IO7_MEM_SPACE (2UL * 1024 * 1024 * 1024) /* 2GB MEM */
|
|
|
+#define IO7_IO_SPACE (8UL * 1024 * 1024) /* 8MB I/O */
|
|
|
+
|
|
|
+
|
|
|
+/*
|
|
|
+ * Offset between ram physical addresses and pci64 DAC addresses
|
|
|
+ */
|
|
|
+#define IO7_DAC_OFFSET (1UL << 49)
|
|
|
+
|
|
|
+/*
|
|
|
+ * This is needed to satisify the IO() macro used in initializing the machvec
|
|
|
+ */
|
|
|
+#define MARVEL_IACK_SC \
|
|
|
+ ((unsigned long) \
|
|
|
+ (&(((io7_ioport_csrs *)IO7_CSRS_KERN(0, 0))->POx_IACK_SPECIAL)))
|
|
|
+
|
|
|
+#ifdef __KERNEL__
|
|
|
+
|
|
|
+/*
|
|
|
+ * IO7 structs
|
|
|
+ */
|
|
|
+#define IO7_NUM_PORTS 4
|
|
|
+#define IO7_AGP_PORT 3
|
|
|
+
|
|
|
+struct io7_port {
|
|
|
+ struct io7 *io7;
|
|
|
+ struct pci_controller *hose;
|
|
|
+
|
|
|
+ int enabled;
|
|
|
+ unsigned int port;
|
|
|
+ io7_ioport_csrs *csrs;
|
|
|
+
|
|
|
+ unsigned long saved_wbase[4];
|
|
|
+ unsigned long saved_wmask[4];
|
|
|
+ unsigned long saved_tbase[4];
|
|
|
+};
|
|
|
+
|
|
|
+struct io7 {
|
|
|
+ struct io7 *next;
|
|
|
+
|
|
|
+ unsigned int pe;
|
|
|
+ io7_port7_csrs *csrs;
|
|
|
+ struct io7_port ports[IO7_NUM_PORTS];
|
|
|
+
|
|
|
+ spinlock_t irq_lock;
|
|
|
+};
|
|
|
+
|
|
|
+#ifndef __EXTERN_INLINE
|
|
|
+# define __EXTERN_INLINE extern inline
|
|
|
+# define __IO_EXTERN_INLINE
|
|
|
+#endif
|
|
|
+
|
|
|
+/*
|
|
|
+ * I/O functions. All access through linear space.
|
|
|
+ */
|
|
|
+
|
|
|
+/*
|
|
|
+ * Memory functions. All accesses through linear space.
|
|
|
+ */
|
|
|
+
|
|
|
+#define vucp volatile unsigned char __force *
|
|
|
+#define vusp volatile unsigned short __force *
|
|
|
+
|
|
|
+extern unsigned int marvel_ioread8(void __iomem *);
|
|
|
+extern void marvel_iowrite8(u8 b, void __iomem *);
|
|
|
+
|
|
|
+__EXTERN_INLINE unsigned int marvel_ioread16(void __iomem *addr)
|
|
|
+{
|
|
|
+ return __kernel_ldwu(*(vusp)addr);
|
|
|
+}
|
|
|
+
|
|
|
+__EXTERN_INLINE void marvel_iowrite16(u16 b, void __iomem *addr)
|
|
|
+{
|
|
|
+ __kernel_stw(b, *(vusp)addr);
|
|
|
+}
|
|
|
+
|
|
|
+extern void __iomem *marvel_ioremap(unsigned long addr, unsigned long size);
|
|
|
+extern void marvel_iounmap(volatile void __iomem *addr);
|
|
|
+extern void __iomem *marvel_ioportmap (unsigned long addr);
|
|
|
+
|
|
|
+__EXTERN_INLINE int marvel_is_ioaddr(unsigned long addr)
|
|
|
+{
|
|
|
+ return (addr >> 40) & 1;
|
|
|
+}
|
|
|
+
|
|
|
+extern int marvel_is_mmio(const volatile void __iomem *);
|
|
|
+
|
|
|
+#undef vucp
|
|
|
+#undef vusp
|
|
|
+
|
|
|
+#undef __IO_PREFIX
|
|
|
+#define __IO_PREFIX marvel
|
|
|
+#define marvel_trivial_rw_bw 1
|
|
|
+#define marvel_trivial_rw_lq 1
|
|
|
+#define marvel_trivial_io_bw 0
|
|
|
+#define marvel_trivial_io_lq 1
|
|
|
+#define marvel_trivial_iounmap 0
|
|
|
+#include <asm/io_trivial.h>
|
|
|
+
|
|
|
+#ifdef __IO_EXTERN_INLINE
|
|
|
+# undef __EXTERN_INLINE
|
|
|
+# undef __IO_EXTERN_INLINE
|
|
|
+#endif
|
|
|
+
|
|
|
+#endif /* __KERNEL__ */
|
|
|
+
|
|
|
+#endif /* __ALPHA_MARVEL__H__ */
|