|
@@ -0,0 +1,96 @@
|
|
|
+/*
|
|
|
+ * linux/arch/alpha/kernel/core_t2.c
|
|
|
+ *
|
|
|
+ * Written by Jay A Estabrook (jestabro@amt.tay1.dec.com).
|
|
|
+ * December 1996.
|
|
|
+ *
|
|
|
+ * based on CIA code by David A Rusling (david.rusling@reo.mts.dec.com)
|
|
|
+ *
|
|
|
+ * Code common to all T2 core logic chips.
|
|
|
+ */
|
|
|
+
|
|
|
+#define __EXTERN_INLINE
|
|
|
+#include <asm/io.h>
|
|
|
+#include <asm/core_t2.h>
|
|
|
+#undef __EXTERN_INLINE
|
|
|
+
|
|
|
+#include <linux/types.h>
|
|
|
+#include <linux/pci.h>
|
|
|
+#include <linux/sched.h>
|
|
|
+#include <linux/init.h>
|
|
|
+
|
|
|
+#include <asm/ptrace.h>
|
|
|
+#include <asm/delay.h>
|
|
|
+#include <asm/mce.h>
|
|
|
+
|
|
|
+#include "proto.h"
|
|
|
+#include "pci_impl.h"
|
|
|
+
|
|
|
+/* For dumping initial DMA window settings. */
|
|
|
+#define DEBUG_PRINT_INITIAL_SETTINGS 0
|
|
|
+
|
|
|
+/* For dumping final DMA window settings. */
|
|
|
+#define DEBUG_PRINT_FINAL_SETTINGS 0
|
|
|
+
|
|
|
+/*
|
|
|
+ * By default, we direct-map starting at 2GB, in order to allow the
|
|
|
+ * maximum size direct-map window (2GB) to match the maximum amount of
|
|
|
+ * memory (2GB) that can be present on SABLEs. But that limits the
|
|
|
+ * floppy to DMA only via the scatter/gather window set up for 8MB
|
|
|
+ * ISA DMA, since the maximum ISA DMA address is 2GB-1.
|
|
|
+ *
|
|
|
+ * For now, this seems a reasonable trade-off: even though most SABLEs
|
|
|
+ * have less than 1GB of memory, floppy usage/performance will not
|
|
|
+ * really be affected by forcing it to go via scatter/gather...
|
|
|
+ */
|
|
|
+#define T2_DIRECTMAP_2G 1
|
|
|
+
|
|
|
+#if T2_DIRECTMAP_2G
|
|
|
+# define T2_DIRECTMAP_START 0x80000000UL
|
|
|
+# define T2_DIRECTMAP_LENGTH 0x80000000UL
|
|
|
+#else
|
|
|
+# define T2_DIRECTMAP_START 0x40000000UL
|
|
|
+# define T2_DIRECTMAP_LENGTH 0x40000000UL
|
|
|
+#endif
|
|
|
+
|
|
|
+/* The ISA scatter/gather window settings. */
|
|
|
+#define T2_ISA_SG_START 0x00800000UL
|
|
|
+#define T2_ISA_SG_LENGTH 0x00800000UL
|
|
|
+
|
|
|
+/*
|
|
|
+ * NOTE: Herein lie back-to-back mb instructions. They are magic.
|
|
|
+ * One plausible explanation is that the i/o controller does not properly
|
|
|
+ * handle the system transaction. Another involves timing. Ho hum.
|
|
|
+ */
|
|
|
+
|
|
|
+/*
|
|
|
+ * BIOS32-style PCI interface:
|
|
|
+ */
|
|
|
+
|
|
|
+#define DEBUG_CONFIG 0
|
|
|
+
|
|
|
+#if DEBUG_CONFIG
|
|
|
+# define DBG(args) printk args
|
|
|
+#else
|
|
|
+# define DBG(args)
|
|
|
+#endif
|
|
|
+
|
|
|
+static volatile unsigned int t2_mcheck_any_expected;
|
|
|
+static volatile unsigned int t2_mcheck_last_taken;
|
|
|
+
|
|
|
+/* Place to save the DMA Window registers as set up by SRM
|
|
|
+ for restoration during shutdown. */
|
|
|
+static struct
|
|
|
+{
|
|
|
+ struct {
|
|
|
+ unsigned long wbase;
|
|
|
+ unsigned long wmask;
|
|
|
+ unsigned long tbase;
|
|
|
+ } window[2];
|
|
|
+ unsigned long hae_1;
|
|
|
+ unsigned long hae_2;
|
|
|
+ unsigned long hae_3;
|
|
|
+ unsigned long hae_4;
|
|
|
+ unsigned long hbase;
|
|
|
+} t2_saved_config __attribute((common));
|
|
|
+
|