|  | @@ -0,0 +1,97 @@
 | 
	
		
			
				|  |  | +#ifndef __ALPHA_APECS__H__
 | 
	
		
			
				|  |  | +#define __ALPHA_APECS__H__
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +#include <linux/types.h>
 | 
	
		
			
				|  |  | +#include <asm/compiler.h>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/*
 | 
	
		
			
				|  |  | + * 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 <asm/dma.h> 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)
 |