~ubuntu-branches/ubuntu/precise/linux-lowlatency/precise

« back to all changes in this revision

Viewing changes to arch/arm/include/asm/memory.h

  • Committer: Package Import Robot
  • Author(s): Alessio Igor Bogani
  • Date: 2011-10-26 11:13:05 UTC
  • Revision ID: package-import@ubuntu.com-20111026111305-tz023xykf0i6eosh
Tags: upstream-3.2.0
ImportĀ upstreamĀ versionĀ 3.2.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 *  arch/arm/include/asm/memory.h
 
3
 *
 
4
 *  Copyright (C) 2000-2002 Russell King
 
5
 *  modification for nommu, Hyok S. Choi, 2004
 
6
 *
 
7
 * This program is free software; you can redistribute it and/or modify
 
8
 * it under the terms of the GNU General Public License version 2 as
 
9
 * published by the Free Software Foundation.
 
10
 *
 
11
 *  Note: this file should not be included by non-asm/.h files
 
12
 */
 
13
#ifndef __ASM_ARM_MEMORY_H
 
14
#define __ASM_ARM_MEMORY_H
 
15
 
 
16
#include <linux/compiler.h>
 
17
#include <linux/const.h>
 
18
#include <linux/types.h>
 
19
#include <asm/sizes.h>
 
20
 
 
21
#ifdef CONFIG_NEED_MACH_MEMORY_H
 
22
#include <mach/memory.h>
 
23
#endif
 
24
 
 
25
/*
 
26
 * Allow for constants defined here to be used from assembly code
 
27
 * by prepending the UL suffix only with actual C code compilation.
 
28
 */
 
29
#define UL(x) _AC(x, UL)
 
30
 
 
31
#ifdef CONFIG_MMU
 
32
 
 
33
/*
 
34
 * PAGE_OFFSET - the virtual address of the start of the kernel image
 
35
 * TASK_SIZE - the maximum size of a user space task.
 
36
 * TASK_UNMAPPED_BASE - the lower boundary of the mmap VM area
 
37
 */
 
38
#define PAGE_OFFSET             UL(CONFIG_PAGE_OFFSET)
 
39
#define TASK_SIZE               (UL(CONFIG_PAGE_OFFSET) - UL(0x01000000))
 
40
#define TASK_UNMAPPED_BASE      (UL(CONFIG_PAGE_OFFSET) / 3)
 
41
 
 
42
/*
 
43
 * The maximum size of a 26-bit user space task.
 
44
 */
 
45
#define TASK_SIZE_26            UL(0x04000000)
 
46
 
 
47
/*
 
48
 * The module space lives between the addresses given by TASK_SIZE
 
49
 * and PAGE_OFFSET - it must be within 32MB of the kernel text.
 
50
 */
 
51
#ifndef CONFIG_THUMB2_KERNEL
 
52
#define MODULES_VADDR           (PAGE_OFFSET - 16*1024*1024)
 
53
#else
 
54
/* smaller range for Thumb-2 symbols relocation (2^24)*/
 
55
#define MODULES_VADDR           (PAGE_OFFSET - 8*1024*1024)
 
56
#endif
 
57
 
 
58
#if TASK_SIZE > MODULES_VADDR
 
59
#error Top of user space clashes with start of module space
 
60
#endif
 
61
 
 
62
/*
 
63
 * The highmem pkmap virtual space shares the end of the module area.
 
64
 */
 
65
#ifdef CONFIG_HIGHMEM
 
66
#define MODULES_END             (PAGE_OFFSET - PMD_SIZE)
 
67
#else
 
68
#define MODULES_END             (PAGE_OFFSET)
 
69
#endif
 
70
 
 
71
/*
 
72
 * The XIP kernel gets mapped at the bottom of the module vm area.
 
73
 * Since we use sections to map it, this macro replaces the physical address
 
74
 * with its virtual address while keeping offset from the base section.
 
75
 */
 
76
#define XIP_VIRT_ADDR(physaddr)  (MODULES_VADDR + ((physaddr) & 0x000fffff))
 
77
 
 
78
/*
 
79
 * Allow 16MB-aligned ioremap pages
 
80
 */
 
81
#define IOREMAP_MAX_ORDER       24
 
82
 
 
83
#define CONSISTENT_END          (0xffe00000UL)
 
84
 
 
85
#else /* CONFIG_MMU */
 
