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