diff options
Diffstat (limited to 'include/asm-arm/arch-clps711x/memory.h')
-rw-r--r-- | include/asm-arm/arch-clps711x/memory.h | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/include/asm-arm/arch-clps711x/memory.h b/include/asm-arm/arch-clps711x/memory.h new file mode 100644 index 000000000000..bd978947db42 --- /dev/null +++ b/include/asm-arm/arch-clps711x/memory.h | |||
@@ -0,0 +1,128 @@ | |||
1 | /* | ||
2 | * linux/include/asm-arm/arch-clps711x/memory.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_MEMORY_H | ||
21 | #define __ASM_ARCH_MEMORY_H | ||
22 | |||
23 | #include <linux/config.h> | ||
24 | |||
25 | /* | ||
26 | * Physical DRAM offset. | ||
27 | */ | ||
28 | #define PHYS_OFFSET (0xc0000000UL) | ||
29 | |||
30 | /* | ||
31 | * Virtual view <-> DMA view memory address translations | ||
32 | * virt_to_bus: Used to translate the virtual address to an | ||
33 | * address suitable to be passed to set_dma_addr | ||
34 | * bus_to_virt: Used to convert an address for DMA operations | ||
35 | * to an address that the kernel can use. | ||
36 | */ | ||
37 | |||
38 | #if defined(CONFIG_ARCH_CDB89712) | ||
39 | |||
40 | #define __virt_to_bus(x) (x) | ||
41 | #define __bus_to_virt(x) (x) | ||
42 | |||
43 | #elif defined (CONFIG_ARCH_AUTCPU12) | ||
44 | |||
45 | #define __virt_to_bus(x) (x) | ||
46 | #define __bus_to_virt(x) (x) | ||
47 | |||
48 | #else | ||
49 | |||
50 | #define __virt_to_bus(x) ((x) - PAGE_OFFSET) | ||
51 | #define __bus_to_virt(x) ((x) + PAGE_OFFSET) | ||
52 | |||
53 | #endif | ||
54 | |||
55 | |||
56 | /* | ||
57 | * Like the SA1100, the EDB7211 has a large gap between physical RAM | ||
58 | * banks. In 2.2, the Psion (CL-PS7110) port added custom support for | ||
59 | * discontiguous physical memory. In 2.4, we can use the standard | ||
60 | * Linux NUMA support. | ||
61 | * | ||
62 | * This is not necessary for EP7211 implementations with only one used | ||
63 | * memory bank. For those systems, simply undefine CONFIG_DISCONTIGMEM. | ||
64 | */ | ||
65 | |||
66 | #ifdef CONFIG_DISCONTIGMEM | ||
67 | /* | ||
68 | * Because of the wide memory address space between physical RAM banks on the | ||
69 | * SA1100, it's much more convenient to use Linux's NUMA support to implement | ||
70 | * our memory map representation. Assuming all memory nodes have equal access | ||
71 | * characteristics, we then have generic discontiguous memory support. | ||
72 | * | ||
73 | * Of course, all this isn't mandatory for SA1100 implementations with only | ||
74 | * one used memory bank. For those, simply undefine CONFIG_DISCONTIGMEM. | ||
75 | * | ||
76 | * The nodes are matched with the physical memory bank addresses which are | ||
77 | * incidentally the same as virtual addresses. | ||
78 | * | ||
79 | * node 0: 0xc0000000 - 0xc7ffffff | ||
80 | * node 1: 0xc8000000 - 0xcfffffff | ||
81 | * node 2: 0xd0000000 - 0xd7ffffff | ||
82 | * node 3: 0xd8000000 - 0xdfffffff | ||
83 | */ | ||
84 | |||
85 | /* | ||
86 | * Given a kernel address, find the home node of the underlying memory. | ||
87 | */ | ||
88 | #define KVADDR_TO_NID(addr) \ | ||
89 | (((unsigned long)(addr) - PAGE_OFFSET) >> NODE_MAX_MEM_SHIFT) | ||
90 | |||
91 | /* | ||
92 | * Given a page frame number, convert it to a node id. | ||
93 | */ | ||
94 | #define PFN_TO_NID(pfn) \ | ||
95 | (((pfn) - PHYS_PFN_OFFSET) >> (NODE_MAX_MEM_SHIFT - PAGE_SHIFT)) | ||
96 | |||
97 | /* | ||
98 | * Given a kaddr, ADDR_TO_MAPBASE finds the owning node of the memory | ||
99 | * and returns the mem_map of that node. | ||
100 | */ | ||
101 | #define ADDR_TO_MAPBASE(kaddr) \ | ||
102 | NODE_MEM_MAP(KVADDR_TO_NID((unsigned long)(kaddr))) | ||
103 | |||
104 | #define PFN_TO_MAPBASE(pfn) NODE_MEM_MAP(PFN_TO_NID(pfn)) | ||
105 | |||
106 | /* | ||
107 | * Given a kaddr, LOCAL_MAR_NR finds the owning node of the memory | ||
108 | * and returns the index corresponding to the appropriate page in the | ||
109 | * node's mem_map. | ||
110 | */ | ||
111 | #define LOCAL_MAP_NR(addr) \ | ||
112 | (((unsigned long)(addr) & (NODE_MAX_MEM_SIZE - 1)) >> PAGE_SHIFT) | ||
113 | |||
114 | /* | ||
115 | * The PS7211 allows up to 256MB max per DRAM bank, but the EDB7211 | ||
116 | * uses only one of the two banks (bank #1). However, even within | ||
117 | * bank #1, memory is discontiguous. | ||
118 | * | ||
119 | * The EDB7211 has two 8MB DRAM areas with 8MB of empty space between | ||
120 | * them, so we use 24 for the node max shift to get 16MB node sizes. | ||
121 | */ | ||
122 | #define NODE_MAX_MEM_SHIFT 24 | ||
123 | #define NODE_MAX_MEM_SIZE (1<<NODE_MAX_MEM_SHIFT) | ||
124 | |||
125 | #endif /* CONFIG_DISCONTIGMEM */ | ||
126 | |||
127 | #endif | ||
128 | |||