86
 
 
87
/*
 
88
 * The limitation of user task size can grow up to the end of free ram region.
 
89
 * It is difficult to define and perhaps will never meet the original meaning
 
90
 * of this define that was meant to.
 
91
 * Fortunately, there is no reference for this in noMMU mode, for now.
 
92
 */
 
93
#ifndef TASK_SIZE
 
94
#define TASK_SIZE               (CONFIG_DRAM_SIZE)
 
95
#endif
 
96
 
 
97
#ifndef TASK_UNMAPPED_BASE
 
98
#define TASK_UNMAPPED_BASE      UL(0x00000000)
 
99
#endif
 
100
 
 
101
#ifndef PHYS_OFFSET
 
102
#define PHYS_OFFSET             UL(CONFIG_DRAM_BASE)
 
103
#endif
 
104
 
 
105
#ifndef END_MEM
 
106
#define END_MEM                 (UL(CONFIG_DRAM_BASE) + CONFIG_DRAM_SIZE)
 
107
#endif
 
108
 
 
109
#ifndef PAGE_OFFSET
 
110
#define PAGE_OFFSET             (PHYS_OFFSET)
 
111
#endif
 
112
 
 
113
/*
 
114
 * The module can be at any place in ram in nommu mode.
 
115
 */
 
116
#define MODULES_END             (END_MEM)
 
117
#define MODULES_VADDR           (PHYS_OFFSET)
 
118
 
 
119
#endif /* !CONFIG_MMU */
 
120
 
 
121
/*
 
122
 * We fix the TCM memories max 32 KiB ITCM resp DTCM at these
 
123
 * locations
 
124
 */
 
125
#ifdef CONFIG_HAVE_TCM
 
126
#define ITCM_OFFSET     UL(0xfffe0000)
 
127
#define DTCM_OFFSET     UL(0xfffe8000)
 
128
#endif
 
129
 
 
130
/*
 
131
 * Convert a physical address to a Page Frame Number and back
 
132
 */
 
133
#define __phys_to_pfn(paddr)    ((unsigned long)((paddr) >> PAGE_SHIFT))
 
134
#define __pfn_to_phys(pfn)      ((phys_addr_t)(pfn) << PAGE_SHIFT)
 
135
 
 
136
/*
 
137
 * Convert a page to/from a physical address
 
138
 */
 
139
#define page_to_phys(page)      (__pfn_to_phys(page_to_pfn(page)))
 
140
#define phys_to_page(phys)      (pfn_to_page(__phys_to_pfn(phys)))
 
141
 
 
142
#ifndef __ASSEMBLY__
 
143
 
 
144
/*
 
145
 * Physical vs virtual RAM address space conversion.  These are
 
146
 * private definitions which should NOT be used outside memory.h
 
147
 * files.  Use virt_to_phys/phys_to_virt/__pa/__va instead.
 
148
 */
 
149
#ifndef __virt_to_phys
 
150
#ifdef CONFIG_ARM_PATCH_PHYS_VIRT
 
151
 
 
152
/*
 
153
 * Constants used to force the right instruction encodings and shifts
 
154
 * so that all we need to do is modify the 8-bit constant field.
 
155
 */
 
156
#define __PV_BITS_31_24 0x81000000
 
157
 
 
158
extern unsigned long __pv_phys_offset;
 
159
#define PHYS_OFFSET __pv_phys_offset
 
160
 
 
161
#define __pv_stub(from,to,instr,type)                   \
 
162
        __asm__("@ __pv_stub\n"                         \
 
163
        "1:     " instr "       %0, %1, %2\n"           \
 
164
        "       .pushsection .pv_table,\"a\"\n"         \
 
165
        "       .long   1b\n"                           \
 
166
        "       .popsection\n"                          \
 
167
        : "=r" (to)                                     \
 
168
        : "r" (from), "I" (type))
 
169
 
 
170
static inline unsigned long __virt_to_phys(unsigned long x)
 
171
{
 
172
        unsigned long t;
 
173
        __pv_stub(x, t, "add", __PV_BITS_31_24);
 
174
        return t;
 
175
}
 
176
 
 
177
static inline unsigned long __phys_to_virt(unsigned long x)
 
178
{
 
179
        unsigned long t;
 
180
        __pv_stub(x, t, "sub", __PV_BITS_31_24);
 
181
        return t;
 
182
}
 
183
#else
 
184
#define __virt_to_phys(x)       ((x) - PAGE_OFFSET + PHYS_OFFSET)
 
185
#define __phys_to_virt(x)       ((x) - PHYS_OFFSET + PAGE_OFFSET)
 
