/* * 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 #include #undef __EXTERN_INLINE #include #include #include #include #include #include #include #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));