root/arch/nds32/include/asm/memory.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   1 /* SPDX-License-Identifier: GPL-2.0 */
   2 // Copyright (C) 2005-2017 Andes Technology Corporation
   3 
   4 #ifndef __ASM_NDS32_MEMORY_H
   5 #define __ASM_NDS32_MEMORY_H
   6 
   7 #include <linux/compiler.h>
   8 #include <linux/sizes.h>
   9 
  10 #ifndef __ASSEMBLY__
  11 #include <asm/page.h>
  12 #endif
  13 
  14 #ifndef PHYS_OFFSET
  15 #define PHYS_OFFSET     (0x0)
  16 #endif
  17 
  18 /*
  19  * TASK_SIZE - the maximum size of a user space task.
  20  * TASK_UNMAPPED_BASE - the lower boundary of the mmap VM area
  21  */
  22 #define TASK_SIZE               ((CONFIG_PAGE_OFFSET) - (SZ_32M))
  23 #define TASK_UNMAPPED_BASE      ALIGN(TASK_SIZE / 3, SZ_32M)
  24 #define PAGE_OFFSET             (CONFIG_PAGE_OFFSET)
  25 
  26 /*
  27  * Physical vs virtual RAM address space conversion.  These are
  28  * private definitions which should NOT be used outside memory.h
  29  * files.  Use virt_to_phys/phys_to_virt/__pa/__va instead.
  30  */
  31 #ifndef __virt_to_phys
  32 #define __virt_to_phys(x)       ((x) - PAGE_OFFSET + PHYS_OFFSET)
  33 #define __phys_to_virt(x)       ((x) - PHYS_OFFSET + PAGE_OFFSET)
  34 #endif
  35 
  36 /*
  37  * The module space lives between the addresses given by TASK_SIZE
  38  * and PAGE_OFFSET - it must be within 32MB of the kernel text.
  39  */
  40 #define MODULES_END     (PAGE_OFFSET)
  41 #define MODULES_VADDR   (MODULES_END - SZ_32M)
  42 
  43 #if TASK_SIZE > MODULES_VADDR
  44 #error Top of user space clashes with start of module space
  45 #endif
  46 
  47 #ifndef __ASSEMBLY__
  48 
  49 /*
  50  * PFNs are used to describe any physical page; this means
  51  * PFN 0 == physical address 0.
  52  *
  53  * This is the PFN of the first RAM page in the kernel
  54  * direct-mapped view.  We assume this is the first page
  55  * of RAM in the mem_map as well.
  56  */
  57 #define PHYS_PFN_OFFSET (PHYS_OFFSET >> PAGE_SHIFT)
  58 
  59 /*
  60  * Drivers should NOT use these either.
  61  */
  62 #define __pa(x)                 __virt_to_phys((unsigned long)(x))
  63 #define __va(x)                 ((void *)__phys_to_virt((unsigned long)(x)))
  64 
  65 /*
  66  * Conversion between a struct page and a physical address.
  67  *
  68  * Note: when converting an unknown physical address to a
  69  * struct page, the resulting pointer must be validated
  70  * using VALID_PAGE().  It must return an invalid struct page
  71  * for any physical address not corresponding to a system
  72  * RAM address.
  73  *
  74  *  pfn_valid(pfn)      indicates whether a PFN number is valid
  75  *
  76  *  virt_to_page(k)     convert a _valid_ virtual address to struct page *
  77  *  virt_addr_valid(k)  indicates whether a virtual address is valid
  78  */
  79 #ifndef CONFIG_DISCONTIGMEM
  80 
  81 #define ARCH_PFN_OFFSET         PHYS_PFN_OFFSET
  82 #define pfn_valid(pfn)          ((pfn) >= PHYS_PFN_OFFSET && (pfn) < (PHYS_PFN_OFFSET + max_mapnr))
  83 
  84 #define virt_to_page(kaddr)     (pfn_to_page(__pa(kaddr) >> PAGE_SHIFT))
  85 #define virt_addr_valid(kaddr)  ((unsigned long)(kaddr) >= PAGE_OFFSET && (unsigned long)(kaddr) < (unsigned long)high_memory)
  86 
  87 #else /* CONFIG_DISCONTIGMEM */
  88 #error CONFIG_DISCONTIGMEM is not supported yet.
  89 #endif /* !CONFIG_DISCONTIGMEM */
  90 
  91 #define page_to_phys(page)      (page_to_pfn(page) << PAGE_SHIFT)
  92 
  93 #endif
  94 
  95 #include <asm-generic/memory_model.h>
  96 
  97 #endif

/* [<][>][^][v][top][bottom][index][help] */