| /* | 
 |  * include/asm-xtensa/fixmap.h | 
 |  * | 
 |  * This file is subject to the terms and conditions of the GNU General Public | 
 |  * License.  See the file "COPYING" in the main directory of this archive | 
 |  * for more details. | 
 |  * | 
 |  * Copyright (C) 2001 - 2005 Tensilica Inc. | 
 |  */ | 
 |  | 
 | #ifndef _XTENSA_FIXMAP_H | 
 | #define _XTENSA_FIXMAP_H | 
 |  | 
 | #include <asm/processor.h> | 
 |  | 
 | #ifdef CONFIG_MMU | 
 |  | 
 | /* | 
 |  * Here we define all the compile-time virtual addresses. | 
 |  */ | 
 |  | 
 | #if XCHAL_SEG_MAPPABLE_VADDR != 0 | 
 | # error "Current port requires virtual user space starting at 0" | 
 | #endif | 
 | #if XCHAL_SEG_MAPPABLE_SIZE < 0x80000000 | 
 | # error "Current port requires at least 0x8000000 bytes for user space" | 
 | #endif | 
 |  | 
 | /* Verify instruction/data ram/rom and xlmi don't overlay vmalloc space. */ | 
 |  | 
 | #define __IN_VMALLOC(addr)						\ | 
 | 	(((addr) >= VMALLOC_START) && ((addr) < VMALLOC_END)) | 
 | #define __SPAN_VMALLOC(start,end)					\ | 
 | 	(((start) < VMALLOC_START) && ((end) >= VMALLOC_END)) | 
 | #define INSIDE_VMALLOC(start,end) 					\ | 
 | 	(__IN_VMALLOC((start)) || __IN_VMALLOC(end) || __SPAN_VMALLOC((start),(end))) | 
 |  | 
 | #if XCHAL_NUM_INSTROM | 
 | # if XCHAL_NUM_INSTROM == 1 | 
 | #  if INSIDE_VMALLOC(XCHAL_INSTROM0_VADDR,XCHAL_INSTROM0_VADDR+XCHAL_INSTROM0_SIZE) | 
 | #   error vmalloc range conflicts with instrom0 | 
 | #  endif | 
 | # endif | 
 | # if XCHAL_NUM_INSTROM == 2 | 
 | #  if INSIDE_VMALLOC(XCHAL_INSTROM1_VADDR,XCHAL_INSTROM1_VADDR+XCHAL_INSTROM1_SIZE) | 
 | #   error vmalloc range conflicts with instrom1 | 
 | #  endif | 
 | # endif | 
 | #endif | 
 |  | 
 | #if XCHAL_NUM_INSTRAM | 
 | # if XCHAL_NUM_INSTRAM == 1 | 
 | #  if INSIDE_VMALLOC(XCHAL_INSTRAM0_VADDR,XCHAL_INSTRAM0_VADDR+XCHAL_INSTRAM0_SIZE) | 
 | #   error vmalloc range conflicts with instram0 | 
 | #  endif | 
 | # endif | 
 | # if XCHAL_NUM_INSTRAM == 2 | 
 | #  if INSIDE_VMALLOC(XCHAL_INSTRAM1_VADDR,XCHAL_INSTRAM1_VADDR+XCHAL_INSTRAM1_SIZE) | 
 | #   error vmalloc range conflicts with instram1 | 
 | #  endif | 
 | # endif | 
 | #endif | 
 |  | 
 | #if XCHAL_NUM_DATAROM | 
 | # if XCHAL_NUM_DATAROM == 1 | 
 | #  if INSIDE_VMALLOC(XCHAL_DATAROM0_VADDR,XCHAL_DATAROM0_VADDR+XCHAL_DATAROM0_SIZE) | 
 | #   error vmalloc range conflicts with datarom0 | 
 | #  endif | 
 | # endif | 
 | # if XCHAL_NUM_DATAROM == 2 | 
 | #  if INSIDE_VMALLOC(XCHAL_DATAROM1_VADDR,XCHAL_DATAROM1_VADDR+XCHAL_DATAROM1_SIZE) | 
 | #   error vmalloc range conflicts with datarom1 | 
 | #  endif | 
 | # endif | 
 | #endif | 
 |  | 
 | #if XCHAL_NUM_DATARAM | 
 | # if XCHAL_NUM_DATARAM == 1 | 
 | #  if INSIDE_VMALLOC(XCHAL_DATARAM0_VADDR,XCHAL_DATARAM0_VADDR+XCHAL_DATARAM0_SIZE) | 
 | #   error vmalloc range conflicts with dataram0 | 
 | #  endif | 
 | # endif | 
 | # if XCHAL_NUM_DATARAM == 2 | 
 | #  if INSIDE_VMALLOC(XCHAL_DATARAM1_VADDR,XCHAL_DATARAM1_VADDR+XCHAL_DATARAM1_SIZE) | 
 | #   error vmalloc range conflicts with dataram1 | 
 | #  endif | 
 | # endif | 
 | #endif | 
 |  | 
 | #if XCHAL_NUM_XLMI | 
 | # if XCHAL_NUM_XLMI == 1 | 
 | #  if INSIDE_VMALLOC(XCHAL_XLMI0_VADDR,XCHAL_XLMI0_VADDR+XCHAL_XLMI0_SIZE) | 
 | #   error vmalloc range conflicts with xlmi0 | 
 | #  endif | 
 | # endif | 
 | # if XCHAL_NUM_XLMI == 2 | 
 | #  if INSIDE_VMALLOC(XCHAL_XLMI1_VADDR,XCHAL_XLMI1_VADDR+XCHAL_XLMI1_SIZE) | 
 | #   error vmalloc range conflicts with xlmi1 | 
 | #  endif | 
 | # endif | 
 | #endif | 
 |  | 
 | #if (XCHAL_NUM_INSTROM > 2) || \ | 
 |     (XCHAL_NUM_INSTRAM > 2) || \ | 
 |     (XCHAL_NUM_DATARAM > 2) || \ | 
 |     (XCHAL_NUM_DATAROM > 2) || \ | 
 |     (XCHAL_NUM_XLMI    > 2) | 
 | # error Insufficient checks on vmalloc above for more than 2 devices | 
 | #endif | 
 |  | 
 | /* | 
 |  * USER_VM_SIZE does not necessarily equal TASK_SIZE.  We bumped | 
 |  * TASK_SIZE down to 0x4000000 to simplify the handling of windowed | 
 |  * call instructions (currently limited to a range of 1 GByte).  User | 
 |  * tasks may very well reclaim the VM space from 0x40000000 to | 
 |  * 0x7fffffff in the future, so we do not want the kernel becoming | 
 |  * accustomed to having any of its stuff (e.g., page tables) in this | 
 |  * region.  This VM region is no-man's land for now. | 
 |  */ | 
 |  | 
 | #define USER_VM_START		XCHAL_SEG_MAPPABLE_VADDR | 
 | #define USER_VM_SIZE		0x80000000 | 
 |  | 
 | /*  Size of page table:  */ | 
 |  | 
 | #define PGTABLE_SIZE_BITS	(32 - XCHAL_MMU_MIN_PTE_PAGE_SIZE + 2) | 
 | #define PGTABLE_SIZE		(1L << PGTABLE_SIZE_BITS) | 
 |  | 
 | /*  All kernel-mappable space:  */ | 
 |  | 
 | #define KERNEL_ALLMAP_START	(USER_VM_START + USER_VM_SIZE) | 
 | #define KERNEL_ALLMAP_SIZE	(XCHAL_SEG_MAPPABLE_SIZE - KERNEL_ALLMAP_START) | 
 |  | 
 | /*  Carve out page table at start of kernel-mappable area:  */ | 
 |  | 
 | #if KERNEL_ALLMAP_SIZE < PGTABLE_SIZE | 
 | #error "Gimme some space for page table!" | 
 | #endif | 
 | #define PGTABLE_START		KERNEL_ALLMAP_START | 
 |  | 
 | /*  Remaining kernel-mappable space:  */ | 
 |  | 
 | #define KERNEL_MAPPED_START	(KERNEL_ALLMAP_START + PGTABLE_SIZE) | 
 | #define KERNEL_MAPPED_SIZE	(KERNEL_ALLMAP_SIZE - PGTABLE_SIZE) | 
 |  | 
 | #if KERNEL_MAPPED_SIZE < 0x01000000	/* 16 MB is arbitrary for now */ | 
 | # error "Shouldn't the kernel have at least *some* mappable space?" | 
 | #endif | 
 |  | 
 | #define MAX_LOW_MEMORY		XCHAL_KSEG_CACHED_SIZE | 
 |  | 
 | #endif | 
 |  | 
 | /* | 
 |  *  Some constants used elsewhere, but perhaps only in Xtensa header | 
 |  *  files, so maybe we can get rid of some and access compile-time HAL | 
 |  *  directly... | 
 |  * | 
 |  *  Note:  We assume that system RAM is located at the very start of the | 
 |  *  	   kernel segments !! | 
 |  */ | 
 | #define KERNEL_VM_LOW           XCHAL_KSEG_CACHED_VADDR | 
 | #define KERNEL_VM_HIGH          XCHAL_KSEG_BYPASS_VADDR | 
 | #define KERNEL_SPACE            XCHAL_KSEG_CACHED_VADDR | 
 |  | 
 | /* | 
 |  * Returns the physical/virtual addresses of the kernel space | 
 |  * (works with the cached kernel segment only, which is the | 
 |  *  one normally used for kernel operation). | 
 |  */ | 
 |  | 
 | /*			PHYSICAL	BYPASS		CACHED | 
 |  * | 
 |  *  bypass vaddr	bypass paddr	*		cached vaddr | 
 |  *  cached vaddr	cached paddr	bypass vaddr	* | 
 |  *  bypass paddr	*		bypass vaddr	cached vaddr | 
 |  *  cached paddr	*		bypass vaddr	cached vaddr | 
 |  *  other		*		*		* | 
 |  */ | 
 |  | 
 | #define PHYSADDR(a)							      \ | 
 | (((unsigned)(a) >= XCHAL_KSEG_BYPASS_VADDR				      \ | 
 |   && (unsigned)(a) < XCHAL_KSEG_BYPASS_VADDR + XCHAL_KSEG_BYPASS_SIZE) ?      \ | 
 |     (unsigned)(a) - XCHAL_KSEG_BYPASS_VADDR + XCHAL_KSEG_BYPASS_PADDR :       \ | 
 |     ((unsigned)(a) >= XCHAL_KSEG_CACHED_VADDR				      \ | 
 |      && (unsigned)(a) < XCHAL_KSEG_CACHED_VADDR + XCHAL_KSEG_CACHED_SIZE) ?   \ | 
 |         (unsigned)(a) - XCHAL_KSEG_CACHED_VADDR + XCHAL_KSEG_CACHED_PADDR :   \ | 
 | 	(unsigned)(a)) | 
 |  | 
 | #define BYPASS_ADDR(a)							      \ | 
 | (((unsigned)(a) >= XCHAL_KSEG_BYPASS_PADDR				      \ | 
 |   && (unsigned)(a) < XCHAL_KSEG_BYPASS_PADDR + XCHAL_KSEG_BYPASS_SIZE) ?      \ | 
 |     (unsigned)(a) - XCHAL_KSEG_BYPASS_PADDR + XCHAL_KSEG_BYPASS_VADDR :       \ | 
 |     ((unsigned)(a) >= XCHAL_KSEG_CACHED_PADDR				      \ | 
 |      && (unsigned)(a) < XCHAL_KSEG_CACHED_PADDR + XCHAL_KSEG_CACHED_SIZE) ?   \ | 
 |         (unsigned)(a) - XCHAL_KSEG_CACHED_PADDR + XCHAL_KSEG_BYPASS_VADDR :   \ | 
 |         ((unsigned)(a) >= XCHAL_KSEG_CACHED_VADDR			      \ | 
 |          && (unsigned)(a) < XCHAL_KSEG_CACHED_VADDR+XCHAL_KSEG_CACHED_SIZE)?  \ | 
 |             (unsigned)(a) - XCHAL_KSEG_CACHED_VADDR+XCHAL_KSEG_BYPASS_VADDR:  \ | 
 | 	    (unsigned)(a)) | 
 |  | 
 | #define CACHED_ADDR(a)							      \ | 
 | (((unsigned)(a) >= XCHAL_KSEG_BYPASS_PADDR				      \ | 
 |   && (unsigned)(a) < XCHAL_KSEG_BYPASS_PADDR + XCHAL_KSEG_BYPASS_SIZE) ?      \ | 
 |     (unsigned)(a) - XCHAL_KSEG_BYPASS_PADDR + XCHAL_KSEG_CACHED_VADDR :       \ | 
 |     ((unsigned)(a) >= XCHAL_KSEG_CACHED_PADDR			              \ | 
 |      && (unsigned)(a) < XCHAL_KSEG_CACHED_PADDR + XCHAL_KSEG_CACHED_SIZE) ?   \ | 
 |         (unsigned)(a) - XCHAL_KSEG_CACHED_PADDR + XCHAL_KSEG_CACHED_VADDR :   \ | 
 |         ((unsigned)(a) >= XCHAL_KSEG_BYPASS_VADDR			      \ | 
 |          && (unsigned)(a) < XCHAL_KSEG_BYPASS_VADDR+XCHAL_KSEG_BYPASS_SIZE) ? \ | 
 |             (unsigned)(a) - XCHAL_KSEG_BYPASS_VADDR+XCHAL_KSEG_CACHED_VADDR : \ | 
 | 	    (unsigned)(a)) | 
 |  | 
 | #define PHYSADDR_IO(a)							      \ | 
 | (((unsigned)(a) >= XCHAL_KIO_BYPASS_VADDR				      \ | 
 |   && (unsigned)(a) < XCHAL_KIO_BYPASS_VADDR + XCHAL_KIO_BYPASS_SIZE) ?	      \ | 
 |     (unsigned)(a) - XCHAL_KIO_BYPASS_VADDR + XCHAL_KIO_BYPASS_PADDR :	      \ | 
 |     ((unsigned)(a) >= XCHAL_KIO_CACHED_VADDR				      \ | 
 |      && (unsigned)(a) < XCHAL_KIO_CACHED_VADDR + XCHAL_KIO_CACHED_SIZE) ?     \ | 
 |         (unsigned)(a) - XCHAL_KIO_CACHED_VADDR + XCHAL_KIO_CACHED_PADDR :     \ | 
 | 	(unsigned)(a)) | 
 |  | 
 | #define BYPASS_ADDR_IO(a)						      \ | 
 | (((unsigned)(a) >= XCHAL_KIO_BYPASS_PADDR				      \ | 
 |   && (unsigned)(a) < XCHAL_KIO_BYPASS_PADDR + XCHAL_KIO_BYPASS_SIZE) ?	      \ | 
 |     (unsigned)(a) - XCHAL_KIO_BYPASS_PADDR + XCHAL_KIO_BYPASS_VADDR :	      \ | 
 |     ((unsigned)(a) >= XCHAL_KIO_CACHED_PADDR				      \ | 
 |      && (unsigned)(a) < XCHAL_KIO_CACHED_PADDR + XCHAL_KIO_CACHED_SIZE) ?     \ | 
 |         (unsigned)(a) - XCHAL_KIO_CACHED_PADDR + XCHAL_KIO_BYPASS_VADDR :     \ | 
 |         ((unsigned)(a) >= XCHAL_KIO_CACHED_VADDR			      \ | 
 |          && (unsigned)(a) < XCHAL_KIO_CACHED_VADDR + XCHAL_KIO_CACHED_SIZE) ? \ | 
 |             (unsigned)(a) - XCHAL_KIO_CACHED_VADDR + XCHAL_KIO_BYPASS_VADDR : \ | 
 | 	    (unsigned)(a)) | 
 |  | 
 | #define CACHED_ADDR_IO(a)						      \ | 
 | (((unsigned)(a) >= XCHAL_KIO_BYPASS_PADDR				      \ | 
 |   && (unsigned)(a) < XCHAL_KIO_BYPASS_PADDR + XCHAL_KIO_BYPASS_SIZE) ?	      \ | 
 |     (unsigned)(a) - XCHAL_KIO_BYPASS_PADDR + XCHAL_KIO_CACHED_VADDR :	      \ | 
 |     ((unsigned)(a) >= XCHAL_KIO_CACHED_PADDR				      \ | 
 |      && (unsigned)(a) < XCHAL_KIO_CACHED_PADDR + XCHAL_KIO_CACHED_SIZE) ?     \ | 
 |         (unsigned)(a) - XCHAL_KIO_CACHED_PADDR + XCHAL_KIO_CACHED_VADDR :     \ | 
 |         ((unsigned)(a) >= XCHAL_KIO_BYPASS_VADDR			      \ | 
 |          && (unsigned)(a) < XCHAL_KIO_BYPASS_VADDR + XCHAL_KIO_BYPASS_SIZE) ? \ | 
 |             (unsigned)(a) - XCHAL_KIO_BYPASS_VADDR + XCHAL_KIO_CACHED_VADDR : \ | 
 | 	    (unsigned)(a)) | 
 |  | 
 | #endif /* _XTENSA_ADDRSPACE_H */ | 
 |  | 
 |  | 
 |  | 
 |  | 
 |  |