at v2.6.16-rc2 252 lines 9.3 kB view raw
1/* 2 * include/asm-xtensa/fixmap.h 3 * 4 * This file is subject to the terms and conditions of the GNU General Public 5 * License. See the file "COPYING" in the main directory of this archive 6 * for more details. 7 * 8 * Copyright (C) 2001 - 2005 Tensilica Inc. 9 */ 10 11#ifndef _XTENSA_FIXMAP_H 12#define _XTENSA_FIXMAP_H 13 14#include <asm/processor.h> 15 16#ifdef CONFIG_MMU 17 18/* 19 * Here we define all the compile-time virtual addresses. 20 */ 21 22#if XCHAL_SEG_MAPPABLE_VADDR != 0 23# error "Current port requires virtual user space starting at 0" 24#endif 25#if XCHAL_SEG_MAPPABLE_SIZE < 0x80000000 26# error "Current port requires at least 0x8000000 bytes for user space" 27#endif 28 29/* Verify instruction/data ram/rom and xlmi don't overlay vmalloc space. */ 30 31#define __IN_VMALLOC(addr) \ 32 (((addr) >= VMALLOC_START) && ((addr) < VMALLOC_END)) 33#define __SPAN_VMALLOC(start,end) \ 34 (((start) < VMALLOC_START) && ((end) >= VMALLOC_END)) 35#define INSIDE_VMALLOC(start,end) \ 36 (__IN_VMALLOC((start)) || __IN_VMALLOC(end) || __SPAN_VMALLOC((start),(end))) 37 38#if XCHAL_NUM_INSTROM 39# if XCHAL_NUM_INSTROM == 1 40# if INSIDE_VMALLOC(XCHAL_INSTROM0_VADDR,XCHAL_INSTROM0_VADDR+XCHAL_INSTROM0_SIZE) 41# error vmalloc range conflicts with instrom0 42# endif 43# endif 44# if XCHAL_NUM_INSTROM == 2 45# if INSIDE_VMALLOC(XCHAL_INSTROM1_VADDR,XCHAL_INSTROM1_VADDR+XCHAL_INSTROM1_SIZE) 46# error vmalloc range conflicts with instrom1 47# endif 48# endif 49#endif 50 51#if XCHAL_NUM_INSTRAM 52# if XCHAL_NUM_INSTRAM == 1 53# if INSIDE_VMALLOC(XCHAL_INSTRAM0_VADDR,XCHAL_INSTRAM0_VADDR+XCHAL_INSTRAM0_SIZE) 54# error vmalloc range conflicts with instram0 55# endif 56# endif 57# if XCHAL_NUM_INSTRAM == 2 58# if INSIDE_VMALLOC(XCHAL_INSTRAM1_VADDR,XCHAL_INSTRAM1_VADDR+XCHAL_INSTRAM1_SIZE) 59# error vmalloc range conflicts with instram1 60# endif 61# endif 62#endif 63 64#if XCHAL_NUM_DATAROM 65# if XCHAL_NUM_DATAROM == 1 66# if INSIDE_VMALLOC(XCHAL_DATAROM0_VADDR,XCHAL_DATAROM0_VADDR+XCHAL_DATAROM0_SIZE) 67# error vmalloc range conflicts with datarom0 68# endif 69# endif 70# if XCHAL_NUM_DATAROM == 2 71# if INSIDE_VMALLOC(XCHAL_DATAROM1_VADDR,XCHAL_DATAROM1_VADDR+XCHAL_DATAROM1_SIZE) 72# error vmalloc range conflicts with datarom1 73# endif 74# endif 75#endif 76 77#if XCHAL_NUM_DATARAM 78# if XCHAL_NUM_DATARAM == 1 79# if INSIDE_VMALLOC(XCHAL_DATARAM0_VADDR,XCHAL_DATARAM0_VADDR+XCHAL_DATARAM0_SIZE) 80# error vmalloc range conflicts with dataram0 81# endif 82# endif 83# if XCHAL_NUM_DATARAM == 2 84# if INSIDE_VMALLOC(XCHAL_DATARAM1_VADDR,XCHAL_DATARAM1_VADDR+XCHAL_DATARAM1_SIZE) 85# error vmalloc range conflicts with dataram1 86# endif 87# endif 88#endif 89 90#if XCHAL_NUM_XLMI 91# if XCHAL_NUM_XLMI == 1 92# if INSIDE_VMALLOC(XCHAL_XLMI0_VADDR,XCHAL_XLMI0_VADDR+XCHAL_XLMI0_SIZE) 93# error vmalloc range conflicts with xlmi0 94# endif 95# endif 96# if XCHAL_NUM_XLMI == 2 97# if INSIDE_VMALLOC(XCHAL_XLMI1_VADDR,XCHAL_XLMI1_VADDR+XCHAL_XLMI1_SIZE) 98# error vmalloc range conflicts with xlmi1 99# endif 100# endif 101#endif 102 103#if (XCHAL_NUM_INSTROM > 2) || \ 104 (XCHAL_NUM_INSTRAM > 2) || \ 105 (XCHAL_NUM_DATARAM > 2) || \ 106 (XCHAL_NUM_DATAROM > 2) || \ 107 (XCHAL_NUM_XLMI > 2) 108# error Insufficient checks on vmalloc above for more than 2 devices 109#endif 110 111/* 112 * USER_VM_SIZE does not necessarily equal TASK_SIZE. We bumped 113 * TASK_SIZE down to 0x4000000 to simplify the handling of windowed 114 * call instructions (currently limited to a range of 1 GByte). User 115 * tasks may very well reclaim the VM space from 0x40000000 to 116 * 0x7fffffff in the future, so we do not want the kernel becoming 117 * accustomed to having any of its stuff (e.g., page tables) in this 118 * region. This VM region is no-man's land for now. 119 */ 120 121#define USER_VM_START XCHAL_SEG_MAPPABLE_VADDR 122#define USER_VM_SIZE 0x80000000 123 124/* Size of page table: */ 125 126#define PGTABLE_SIZE_BITS (32 - XCHAL_MMU_MIN_PTE_PAGE_SIZE + 2) 127#define PGTABLE_SIZE (1L << PGTABLE_SIZE_BITS) 128 129/* All kernel-mappable space: */ 130 131#define KERNEL_ALLMAP_START (USER_VM_START + USER_VM_SIZE) 132#define KERNEL_ALLMAP_SIZE (XCHAL_SEG_MAPPABLE_SIZE - KERNEL_ALLMAP_START) 133 134/* Carve out page table at start of kernel-mappable area: */ 135 136#if KERNEL_ALLMAP_SIZE < PGTABLE_SIZE 137#error "Gimme some space for page table!" 138#endif 139#define PGTABLE_START KERNEL_ALLMAP_START 140 141/* Remaining kernel-mappable space: */ 142 143#define KERNEL_MAPPED_START (KERNEL_ALLMAP_START + PGTABLE_SIZE) 144#define KERNEL_MAPPED_SIZE (KERNEL_ALLMAP_SIZE - PGTABLE_SIZE) 145 146#if KERNEL_MAPPED_SIZE < 0x01000000 /* 16 MB is arbitrary for now */ 147# error "Shouldn't the kernel have at least *some* mappable space?" 148#endif 149 150#define MAX_LOW_MEMORY XCHAL_KSEG_CACHED_SIZE 151 152#endif 153 154/* 155 * Some constants used elsewhere, but perhaps only in Xtensa header 156 * files, so maybe we can get rid of some and access compile-time HAL 157 * directly... 158 * 159 * Note: We assume that system RAM is located at the very start of the 160 * kernel segments !! 161 */ 162#define KERNEL_VM_LOW XCHAL_KSEG_CACHED_VADDR 163#define KERNEL_VM_HIGH XCHAL_KSEG_BYPASS_VADDR 164#define KERNEL_SPACE XCHAL_KSEG_CACHED_VADDR 165 166/* 167 * Returns the physical/virtual addresses of the kernel space 168 * (works with the cached kernel segment only, which is the 169 * one normally used for kernel operation). 170 */ 171 172/* PHYSICAL BYPASS CACHED 173 * 174 * bypass vaddr bypass paddr * cached vaddr 175 * cached vaddr cached paddr bypass vaddr * 176 * bypass paddr * bypass vaddr cached vaddr 177 * cached paddr * bypass vaddr cached vaddr 178 * other * * * 179 */ 180 181#define PHYSADDR(a) \ 182(((unsigned)(a) >= XCHAL_KSEG_BYPASS_VADDR \ 183 && (unsigned)(a) < XCHAL_KSEG_BYPASS_VADDR + XCHAL_KSEG_BYPASS_SIZE) ? \ 184 (unsigned)(a) - XCHAL_KSEG_BYPASS_VADDR + XCHAL_KSEG_BYPASS_PADDR : \ 185 ((unsigned)(a) >= XCHAL_KSEG_CACHED_VADDR \ 186 && (unsigned)(a) < XCHAL_KSEG_CACHED_VADDR + XCHAL_KSEG_CACHED_SIZE) ? \ 187 (unsigned)(a) - XCHAL_KSEG_CACHED_VADDR + XCHAL_KSEG_CACHED_PADDR : \ 188 (unsigned)(a)) 189 190#define BYPASS_ADDR(a) \ 191(((unsigned)(a) >= XCHAL_KSEG_BYPASS_PADDR \ 192 && (unsigned)(a) < XCHAL_KSEG_BYPASS_PADDR + XCHAL_KSEG_BYPASS_SIZE) ? \ 193 (unsigned)(a) - XCHAL_KSEG_BYPASS_PADDR + XCHAL_KSEG_BYPASS_VADDR : \ 194 ((unsigned)(a) >= XCHAL_KSEG_CACHED_PADDR \ 195 && (unsigned)(a) < XCHAL_KSEG_CACHED_PADDR + XCHAL_KSEG_CACHED_SIZE) ? \ 196 (unsigned)(a) - XCHAL_KSEG_CACHED_PADDR + XCHAL_KSEG_BYPASS_VADDR : \ 197 ((unsigned)(a) >= XCHAL_KSEG_CACHED_VADDR \ 198 && (unsigned)(a) < XCHAL_KSEG_CACHED_VADDR+XCHAL_KSEG_CACHED_SIZE)? \ 199 (unsigned)(a) - XCHAL_KSEG_CACHED_VADDR+XCHAL_KSEG_BYPASS_VADDR: \ 200 (unsigned)(a)) 201 202#define CACHED_ADDR(a) \ 203(((unsigned)(a) >= XCHAL_KSEG_BYPASS_PADDR \ 204 && (unsigned)(a) < XCHAL_KSEG_BYPASS_PADDR + XCHAL_KSEG_BYPASS_SIZE) ? \ 205 (unsigned)(a) - XCHAL_KSEG_BYPASS_PADDR + XCHAL_KSEG_CACHED_VADDR : \ 206 ((unsigned)(a) >= XCHAL_KSEG_CACHED_PADDR \ 207 && (unsigned)(a) < XCHAL_KSEG_CACHED_PADDR + XCHAL_KSEG_CACHED_SIZE) ? \ 208 (unsigned)(a) - XCHAL_KSEG_CACHED_PADDR + XCHAL_KSEG_CACHED_VADDR : \ 209 ((unsigned)(a) >= XCHAL_KSEG_BYPASS_VADDR \ 210 && (unsigned)(a) < XCHAL_KSEG_BYPASS_VADDR+XCHAL_KSEG_BYPASS_SIZE) ? \ 211 (unsigned)(a) - XCHAL_KSEG_BYPASS_VADDR+XCHAL_KSEG_CACHED_VADDR : \ 212 (unsigned)(a)) 213 214#define PHYSADDR_IO(a) \ 215(((unsigned)(a) >= XCHAL_KIO_BYPASS_VADDR \ 216 && (unsigned)(a) < XCHAL_KIO_BYPASS_VADDR + XCHAL_KIO_BYPASS_SIZE) ? \ 217 (unsigned)(a) - XCHAL_KIO_BYPASS_VADDR + XCHAL_KIO_BYPASS_PADDR : \ 218 ((unsigned)(a) >= XCHAL_KIO_CACHED_VADDR \ 219 && (unsigned)(a) < XCHAL_KIO_CACHED_VADDR + XCHAL_KIO_CACHED_SIZE) ? \ 220 (unsigned)(a) - XCHAL_KIO_CACHED_VADDR + XCHAL_KIO_CACHED_PADDR : \ 221 (unsigned)(a)) 222 223#define BYPASS_ADDR_IO(a) \ 224(((unsigned)(a) >= XCHAL_KIO_BYPASS_PADDR \ 225 && (unsigned)(a) < XCHAL_KIO_BYPASS_PADDR + XCHAL_KIO_BYPASS_SIZE) ? \ 226 (unsigned)(a) - XCHAL_KIO_BYPASS_PADDR + XCHAL_KIO_BYPASS_VADDR : \ 227 ((unsigned)(a) >= XCHAL_KIO_CACHED_PADDR \ 228 && (unsigned)(a) < XCHAL_KIO_CACHED_PADDR + XCHAL_KIO_CACHED_SIZE) ? \ 229 (unsigned)(a) - XCHAL_KIO_CACHED_PADDR + XCHAL_KIO_BYPASS_VADDR : \ 230 ((unsigned)(a) >= XCHAL_KIO_CACHED_VADDR \ 231 && (unsigned)(a) < XCHAL_KIO_CACHED_VADDR + XCHAL_KIO_CACHED_SIZE) ? \ 232 (unsigned)(a) - XCHAL_KIO_CACHED_VADDR + XCHAL_KIO_BYPASS_VADDR : \ 233 (unsigned)(a)) 234 235#define CACHED_ADDR_IO(a) \ 236(((unsigned)(a) >= XCHAL_KIO_BYPASS_PADDR \ 237 && (unsigned)(a) < XCHAL_KIO_BYPASS_PADDR + XCHAL_KIO_BYPASS_SIZE) ? \ 238 (unsigned)(a) - XCHAL_KIO_BYPASS_PADDR + XCHAL_KIO_CACHED_VADDR : \ 239 ((unsigned)(a) >= XCHAL_KIO_CACHED_PADDR \ 240 && (unsigned)(a) < XCHAL_KIO_CACHED_PADDR + XCHAL_KIO_CACHED_SIZE) ? \ 241 (unsigned)(a) - XCHAL_KIO_CACHED_PADDR + XCHAL_KIO_CACHED_VADDR : \ 242 ((unsigned)(a) >= XCHAL_KIO_BYPASS_VADDR \ 243 && (unsigned)(a) < XCHAL_KIO_BYPASS_VADDR + XCHAL_KIO_BYPASS_SIZE) ? \ 244 (unsigned)(a) - XCHAL_KIO_BYPASS_VADDR + XCHAL_KIO_CACHED_VADDR : \ 245 (unsigned)(a)) 246 247#endif /* _XTENSA_ADDRSPACE_H */ 248 249 250 251 252