1*819833afSPeter Tyser /* 2*819833afSPeter Tyser * linux/include/asm-arm/memory.h 3*819833afSPeter Tyser * 4*819833afSPeter Tyser * Copyright (C) 2000-2002 Russell King 5*819833afSPeter Tyser * 6*819833afSPeter Tyser * This program is free software; you can redistribute it and/or modify 7*819833afSPeter Tyser * it under the terms of the GNU General Public License version 2 as 8*819833afSPeter Tyser * published by the Free Software Foundation. 9*819833afSPeter Tyser * 10*819833afSPeter Tyser * Note: this file should not be included by non-asm/.h files 11*819833afSPeter Tyser */ 12*819833afSPeter Tyser #ifndef __ASM_ARM_MEMORY_H 13*819833afSPeter Tyser #define __ASM_ARM_MEMORY_H 14*819833afSPeter Tyser 15*819833afSPeter Tyser #if 0 /* XXX###XXX */ 16*819833afSPeter Tyser 17*819833afSPeter Tyser #include <linux/config.h> 18*819833afSPeter Tyser #include <asm/arch/memory.h> 19*819833afSPeter Tyser 20*819833afSPeter Tyser /* 21*819833afSPeter Tyser * PFNs are used to describe any physical page; this means 22*819833afSPeter Tyser * PFN 0 == physical address 0. 23*819833afSPeter Tyser * 24*819833afSPeter Tyser * This is the PFN of the first RAM page in the kernel 25*819833afSPeter Tyser * direct-mapped view. We assume this is the first page 26*819833afSPeter Tyser * of RAM in the mem_map as well. 27*819833afSPeter Tyser */ 28*819833afSPeter Tyser #define PHYS_PFN_OFFSET (PHYS_OFFSET >> PAGE_SHIFT) 29*819833afSPeter Tyser 30*819833afSPeter Tyser /* 31*819833afSPeter Tyser * These are *only* valid on the kernel direct mapped RAM memory. 32*819833afSPeter Tyser */ 33*819833afSPeter Tyser static inline unsigned long virt_to_phys(void *x) 34*819833afSPeter Tyser { 35*819833afSPeter Tyser return __virt_to_phys((unsigned long)(x)); 36*819833afSPeter Tyser } 37*819833afSPeter Tyser 38*819833afSPeter Tyser static inline void *phys_to_virt(unsigned long x) 39*819833afSPeter Tyser { 40*819833afSPeter Tyser return (void *)(__phys_to_virt((unsigned long)(x))); 41*819833afSPeter Tyser } 42*819833afSPeter Tyser 43*819833afSPeter Tyser #define __pa(x) __virt_to_phys((unsigned long)(x)) 44*819833afSPeter Tyser #define __va(x) ((void *)__phys_to_virt((unsigned long)(x))) 45*819833afSPeter Tyser 46*819833afSPeter Tyser /* 47*819833afSPeter Tyser * Virtual <-> DMA view memory address translations 48*819833afSPeter Tyser * Again, these are *only* valid on the kernel direct mapped RAM 49*819833afSPeter Tyser * memory. Use of these is *depreciated*. 50*819833afSPeter Tyser */ 51*819833afSPeter Tyser #define virt_to_bus(x) (__virt_to_bus((unsigned long)(x))) 52*819833afSPeter Tyser #define bus_to_virt(x) ((void *)(__bus_to_virt((unsigned long)(x)))) 53*819833afSPeter Tyser 54*819833afSPeter Tyser /* 55*819833afSPeter Tyser * Conversion between a struct page and a physical address. 56*819833afSPeter Tyser * 57*819833afSPeter Tyser * Note: when converting an unknown physical address to a 58*819833afSPeter Tyser * struct page, the resulting pointer must be validated 59*819833afSPeter Tyser * using VALID_PAGE(). It must return an invalid struct page 60*819833afSPeter Tyser * for any physical address not corresponding to a system 61*819833afSPeter Tyser * RAM address. 62*819833afSPeter Tyser * 63*819833afSPeter Tyser * page_to_pfn(page) convert a struct page * to a PFN number 64*819833afSPeter Tyser * pfn_to_page(pfn) convert a _valid_ PFN number to struct page * 65*819833afSPeter Tyser * pfn_valid(pfn) indicates whether a PFN number is valid 66*819833afSPeter Tyser * 67*819833afSPeter Tyser * virt_to_page(k) convert a _valid_ virtual address to struct page * 68*819833afSPeter Tyser * virt_addr_valid(k) indicates whether a virtual address is valid 69*819833afSPeter Tyser */ 70*819833afSPeter Tyser #ifndef CONFIG_DISCONTIGMEM 71*819833afSPeter Tyser 72*819833afSPeter Tyser #define page_to_pfn(page) (((page) - mem_map) + PHYS_PFN_OFFSET) 73*819833afSPeter Tyser #define pfn_to_page(pfn) ((mem_map + (pfn)) - PHYS_PFN_OFFSET) 74*819833afSPeter Tyser #define pfn_valid(pfn) ((pfn) >= PHYS_PFN_OFFSET && (pfn) < (PHYS_PFN_OFFSET + max_mapnr)) 75*819833afSPeter Tyser 76*819833afSPeter Tyser #define virt_to_page(kaddr) (pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)) 77*819833afSPeter Tyser #define virt_addr_valid(kaddr) ((kaddr) >= PAGE_OFFSET && (kaddr) < (unsigned long)high_memory) 78*819833afSPeter Tyser 79*819833afSPeter Tyser #define PHYS_TO_NID(addr) (0) 80*819833afSPeter Tyser 81*819833afSPeter Tyser #define VALID_PAGE(page) ((page - mem_map) < max_mapnr) 82*819833afSPeter Tyser 83*819833afSPeter Tyser #else 84*819833afSPeter Tyser 85*819833afSPeter Tyser /* 86*819833afSPeter Tyser * This is more complex. We have a set of mem_map arrays spread 87*819833afSPeter Tyser * around in memory. 88*819833afSPeter Tyser */ 89*819833afSPeter Tyser #define page_to_pfn(page) \ 90*819833afSPeter Tyser (((page) - page_zone(page)->zone_mem_map) \ 91*819833afSPeter Tyser + (page_zone(page)->zone_start_paddr >> PAGE_SHIFT)) 92*819833afSPeter Tyser 93*819833afSPeter Tyser #define pfn_to_page(pfn) \ 94*819833afSPeter Tyser (PFN_TO_MAPBASE(pfn) + LOCAL_MAP_NR((pfn) << PAGE_SHIFT)) 95*819833afSPeter Tyser 96*819833afSPeter Tyser #define pfn_valid(pfn) \ 97*819833afSPeter Tyser ({ \ 98*819833afSPeter Tyser unsigned int node = PFN_TO_NID(pfn); \ 99*819833afSPeter Tyser struct pglist_data *nd = NODE_DATA(node); \ 100*819833afSPeter Tyser ((node < NR_NODES) && \ 101*819833afSPeter Tyser ((pfn - (nd->node_start_paddr >> PAGE_SHIFT)) < nd->node_size));\ 102*819833afSPeter Tyser }) 103*819833afSPeter Tyser 104*819833afSPeter Tyser #define virt_to_page(kaddr) \ 105*819833afSPeter Tyser (ADDR_TO_MAPBASE(kaddr) + LOCAL_MAP_NR(kaddr)) 106*819833afSPeter Tyser 107*819833afSPeter Tyser #define virt_addr_valid(kaddr) (KVADDR_TO_NID(kaddr) < NR_NODES) 108*819833afSPeter Tyser 109*819833afSPeter Tyser /* 110*819833afSPeter Tyser * Common discontigmem stuff. 111*819833afSPeter Tyser * PHYS_TO_NID is used by the ARM kernel/setup.c 112*819833afSPeter Tyser */ 113*819833afSPeter Tyser #define PHYS_TO_NID(addr) PFN_TO_NID((addr) >> PAGE_SHIFT) 114*819833afSPeter Tyser 115*819833afSPeter Tyser /* 116*819833afSPeter Tyser * 2.4 compatibility 117*819833afSPeter Tyser * 118*819833afSPeter Tyser * VALID_PAGE returns a non-zero value if given page pointer is valid. 119*819833afSPeter Tyser * This assumes all node's mem_maps are stored within the node they 120*819833afSPeter Tyser * refer to. This is actually inherently buggy. 121*819833afSPeter Tyser */ 122*819833afSPeter Tyser #define VALID_PAGE(page) \ 123*819833afSPeter Tyser ({ unsigned int node = KVADDR_TO_NID(page); \ 124*819833afSPeter Tyser ((node < NR_NODES) && \ 125*819833afSPeter Tyser ((unsigned)((page) - NODE_MEM_MAP(node)) < NODE_DATA(node)->node_size)); \ 126*819833afSPeter Tyser }) 127*819833afSPeter Tyser 128*819833afSPeter Tyser #endif 129*819833afSPeter Tyser 130*819833afSPeter Tyser /* 131*819833afSPeter Tyser * We should really eliminate virt_to_bus() here - it's depreciated. 132*819833afSPeter Tyser */ 133*819833afSPeter Tyser #define page_to_bus(page) (virt_to_bus(page_address(page))) 134*819833afSPeter Tyser 135*819833afSPeter Tyser #endif /* XXX###XXX */ 136*819833afSPeter Tyser 137*819833afSPeter Tyser #endif /* __ASM_ARM_MEMORY_H */ 138