186
#endif
 
187
#endif
 
188
 
 
189
#ifndef PHYS_OFFSET
 
190
#ifdef PLAT_PHYS_OFFSET
 
191
#define PHYS_OFFSET     PLAT_PHYS_OFFSET
 
192
#else
 
193
#define PHYS_OFFSET     UL(CONFIG_PHYS_OFFSET)
 
194
#endif
 
195
#endif
 
196
 
 
197
/*
 
198
 * PFNs are used to describe any physical page; this means
 
199
 * PFN 0 == physical address 0.
 
200
 *
 
201
 * This is the PFN of the first RAM page in the kernel
 
202
 * direct-mapped view.  We assume this is the first page
 
203
 * of RAM in the mem_map as well.
 
204
 */
 
205
#define PHYS_PFN_OFFSET (PHYS_OFFSET >> PAGE_SHIFT)
 
206
 
 
207
/*
 
208
 * These are *only* valid on the kernel direct mapped RAM memory.
 
209
 * Note: Drivers should NOT use these.  They are the wrong
 
210
 * translation for translating DMA addresses.  Use the driver
 
211
 * DMA support - see dma-mapping.h.
 
212
 */
 
213
static inline phys_addr_t virt_to_phys(const volatile void *x)
 
214
{
 
215
        return __virt_to_phys((unsigned long)(x));
 
216
}
 
217
 
 
218
static inline void *phys_to_virt(phys_addr_t x)
 
219
{
 
220
        return (void *)(__phys_to_virt((unsigned long)(x)));
 
221
}
 
222
 
 
223
/*
 
224
 * Drivers should NOT use these either.
 
225
 */
 
226
#define __pa(x)                 __virt_to_phys((unsigned long)(x))
 
227
#define __va(x)                 ((void *)__phys_to_virt((unsigned long)(x)))
 
228
#define pfn_to_kaddr(pfn)       __va((pfn) << PAGE_SHIFT)
 
229
 
 
230
/*
 
231
 * Virtual <-> DMA view memory address translations
 
232
 * Again, these are *only* valid on the kernel direct mapped RAM
 
233
 * memory.  Use of these is *deprecated* (and that doesn't mean
 
234
 * use the __ prefixed forms instead.)  See dma-mapping.h.
 
235
 */
 
236
#ifndef __virt_to_bus
 
237
#define __virt_to_bus   __virt_to_phys
 
238
#define __bus_to_virt   __phys_to_virt
 
239
#define __pfn_to_bus(x) __pfn_to_phys(x)
 
240
#define __bus_to_pfn(x) __phys_to_pfn(x)
 
241
#endif
 
242
 
 
243
static inline __deprecated unsigned long virt_to_bus(void *x)
 
244
{
 
245
        return __virt_to_bus((unsigned long)x);
 
246
}
 
247
 
 
248
static inline __deprecated void *bus_to_virt(unsigned long x)
 
249
{
 
250
        return (void *)__bus_to_virt(x);
 
251
}
 
252
 
 
253
/*
 
254
 * Conversion between a struct page and a physical address.
 
255
 *
 
256
 * Note: when converting an unknown physical address to a
 
257
 * struct page, the resulting pointer must be validated
 
258
 * using VALID_PAGE().  It must return an invalid struct page
 
259
 * for any physical address not corresponding to a system
 
260
 * RAM address.
 
261
 *
 
262
 *  page_to_pfn(page)   convert a struct page * to a PFN number
 
263
 *  pfn_to_page(pfn)    convert a _valid_ PFN number to struct page *
 
264
 *
 
265
 *  virt_to_page(k)     convert a _valid_ virtual address to struct page *
 
266
 *  virt_addr_valid(k)  indicates whether a virtual address is valid
 
267
 */
 
268
#define ARCH_PFN_OFFSET         PHYS_PFN_OFFSET
 
269
 
 
270
#define virt_to_page(kaddr)     pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
 
271
#define virt_addr_valid(kaddr)  ((unsigned long)(kaddr) >= PAGE_OFFSET && (unsigned long)(kaddr) < (unsigned long)high_memory)
 
272
 
 
273
/*
 
274
 * Optional coherency support.  Currently used only by selected
 
275
 * Intel XSC3-based systems.
 
276
 */
 
277
#ifndef arch_is_coherent
 
278
#define arch_is_coherent()              0
 
279
#endif
 
280
 
 
281
#endif
 
282
 
 
283
#include <asm-generic/memory_model.h>
 
284
 
 
285
#endif