linux/arch/arm/include/asm/memory.h
<<
>>
Prefs
   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 <mach/memory.h>
  19#include <asm/sizes.h>
  20
  21/*
  22 * Allow for constants defined here to be used from assembly code
  23 * by prepending the UL suffix only with actual C code compilation.
  24 */
  25#define UL(x) _AC(x, UL)
  26
  27#ifdef CONFIG_MMU
  28
  29/*
  30 * PAGE_OFFSET - the virtual address of the start of the kernel image
  31 * TASK_SIZE - the maximum size of a user space task.
  32 * TASK_UNMAPPED_BASE - the lower boundary of the mmap VM area
  33 */
  34#define PAGE_OFFSET             UL(CONFIG_PAGE_OFFSET)
  35#define TASK_SIZE               (UL(CONFIG_PAGE_OFFSET) - UL(0x01000000))
  36#define TASK_UNMAPPED_BASE      (UL(CONFIG_PAGE_OFFSET) / 3)
  37
  38/*
  39 * The maximum size of a 26-bit user space task.
  40 */
  41#define TASK_SIZE_26            UL(0x04000000)
  42
  43/*
  44 * The module space lives between the addresses given by TASK_SIZE
  45 * and PAGE_OFFSET - it must be within 32MB of the kernel text.
  46 */
  47#define MODULES_END             (PAGE_OFFSET)
  48#define MODULES_VADDR           (MODULES_END - 16*1048576)
  49
  50#if TASK_SIZE > MODULES_VADDR
  51#error Top of user space clashes with start of module space
  52#endif
  53
  54/*
  55 * The XIP kernel gets mapped at the bottom of the module vm area.
  56 * Since we use sections to map it, this macro replaces the physical address
  57 * with its virtual address while keeping offset from the base section.
  58 */
  59#define XIP_VIRT_ADDR(physaddr)  (MODULES_VADDR + ((physaddr) & 0x000fffff))
  60
  61/*
  62 * Allow 16MB-aligned ioremap pages
  63 */
  64#define IOREMAP_MAX_ORDER       24
  65
  66#else /* CONFIG_MMU */
  67
  68/*
  69 * The limitation of user task size can grow up to the end of free ram region.
  70 * It is difficult to define and perhaps will never meet the original meaning
  71 * of this define that was meant to.
  72 * Fortunately, there is no reference for this in noMMU mode, for now.
  73 */
  74#ifndef TASK_SIZE
  75#define TASK_SIZE               (CONFIG_DRAM_SIZE)
  76#endif
  77
  78#ifndef TASK_UNMAPPED_BASE
  79#define TASK_UNMAPPED_BASE      UL(0x00000000)
  80#endif
  81
  82#ifndef PHYS_OFFSET
  83#define PHYS_OFFSET             (CONFIG_DRAM_BASE)
  84#endif
  85
  86#ifndef END_MEM
  87#define END_MEM                 (CONFIG_DRAM_BASE + CONFIG_DRAM_SIZE)
  88#endif
  89
  90#ifndef PAGE_OFFSET
  91#define PAGE_OFFSET             (PHYS_OFFSET)
  92#endif
  93
  94/*
  95 * The module can be at any place in ram in nommu mode.
  96 */
  97#define MODULES_END             (END_MEM)
  98#define MODULES_VADDR           (PHYS_OFFSET)
  99
 100#endif /* !CONFIG_MMU */
 101
 102/*
 103 * Size of DMA-consistent memory region.  Must be multiple of 2M,
 104 * between 2MB and 14MB inclusive.
 105 */
 106#ifndef CONSISTENT_DMA_SIZE
 107#define CONSISTENT_DMA_SIZE SZ_2M
 108#endif
 109
 110/*
 111 * Physical vs virtual RAM address space conversion.  These are
 112 * private definitions which should NOT be used outside memory.h
 113 * files.  Use virt_to_phys/phys_to_virt/__pa/__va instead.
 114 */
 115#ifndef __virt_to_phys
 116#define __virt_to_phys(x)       ((x) - PAGE_OFFSET + PHYS_OFFSET)
 117#define __phys_to_virt(x)       ((x) - PHYS_OFFSET + PAGE_OFFSET)
 118#endif
 119
 120/*
 121 * Convert a physical address to a Page Frame Number and back
 122 */
 123#define __phys_to_pfn(paddr)    ((paddr) >> PAGE_SHIFT)
 124#define __pfn_to_phys(pfn)      ((pfn) << PAGE_SHIFT)
 125
 126#ifndef __ASSEMBLY__
 127
 128/*
 129 * The DMA mask corresponding to the maximum bus address allocatable
 130 * using GFP_DMA.  The default here places no restriction on DMA
 131 * allocations.  This must be the smallest DMA mask in the system,
 132 * so a successful GFP_DMA allocation will always satisfy this.
 133 */
 134#ifndef ISA_DMA_THRESHOLD
 135#define ISA_DMA_THRESHOLD       (0xffffffffULL)
 136#endif
 137
 138#ifndef arch_adjust_zones
 139#define arch_adjust_zones(node,size,holes) do { } while (0)
 140#elif !defined(CONFIG_ZONE_DMA)
 141#error "custom arch_adjust_zones() requires CONFIG_ZONE_DMA"
 142#endif
 143
 144/*
 145 * PFNs are used to describe any physical page; this means
 146 * PFN 0 == physical address 0.
 147 *
 148 * This is the PFN of the first RAM page in the kernel
 149 * direct-mapped view.  We assume this is the first page
 150 * of RAM in the mem_map as well.
 151 */
 152#define PHYS_PFN_OFFSET (PHYS_OFFSET >> PAGE_SHIFT)
 153
 154/*
 155 * These are *only* valid on the kernel direct mapped RAM memory.
 156 * Note: Drivers should NOT use these.  They are the wrong
 157 * translation for translating DMA addresses.  Use the driver
 158 * DMA support - see dma-mapping.h.
 159 */
 160static inline unsigned long virt_to_phys(void *x)
 161{
 162        return __virt_to_phys((unsigned long)(x));
 163}
 164
 165static inline void *phys_to_virt(unsigned long x)
 166{
 167        return (void *)(__phys_to_virt((unsigned long)(x)));
 168}
 169
 170/*
 171 * Drivers should NOT use these either.
 172 */
 173#define __pa(x)                 __virt_to_phys((unsigned long)(x))
 174#define __va(x)                 ((void *)__phys_to_virt((unsigned long)(x)))
 175#define pfn_to_kaddr(pfn)       __va((pfn) << PAGE_SHIFT)
 176
 177/*
 178 * Virtual <-> DMA view memory address translations
 179 * Again, these are *only* valid on the kernel direct mapped RAM
 180 * memory.  Use of these is *deprecated* (and that doesn't mean
 181 * use the __ prefixed forms instead.)  See dma-mapping.h.
 182 */
 183static inline __deprecated unsigned long virt_to_bus(void *x)
 184{
 185        return __virt_to_bus((unsigned long)x);
 186}
 187
 188static inline __deprecated void *bus_to_virt(unsigned long x)
 189{
 190        return (void *)__bus_to_virt(x);
 191}
 192
 193/*
 194 * Conversion between a struct page and a physical address.
 195 *
 196 * Note: when converting an unknown physical address to a
 197 * struct page, the resulting pointer must be validated
 198 * using VALID_PAGE().  It must return an invalid struct page
 199 * for any physical address not corresponding to a system
 200 * RAM address.
 201 *
 202 *  page_to_pfn(page)   convert a struct page * to a PFN number
 203 *  pfn_to_page(pfn)    convert a _valid_ PFN number to struct page *
 204 *  pfn_valid(pfn)      indicates whether a PFN number is valid
 205 *
 206 *  virt_to_page(k)     convert a _valid_ virtual address to struct page *
 207 *  virt_addr_valid(k)  indicates whether a virtual address is valid
 208 */
 209#ifndef CONFIG_DISCONTIGMEM
 210
 211#define ARCH_PFN_OFFSET         PHYS_PFN_OFFSET
 212
 213#ifndef CONFIG_SPARSEMEM
 214#define pfn_valid(pfn)          ((pfn) >= PHYS_PFN_OFFSET && (pfn) < (PHYS_PFN_OFFSET + max_mapnr))
 215#endif
 216
 217#define virt_to_page(kaddr)     pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
 218#define virt_addr_valid(kaddr)  ((unsigned long)(kaddr) >= PAGE_OFFSET && (unsigned long)(kaddr) < (unsigned long)high_memory)
 219
 220#define PHYS_TO_NID(addr)       (0)
 221
 222#else /* CONFIG_DISCONTIGMEM */
 223
 224/*
 225 * This is more complex.  We have a set of mem_map arrays spread
 226 * around in memory.
 227 */
 228#include <linux/numa.h>
 229
 230#define arch_pfn_to_nid(pfn)    PFN_TO_NID(pfn)
 231#define arch_local_page_offset(pfn, nid) LOCAL_MAP_NR((pfn) << PAGE_SHIFT)
 232
 233#define pfn_valid(pfn)                                          \
 234        ({                                                      \
 235                unsigned int nid = PFN_TO_NID(pfn);             \
 236                int valid = nid < MAX_NUMNODES;                 \
 237                if (valid) {                                    \
 238                        pg_data_t *node = NODE_DATA(nid);       \
 239                        valid = (pfn - node->node_start_pfn) <  \
 240                                node->node_spanned_pages;       \
 241                }                                               \
 242                valid;                                          \
 243        })
 244
 245#define virt_to_page(kaddr)                                     \
 246        (ADDR_TO_MAPBASE(kaddr) + LOCAL_MAP_NR(kaddr))
 247
 248#define virt_addr_valid(kaddr)  (KVADDR_TO_NID(kaddr) < MAX_NUMNODES)
 249
 250/*
 251 * Common discontigmem stuff.
 252 *  PHYS_TO_NID is used by the ARM kernel/setup.c
 253 */
 254#define PHYS_TO_NID(addr)       PFN_TO_NID((addr) >> PAGE_SHIFT)
 255
 256/*
 257 * Given a kaddr, ADDR_TO_MAPBASE finds the owning node of the memory
 258 * and returns the mem_map of that node.
 259 */
 260#define ADDR_TO_MAPBASE(kaddr)  NODE_MEM_MAP(KVADDR_TO_NID(kaddr))
 261
 262/*
 263 * Given a page frame number, find the owning node of the memory
 264 * and returns the mem_map of that node.
 265 */
 266#define PFN_TO_MAPBASE(pfn)     NODE_MEM_MAP(PFN_TO_NID(pfn))
 267
 268#ifdef NODE_MEM_SIZE_BITS
 269#define NODE_MEM_SIZE_MASK      ((1 << NODE_MEM_SIZE_BITS) - 1)
 270
 271/*
 272 * Given a kernel address, find the home node of the underlying memory.
 273 */
 274#define KVADDR_TO_NID(addr) \
 275        (((unsigned long)(addr) - PAGE_OFFSET) >> NODE_MEM_SIZE_BITS)
 276
 277/*
 278 * Given a page frame number, convert it to a node id.
 279 */
 280#define PFN_TO_NID(pfn) \
 281        (((pfn) - PHYS_PFN_OFFSET) >> (NODE_MEM_SIZE_BITS - PAGE_SHIFT))
 282
 283/*
 284 * Given a kaddr, LOCAL_MEM_MAP finds the owning node of the memory
 285 * and returns the index corresponding to the appropriate page in the
 286 * node's mem_map.
 287 */
 288#define LOCAL_MAP_NR(addr) \
 289        (((unsigned long)(addr) & NODE_MEM_SIZE_MASK) >> PAGE_SHIFT)
 290
 291#endif /* NODE_MEM_SIZE_BITS */
 292
 293#endif /* !CONFIG_DISCONTIGMEM */
 294
 295/*
 296 * For BIO.  "will die".  Kill me when bio_to_phys() and bvec_to_phys() die.
 297 */
 298#define page_to_phys(page)      (page_to_pfn(page) << PAGE_SHIFT)
 299
 300/*
 301 * Optional coherency support.  Currently used only by selected
 302 * Intel XSC3-based systems.
 303 */
 304#ifndef arch_is_coherent
 305#define arch_is_coherent()              0
 306#endif
 307
 308#endif
 309
 310#include <asm-generic/memory_model.h>
 311
 312#endif
 313
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.