1/*
2 *  linux/include/asm-arm/arch-clps711x/mmu.h
3 *
4 *  Copyright (C) 1999 ARM Limited
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19 */
20#ifndef __ASM_ARCH_MMU_H
21#define __ASM_ARCH_MMU_H
22
23#include <linux/config.h>
24
25/*
26 * Task size: 3GB
27 */
28#define TASK_SIZE	(0xc0000000UL)
29#define TASK_SIZE_26	(0x04000000UL)
30
31/*
32 * This decides where the kernel will search for a free chunk of vm
33 * space during mmap's.
34 */
35#define TASK_UNMAPPED_BASE (TASK_SIZE / 3)
36
37/*
38 * Page offset: 3GB
39 */
40#define PAGE_OFFSET	(0xc0000000UL)
41#define PHYS_OFFSET	(0xc0000000UL)
42
43/*
44 * On integrator, the dram is contiguous
45 */
46#define __virt_to_phys__is_a_macro
47#define __virt_to_phys(vpage) ((vpage) - PAGE_OFFSET + PHYS_OFFSET)
48#define __phys_to_virt__is_a_macro
49#define __phys_to_virt(ppage) ((ppage) + PAGE_OFFSET - PHYS_OFFSET)
50
51/*
52 * Virtual view <-> DMA view memory address translations
53 * virt_to_bus: Used to translate the virtual address to an
54 *              address suitable to be passed to set_dma_addr
55 * bus_to_virt: Used to convert an address for DMA operations
56 *              to an address that the kernel can use.
57 */
58
59#if defined(CONFIG_ARCH_CDB89712)
60
61#define __virt_to_bus__is_a_macro
62#define __virt_to_bus(x)	(x)
63#define __bus_to_virt__is_a_macro
64#define __bus_to_virt(x)	(x)
65
66#elif defined(CONFIG_ARCH_AUTCPU12)
67
68#define __virt_to_bus__is_a_macro
69#define __virt_to_bus(x)	(x)
70#define __bus_to_virt__is_a_macro
71#define __bus_to_virt(x)	(x)
72
73#else
74
75#define __virt_to_bus__is_a_macro
76#define __virt_to_bus(x)	((x) - PAGE_OFFSET)
77#define __bus_to_virt__is_a_macro
78#define __bus_to_virt(x)	((x) + PAGE_OFFSET)
79
80#endif
81
82
83/*
84 * Like the SA1100, the EDB7211 has a large gap between physical RAM
85 * banks.  In 2.2, the Psion (CL-PS7110) port added custom support for
86 * discontiguous physical memory.  In 2.4, we can use the standard
87 * Linux NUMA support.
88 *
89 * This is not necessary for EP7211 implementations with only one used
90 * memory bank.  For those systems, simply undefine CONFIG_DISCONTIGMEM.
91 */
92
93#ifdef CONFIG_ARCH_EDB7211
94
95#ifdef CONFIG_DISCONTIGMEM
96/*
97 * Because of the wide memory address space between physical RAM banks on the
98 * SA1100, it's much more convenient to use Linux's NUMA support to implement
99 * our memory map representation.  Assuming all memory nodes have equal access
100 * characteristics, we then have generic discontigous memory support.
101 *
102 * Of course, all this isn't mandatory for SA1100 implementations with only
103 * one used memory bank.  For those, simply undefine CONFIG_DISCONTIGMEM.
104 *
105 * The nodes are matched with the physical memory bank addresses which are
106 * incidentally the same as virtual addresses.
107 *
108 * 	node 0:  0xc0000000 - 0xc7ffffff
109 * 	node 1:  0xc8000000 - 0xcfffffff
110 * 	node 2:  0xd0000000 - 0xd7ffffff
111 * 	node 3:  0xd8000000 - 0xdfffffff
112 */
113
114#define NR_NODES	4
115
116/*
117 * Given a kernel address, find the home node of the underlying memory.
118 */
119#define KVADDR_TO_NID(addr) \
120		(((unsigned long)(addr) - PAGE_OFFSET) >> NODE_MAX_MEM_SHIFT)
121
122/*
123 * Given a physical address, convert it to a node id.
124 */
125#define PHYS_TO_NID(addr) KVADDR_TO_NID(__phys_to_virt(addr))
126
127/*
128 * Given a kaddr, ADDR_TO_MAPBASE finds the owning node of the memory
129 * and returns the mem_map of that node.
130 */
131#define ADDR_TO_MAPBASE(kaddr) \
132			NODE_MEM_MAP(KVADDR_TO_NID((unsigned long)(kaddr)))
133
134/*
135 * Given a kaddr, LOCAL_MAR_NR finds the owning node of the memory
136 * and returns the index corresponding to the appropriate page in the
137 * node's mem_map.
138 */
139#define LOCAL_MAP_NR(kaddr) \
140	(((unsigned long)(kaddr)-LOCAL_BASE_ADDR((kaddr))) >> PAGE_SHIFT)
141
142/*
143 * Given a kaddr, virt_to_page returns a pointer to the corresponding
144 * mem_map entry.
145 */
146#define virt_to_page(kaddr) \
147	(ADDR_TO_MAPBASE(kaddr) + LOCAL_MAP_NR(kaddr))
148
149/*
150 * VALID_PAGE returns a non-zero value if given page pointer is valid.
151 * This assumes all node's mem_maps are stored within the node they refer to.
152 */
153#define VALID_PAGE(page) \
154({ unsigned int node = KVADDR_TO_NID(page); \
155   ( (node < NR_NODES) && \
156     ((unsigned)((page) - NODE_MEM_MAP(node)) < NODE_DATA(node)->node_size) ); \
157})
158
159/*
160 * The PS7211 allows up to 256MB max per DRAM bank, but the EDB7211
161 * uses only one of the two banks (bank #1).  However, even within
162 * bank #1, memory is discontiguous.
163 *
164 * The EDB7211 has two 8MB DRAM areas with 8MB of empty space between
165 * them, so we use 24 for the node max shift to get 16MB node sizes.
166 */
167#define NODE_MAX_MEM_SHIFT	24
168#define NODE_MAX_MEM_SIZE	(1<<NODE_MAX_MEM_SHIFT)
169
170/*
171 * Given a mem_map_t, LOCAL_MAP_BASE finds the owning node for the
172 * physical page and returns the kaddr for the mem_map of that node.
173 */
174#define LOCAL_MAP_BASE(page) \
175			NODE_MEM_MAP(KVADDR_TO_NID((unsigned long)(page)))
176
177/*
178 * Given a kaddr, LOCAL_BASE_ADDR finds the owning node of the memory
179 * and returns the kaddr corresponding to first physical page in the
180 * node's mem_map.
181 */
182#define LOCAL_BASE_ADDR(kaddr)	((unsigned long)(kaddr) & ~(NODE_MAX_MEM_SIZE-1))
183
184/*
185 * With discontigmem, the conceptual mem_map array starts from PAGE_OFFSET.
186 * Given a kaddr, MAP_NR returns the appropriate global mem_map index so
187 * it matches the corresponding node's local mem_map.
188 */
189#define MAP_NR(kaddr)	(LOCAL_MAP_NR((kaddr)) + \
190		(((unsigned long)ADDR_TO_MAPBASE((kaddr)) - PAGE_OFFSET) / \
191		sizeof(mem_map_t)))
192
193#else
194
195#define PHYS_TO_NID(addr)	(0)
196
197#endif /* CONFIG_DISCONTIGMEM */
198
199#endif	/* CONFIG_ARCH_EDB7211 */
200
201#ifndef PHYS_TO_NID
202#define PHYS_TO_NID(addr)	(0)
203#endif
204
205#endif
206
207