1819833afSPeter Tyser /* 2819833afSPeter Tyser * linux/include/asm-arm/memory.h 3819833afSPeter Tyser * 4819833afSPeter Tyser * Copyright (C) 2000-2002 Russell King 5819833afSPeter Tyser * 6819833afSPeter Tyser * This program is free software; you can redistribute it and/or modify 7819833afSPeter Tyser * it under the terms of the GNU General Public License version 2 as 8819833afSPeter Tyser * published by the Free Software Foundation. 9819833afSPeter Tyser * 10819833afSPeter Tyser * Note: this file should not be included by non-asm/.h files 11819833afSPeter Tyser */ 12819833afSPeter Tyser #ifndef __ASM_ARM_MEMORY_H 13819833afSPeter Tyser #define __ASM_ARM_MEMORY_H 14819833afSPeter Tyser 15819833afSPeter Tyser #if 0 /* XXX###XXX */ 16819833afSPeter Tyser 17819833afSPeter Tyser #include <asm/arch/memory.h> 18819833afSPeter Tyser 19819833afSPeter Tyser /* 20819833afSPeter Tyser * PFNs are used to describe any physical page; this means 21819833afSPeter Tyser * PFN 0 == physical address 0. 22819833afSPeter Tyser * 23819833afSPeter Tyser * This is the PFN of the first RAM page in the kernel 24819833afSPeter Tyser * direct-mapped view. We assume this is the first page 25819833afSPeter Tyser * of RAM in the mem_map as well. 26819833afSPeter Tyser */ 27819833afSPeter Tyser #define PHYS_PFN_OFFSET (PHYS_OFFSET >> PAGE_SHIFT) 28819833afSPeter Tyser 29819833afSPeter Tyser /* 30819833afSPeter Tyser * These are *only* valid on the kernel direct mapped RAM memory. 31819833afSPeter Tyser */ 32819833afSPeter Tyser static inline unsigned long virt_to_phys(void *x) 33819833afSPeter Tyser { 34819833afSPeter Tyser return __virt_to_phys((unsigned long)(x)); 35819833afSPeter Tyser } 36819833afSPeter Tyser 37819833afSPeter Tyser static inline void *phys_to_virt(unsigned long x) 38819833afSPeter Tyser { 39819833afSPeter Tyser return (void *)(__phys_to_virt((unsigned long)(x))); 40819833afSPeter Tyser } 41819833afSPeter Tyser 42819833afSPeter Tyser #define __pa(x) __virt_to_phys((unsigned long)(x)) 43819833afSPeter Tyser #define __va(x) ((void *)__phys_to_virt((unsigned long)(x))) 44819833afSPeter Tyser 45819833afSPeter Tyser /* 46819833afSPeter Tyser * Virtual <-> DMA view memory address translations 47819833afSPeter Tyser * Again, these are *only* valid on the kernel direct mapped RAM 48*fc0b5948SRobert P. J. Day * memory. Use of these is *deprecated*. 49819833afSPeter Tyser */ 50819833afSPeter Tyser #define virt_to_bus(x) (__virt_to_bus((unsigned long)(x))) 51819833afSPeter Tyser #define bus_to_virt(x) ((void *)(__bus_to_virt((unsigned long)(x)))) 52819833afSPeter Tyser 53819833afSPeter Tyser /* 54819833afSPeter Tyser * Conversion between a struct page and a physical address. 55819833afSPeter Tyser * 56819833afSPeter Tyser * Note: when converting an unknown physical address to a 57819833afSPeter Tyser * struct page, the resulting pointer must be validated 58819833afSPeter Tyser * using VALID_PAGE(). It must return an invalid struct page 59819833afSPeter Tyser * for any physical address not corresponding to a system 60819833afSPeter Tyser * RAM address. 61819833afSPeter Tyser * 62819833afSPeter Tyser * page_to_pfn(page) convert a struct page * to a PFN number 63819833afSPeter Tyser * pfn_to_page(pfn) convert a _valid_ PFN number to struct page * 64819833afSPeter Tyser * pfn_valid(pfn) indicates whether a PFN number is valid 65819833afSPeter Tyser * 66819833afSPeter Tyser * virt_to_page(k) convert a _valid_ virtual address to struct page * 67819833afSPeter Tyser * virt_addr_valid(k) indicates whether a virtual address is valid 68819833afSPeter Tyser */ 69819833afSPeter Tyser #ifndef CONFIG_DISCONTIGMEM 70819833afSPeter Tyser 71819833afSPeter Tyser #define page_to_pfn(page) (((page) - mem_map) + PHYS_PFN_OFFSET) 72819833afSPeter Tyser #define pfn_to_page(pfn) ((mem_map + (pfn)) - PHYS_PFN_OFFSET) 73819833afSPeter Tyser #define pfn_valid(pfn) ((pfn) >= PHYS_PFN_OFFSET && (pfn) < (PHYS_PFN_OFFSET + max_mapnr)) 74819833afSPeter Tyser 75819833afSPeter Tyser #define virt_to_page(kaddr) (pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)) 76819833afSPeter Tyser #define virt_addr_valid(kaddr) ((kaddr) >= PAGE_OFFSET && (kaddr) < (unsigned long)high_memory) 77819833afSPeter Tyser 78819833afSPeter Tyser #define PHYS_TO_NID(addr) (0) 79819833afSPeter Tyser 80819833afSPeter Tyser #define VALID_PAGE(page) ((page - mem_map) < max_mapnr) 81819833afSPeter Tyser 82819833afSPeter Tyser #else 83819833afSPeter Tyser 84819833afSPeter Tyser /* 85819833afSPeter Tyser * This is more complex. We have a set of mem_map arrays spread 86819833afSPeter Tyser * around in memory. 87819833afSPeter Tyser */ 88819833afSPeter Tyser #define page_to_pfn(page) \ 89819833afSPeter Tyser (((page) - page_zone(page)->zone_mem_map) \ 90819833afSPeter Tyser + (page_zone(page)->zone_start_paddr >> PAGE_SHIFT)) 91819833afSPeter Tyser 92819833afSPeter Tyser #define pfn_to_page(pfn) \ 93819833afSPeter Tyser (PFN_TO_MAPBASE(pfn) + LOCAL_MAP_NR((pfn) << PAGE_SHIFT)) 94819833afSPeter Tyser 95819833afSPeter Tyser #define pfn_valid(pfn) \ 96819833afSPeter Tyser ({ \ 97819833afSPeter Tyser unsigned int node = PFN_TO_NID(pfn); \ 98819833afSPeter Tyser struct pglist_data *nd = NODE_DATA(node); \ 99819833afSPeter Tyser ((node < NR_NODES) && \ 100819833afSPeter Tyser ((pfn - (nd->node_start_paddr >> PAGE_SHIFT)) < nd->node_size));\ 101819833afSPeter Tyser }) 102819833afSPeter Tyser 103819833afSPeter Tyser #define virt_to_page(kaddr) \ 104819833afSPeter Tyser (ADDR_TO_MAPBASE(kaddr) + LOCAL_MAP_NR(kaddr)) 105819833afSPeter Tyser 106819833afSPeter Tyser #define virt_addr_valid(kaddr) (KVADDR_TO_NID(kaddr) < NR_NODES) 107819833afSPeter Tyser 108819833afSPeter Tyser /* 109819833afSPeter Tyser * Common discontigmem stuff. 110819833afSPeter Tyser * PHYS_TO_NID is used by the ARM kernel/setup.c 111819833afSPeter Tyser */ 112819833afSPeter Tyser #define PHYS_TO_NID(addr) PFN_TO_NID((addr) >> PAGE_SHIFT) 113819833afSPeter Tyser 114819833afSPeter Tyser /* 115819833afSPeter Tyser * 2.4 compatibility 116819833afSPeter Tyser * 117819833afSPeter Tyser * VALID_PAGE returns a non-zero value if given page pointer is valid. 118819833afSPeter Tyser * This assumes all node's mem_maps are stored within the node they 119819833afSPeter Tyser * refer to. This is actually inherently buggy. 120819833afSPeter Tyser */ 121819833afSPeter Tyser #define VALID_PAGE(page) \ 122819833afSPeter Tyser ({ unsigned int node = KVADDR_TO_NID(page); \ 123819833afSPeter Tyser ((node < NR_NODES) && \ 124819833afSPeter Tyser ((unsigned)((page) - NODE_MEM_MAP(node)) < NODE_DATA(node)->node_size)); \ 125819833afSPeter Tyser }) 126819833afSPeter Tyser 127819833afSPeter Tyser #endif 128819833afSPeter Tyser 129819833afSPeter Tyser /* 130*fc0b5948SRobert P. J. Day * We should really eliminate virt_to_bus() here - it's deprecated. 131819833afSPeter Tyser */ 132819833afSPeter Tyser #define page_to_bus(page) (virt_to_bus(page_address(page))) 133819833afSPeter Tyser 134819833afSPeter Tyser #endif /* XXX###XXX */ 135819833afSPeter Tyser 136819833afSPeter Tyser #endif /* __ASM_ARM_MEMORY_H */ 137