diff options
author | Jack Steiner <steiner@sgi.com> | 2008-07-01 15:45:38 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-07-09 01:43:23 -0400 |
commit | 83f5d894ca5280bfcd904dfeb1347c2da2b19aac (patch) | |
tree | 63c8ff85f0144a645137bebd0961fc25fce82a03 /arch/x86/kernel/genx2apic_uv_x.c | |
parent | 3a9e189d69479736a0d0901c87ad08c9e328b389 (diff) |
x86: map UV chipset space - UV support
Create page table entries to map the SGI UV chipset GRU. local MMR &
global MMR ranges.
Signed-off-by: Jack Steiner <steiner@sgi.com>
Cc: linux-mm@kvack.org
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86/kernel/genx2apic_uv_x.c')
-rw-r--r-- | arch/x86/kernel/genx2apic_uv_x.c | 75 |
1 files changed, 74 insertions, 1 deletions
diff --git a/arch/x86/kernel/genx2apic_uv_x.c b/arch/x86/kernel/genx2apic_uv_x.c index 45e84acca8a..711f11c30b0 100644 --- a/arch/x86/kernel/genx2apic_uv_x.c +++ b/arch/x86/kernel/genx2apic_uv_x.c | |||
@@ -8,6 +8,7 @@ | |||
8 | * Copyright (C) 2007-2008 Silicon Graphics, Inc. All rights reserved. | 8 | * Copyright (C) 2007-2008 Silicon Graphics, Inc. All rights reserved. |
9 | */ | 9 | */ |
10 | 10 | ||
11 | #include <linux/kernel.h> | ||
11 | #include <linux/threads.h> | 12 | #include <linux/threads.h> |
12 | #include <linux/cpumask.h> | 13 | #include <linux/cpumask.h> |
13 | #include <linux/string.h> | 14 | #include <linux/string.h> |
@@ -20,6 +21,7 @@ | |||
20 | #include <asm/smp.h> | 21 | #include <asm/smp.h> |
21 | #include <asm/ipi.h> | 22 | #include <asm/ipi.h> |
22 | #include <asm/genapic.h> | 23 | #include <asm/genapic.h> |
24 | #include <asm/pgtable.h> | ||
23 | #include <asm/uv/uv_mmrs.h> | 25 | #include <asm/uv/uv_mmrs.h> |
24 | #include <asm/uv/uv_hub.h> | 26 | #include <asm/uv/uv_hub.h> |
25 | 27 | ||
@@ -208,14 +210,79 @@ static __init void get_lowmem_redirect(unsigned long *base, unsigned long *size) | |||
208 | BUG(); | 210 | BUG(); |
209 | } | 211 | } |
210 | 212 | ||
213 | static __init void map_low_mmrs(void) | ||
214 | { | ||
215 | init_extra_mapping_uc(UV_GLOBAL_MMR32_BASE, UV_GLOBAL_MMR32_SIZE); | ||
216 | init_extra_mapping_uc(UV_LOCAL_MMR_BASE, UV_LOCAL_MMR_SIZE); | ||
217 | } | ||
218 | |||
219 | enum map_type {map_wb, map_uc}; | ||
220 | |||
221 | static void map_high(char *id, unsigned long base, int shift, enum map_type map_type) | ||
222 | { | ||
223 | unsigned long bytes, paddr; | ||
224 | |||
225 | paddr = base << shift; | ||
226 | bytes = (1UL << shift); | ||
227 | printk(KERN_INFO "UV: Map %s_HI 0x%lx - 0x%lx\n", id, paddr, | ||
228 | paddr + bytes); | ||
229 | if (map_type == map_uc) | ||
230 | init_extra_mapping_uc(paddr, bytes); | ||
231 | else | ||
232 | init_extra_mapping_wb(paddr, bytes); | ||
233 | |||
234 | } | ||
235 | static __init void map_gru_high(int max_pnode) | ||
236 | { | ||
237 | union uvh_rh_gam_gru_overlay_config_mmr_u gru; | ||
238 | int shift = UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR_BASE_SHFT; | ||
239 | |||
240 | gru.v = uv_read_local_mmr(UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR); | ||
241 | if (gru.s.enable) | ||
242 | map_high("GRU", gru.s.base, shift, map_wb); | ||
243 | } | ||
244 | |||
245 | static __init void map_config_high(int max_pnode) | ||
246 | { | ||
247 | union uvh_rh_gam_cfg_overlay_config_mmr_u cfg; | ||
248 | int shift = UVH_RH_GAM_CFG_OVERLAY_CONFIG_MMR_BASE_SHFT; | ||
249 | |||
250 | cfg.v = uv_read_local_mmr(UVH_RH_GAM_CFG_OVERLAY_CONFIG_MMR); | ||
251 | if (cfg.s.enable) | ||
252 | map_high("CONFIG", cfg.s.base, shift, map_uc); | ||
253 | } | ||
254 | |||
255 | static __init void map_mmr_high(int max_pnode) | ||
256 | { | ||
257 | union uvh_rh_gam_mmr_overlay_config_mmr_u mmr; | ||
258 | int shift = UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR_BASE_SHFT; | ||
259 | |||
260 | mmr.v = uv_read_local_mmr(UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR); | ||
261 | if (mmr.s.enable) | ||
262 | map_high("MMR", mmr.s.base, shift, map_uc); | ||
263 | } | ||
264 | |||
265 | static __init void map_mmioh_high(int max_pnode) | ||
266 | { | ||
267 | union uvh_rh_gam_mmioh_overlay_config_mmr_u mmioh; | ||
268 | int shift = UVH_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR_BASE_SHFT; | ||
269 | |||
270 | mmioh.v = uv_read_local_mmr(UVH_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR); | ||
271 | if (mmioh.s.enable) | ||
272 | map_high("MMIOH", mmioh.s.base, shift, map_uc); | ||
273 | } | ||
274 | |||
211 | static __init void uv_system_init(void) | 275 | static __init void uv_system_init(void) |
212 | { | 276 | { |
213 | union uvh_si_addr_map_config_u m_n_config; | 277 | union uvh_si_addr_map_config_u m_n_config; |
214 | union uvh_node_id_u node_id; | 278 | union uvh_node_id_u node_id; |
215 | unsigned long gnode_upper, lowmem_redir_base, lowmem_redir_size; | 279 | unsigned long gnode_upper, lowmem_redir_base, lowmem_redir_size; |
216 | int bytes, nid, cpu, lcpu, pnode, blade, i, j, m_val, n_val; | 280 | int bytes, nid, cpu, lcpu, pnode, blade, i, j, m_val, n_val; |
281 | int max_pnode = 0; | ||
217 | unsigned long mmr_base, present; | 282 | unsigned long mmr_base, present; |
218 | 283 | ||
284 | map_low_mmrs(); | ||
285 | |||
219 | m_n_config.v = uv_read_local_mmr(UVH_SI_ADDR_MAP_CONFIG); | 286 | m_n_config.v = uv_read_local_mmr(UVH_SI_ADDR_MAP_CONFIG); |
220 | m_val = m_n_config.s.m_skt; | 287 | m_val = m_n_config.s.m_skt; |
221 | n_val = m_n_config.s.n_skt; | 288 | n_val = m_n_config.s.n_skt; |
@@ -281,12 +348,18 @@ static __init void uv_system_init(void) | |||
281 | uv_cpu_hub_info(cpu)->coherency_domain_number = 0;/* ZZZ */ | 348 | uv_cpu_hub_info(cpu)->coherency_domain_number = 0;/* ZZZ */ |
282 | uv_node_to_blade[nid] = blade; | 349 | uv_node_to_blade[nid] = blade; |
283 | uv_cpu_to_blade[cpu] = blade; | 350 | uv_cpu_to_blade[cpu] = blade; |
351 | max_pnode = max(pnode, max_pnode); | ||
284 | 352 | ||
285 | printk(KERN_DEBUG "UV cpu %d, apicid 0x%x, pnode %d, nid %d, " | 353 | printk(KERN_DEBUG "UV: cpu %d, apicid 0x%x, pnode %d, nid %d, " |
286 | "lcpu %d, blade %d\n", | 354 | "lcpu %d, blade %d\n", |
287 | cpu, per_cpu(x86_cpu_to_apicid, cpu), pnode, nid, | 355 | cpu, per_cpu(x86_cpu_to_apicid, cpu), pnode, nid, |
288 | lcpu, blade); | 356 | lcpu, blade); |
289 | } | 357 | } |
358 | |||
359 | map_gru_high(max_pnode); | ||
360 | map_mmr_high(max_pnode); | ||
361 | map_config_high(max_pnode); | ||
362 | map_mmioh_high(max_pnode); | ||
290 | } | 363 | } |
291 | 364 | ||
292 | /* | 365 | /* |