#ifndef __ALPHA_APECS__H__ #define __ALPHA_APECS__H__ #include #include /* * APECS is the internal name for the 2107x chipset which provides * memory controller and PCI access for the 21064 chip based systems. * * This file is based on: * * DECchip 21071-AA and DECchip 21072-AA Core Logic Chipsets * Data Sheet * * EC-N0648-72 * * * david.rusling@reo.mts.dec.com Initial Version. * */ /* An AVANTI *might* be an XL, and an XL has only 27 bits of ISA address that get passed through the PCI<->ISA bridge chip. So we've gotta use both windows to max out the physical memory we can DMA to. Sigh... If we try a window at 0 for 1GB as a work-around, we run into conflicts with ISA/PCI bus memory which can't be relocated, like VGA aperture and BIOS ROMs. So we must put the windows high enough to avoid these areas. We put window 1 at BUS 64Mb for 64Mb, mapping physical 0 to 64Mb-1, and window 2 at BUS 1Gb for 1Gb, mapping physical 0 to 1Gb-1. Yes, this does map 0 to 64Mb-1 twice, but only window 1 will actually be used for that range (via virt_to_bus()). Note that we actually fudge the window 1 maximum as 48Mb instead of 64Mb, to keep virt_to_bus() from returning an address in the first window, for a data area that goes beyond the 64Mb first DMA window. Sigh... The fudge factor MUST match with MAX_DMA_ADDRESS, but we can't just use that here, because of header file looping... :-( Window 1 will be used for all DMA from the ISA bus; yes, that does limit what memory an ISA floppy or sound card or Ethernet can touch, but it's also a known limitation on other platforms as well. We use the same technique that is used on INTEL platforms with similar limitation: set MAX_DMA_ADDRESS and clear some pages' DMAable flags during mem_init(). We trust that any ISA bus device drivers will *always* ask for DMAable memory explicitly via kmalloc()/get_free_pages() flags arguments. Note that most PCI bus devices' drivers do *not* explicitly ask for DMAable memory; they count on being able to DMA to any memory they get from kmalloc()/get_free_pages(). They will also use window 1 for any physical memory accesses below 64Mb; the rest will be handled by window 2, maxing out at 1Gb of memory. I trust this is enough... :-) We hope that the area before the first window is large enough so that there will be no overlap at the top end (64Mb). We *must* locate the PCI cards' memory just below window 1, so that there's still the possibility of being able to access it via SPARSE space. This is important for cards such as the Matrox Millennium, whose Xserver wants to access memory-mapped registers in byte and short lengths. Note that the XL is treated differently from the AVANTI, even though for most other things they are identical. It didn't seem reasonable to make the AVANTI support pay for the limitations of the XL. It is true, however, that an XL kernel will run on an AVANTI without problems. %%% All of this should be obviated by the ability to route everything through the iommu. */ /* * 21071-DA Control and Status registers. * These are used for PCI memory access. */ #define APECS_IOC_DCSR (IDENT_ADDR + 0x1A0000000UL) #define APECS_IOC_PEAR (IDENT_ADDR + 0x1A0000020UL) #define APECS_IOC_SEAR (IDENT_ADDR + 0x1A0000040UL) #define APECS_IOC_DR1 (IDENT_ADDR + 0x1A0000060UL) #define APECS_IOC_DR2 (IDENT_ADDR + 0x1A0000080UL) #define APECS_IOC_DR3 (IDENT_ADDR + 0x1A00000A0UL) #define APECS_IOC_TB1R (IDENT_ADDR + 0x1A00000C0UL) #define APECS_IOC_TB2R (IDENT_ADDR + 0x1A00000E0UL) #define APECS_IOC_PB1R (IDENT_ADDR + 0x1A0000100UL) #define APECS_IOC_PB2R (IDENT_ADDR + 0x1A0000120UL) #define APECS_IOC_PM1R (IDENT_ADDR + 0x1A0000140UL) #define APECS_IOC_PM2R (IDENT_ADDR + 0x1A0000160UL) #define APECS_IOC_HAXR0 (IDENT_ADDR + 0x1A0000180UL) #define APECS_IOC_HAXR1 (IDENT_ADDR + 0x1A00001A0UL) #define APECS_IOC_HAXR2 (IDENT_ADDR + 0x1A00001C0UL) #define APECS_IOC_PMLT (IDENT_ADDR + 0x1A00001E0UL)