diff options
-rw-r--r-- | arch/x86/kernel/genx2apic_uv_x.c | 75 | ||||
-rw-r--r-- | include/asm-x86/uv/uv_hub.h | 2 | ||||
-rw-r--r-- | include/asm-x86/uv/uv_mmrs.h | 46 |
3 files changed, 122 insertions, 1 deletions
diff --git a/arch/x86/kernel/genx2apic_uv_x.c b/arch/x86/kernel/genx2apic_uv_x.c index 45e84acca8a9..711f11c30b06 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 | /* |
diff --git a/include/asm-x86/uv/uv_hub.h b/include/asm-x86/uv/uv_hub.h index 65004881de5f..a4ef26e5850b 100644 --- a/include/asm-x86/uv/uv_hub.h +++ b/include/asm-x86/uv/uv_hub.h | |||
@@ -149,6 +149,8 @@ DECLARE_PER_CPU(struct uv_hub_info_s, __uv_hub_info); | |||
149 | #define UV_LOCAL_MMR_BASE 0xf4000000UL | 149 | #define UV_LOCAL_MMR_BASE 0xf4000000UL |
150 | #define UV_GLOBAL_MMR32_BASE 0xf8000000UL | 150 | #define UV_GLOBAL_MMR32_BASE 0xf8000000UL |
151 | #define UV_GLOBAL_MMR64_BASE (uv_hub_info->global_mmr_base) | 151 | #define UV_GLOBAL_MMR64_BASE (uv_hub_info->global_mmr_base) |
152 | #define UV_LOCAL_MMR_SIZE (64UL * 1024 * 1024) | ||
153 | #define UV_GLOBAL_MMR32_SIZE (64UL * 1024 * 1024) | ||
152 | 154 | ||
153 | #define UV_GLOBAL_MMR32_PNODE_SHIFT 15 | 155 | #define UV_GLOBAL_MMR32_PNODE_SHIFT 15 |
154 | #define UV_GLOBAL_MMR64_PNODE_SHIFT 26 | 156 | #define UV_GLOBAL_MMR64_PNODE_SHIFT 26 |
diff --git a/include/asm-x86/uv/uv_mmrs.h b/include/asm-x86/uv/uv_mmrs.h index ac9846076521..37113f554a97 100644 --- a/include/asm-x86/uv/uv_mmrs.h +++ b/include/asm-x86/uv/uv_mmrs.h | |||
@@ -713,6 +713,26 @@ union uvh_rh_gam_alias210_redirect_config_2_mmr_u { | |||
713 | }; | 713 | }; |
714 | 714 | ||
715 | /* ========================================================================= */ | 715 | /* ========================================================================= */ |
716 | /* UVH_RH_GAM_CFG_OVERLAY_CONFIG_MMR */ | ||
717 | /* ========================================================================= */ | ||
718 | #define UVH_RH_GAM_CFG_OVERLAY_CONFIG_MMR 0x1600020UL | ||
719 | |||
720 | #define UVH_RH_GAM_CFG_OVERLAY_CONFIG_MMR_BASE_SHFT 26 | ||
721 | #define UVH_RH_GAM_CFG_OVERLAY_CONFIG_MMR_BASE_MASK 0x00003ffffc000000UL | ||
722 | #define UVH_RH_GAM_CFG_OVERLAY_CONFIG_MMR_ENABLE_SHFT 63 | ||
723 | #define UVH_RH_GAM_CFG_OVERLAY_CONFIG_MMR_ENABLE_MASK 0x8000000000000000UL | ||
724 | |||
725 | union uvh_rh_gam_cfg_overlay_config_mmr_u { | ||
726 | unsigned long v; | ||
727 | struct uvh_rh_gam_cfg_overlay_config_mmr_s { | ||
728 | unsigned long rsvd_0_25: 26; /* */ | ||
729 | unsigned long base : 20; /* RW */ | ||
730 | unsigned long rsvd_46_62: 17; /* */ | ||
731 | unsigned long enable : 1; /* RW */ | ||
732 | } s; | ||
733 | }; | ||
734 | |||
735 | /* ========================================================================= */ | ||
716 | /* UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR */ | 736 | /* UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR */ |
717 | /* ========================================================================= */ | 737 | /* ========================================================================= */ |
718 | #define UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR 0x1600010UL | 738 | #define UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR 0x1600010UL |
@@ -740,6 +760,32 @@ union uvh_rh_gam_gru_overlay_config_mmr_u { | |||
740 | }; | 760 | }; |
741 | 761 | ||
742 | /* ========================================================================= */ | 762 | /* ========================================================================= */ |
763 | /* UVH_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR */ | ||
764 | /* ========================================================================= */ | ||
765 | #define UVH_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR 0x1600030UL | ||
766 | |||
767 | #define UVH_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR_BASE_SHFT 30 | ||
768 | #define UVH_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR_BASE_MASK 0x00003fffc0000000UL | ||
769 | #define UVH_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR_M_IO_SHFT 46 | ||
770 | #define UVH_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR_M_IO_MASK 0x000fc00000000000UL | ||
771 | #define UVH_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR_N_IO_SHFT 52 | ||
772 | #define UVH_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR_N_IO_MASK 0x00f0000000000000UL | ||
773 | #define UVH_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR_ENABLE_SHFT 63 | ||
774 | #define UVH_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR_ENABLE_MASK 0x8000000000000000UL | ||
775 | |||
776 | union uvh_rh_gam_mmioh_overlay_config_mmr_u { | ||
777 | unsigned long v; | ||
778 | struct uvh_rh_gam_mmioh_overlay_config_mmr_s { | ||
779 | unsigned long rsvd_0_29: 30; /* */ | ||
780 | unsigned long base : 16; /* RW */ | ||
781 | unsigned long m_io : 6; /* RW */ | ||
782 | unsigned long n_io : 4; /* RW */ | ||
783 | unsigned long rsvd_56_62: 7; /* */ | ||
784 | unsigned long enable : 1; /* RW */ | ||
785 | } s; | ||
786 | }; | ||
787 | |||
788 | /* ========================================================================= */ | ||
743 | /* UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR */ | 789 | /* UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR */ |
744 | /* ========================================================================= */ | 790 | /* ========================================================================= */ |
745 | #define UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR 0x1600028UL | 791 | #define UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR 0x1600028UL |