2 * This file is subject to the terms and conditions of the GNU General Public
3 * License. See the file "COPYING" in the main directory of this archive
6 * SGI UV Core Functions
8 * Copyright (C) 2008 Silicon Graphics, Inc. All rights reserved.
11 #include <linux/module.h>
12 #include <linux/percpu.h>
13 #include <asm/sn/simulator.h>
14 #include <asm/uv/uv_mmrs.h>
15 #include <asm/uv/uv_hub.h>
17 DEFINE_PER_CPU(struct uv_hub_info_s
, __uv_hub_info
);
18 EXPORT_PER_CPU_SYMBOL_GPL(__uv_hub_info
);
22 unsigned long redirect
;
26 #define DEST_SHIFT UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_0_MMR_DEST_BASE_SHFT
28 static __initdata
struct redir_addr redir_addrs
[] = {
29 {UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_0_MMR
, UVH_SI_ALIAS0_OVERLAY_CONFIG
},
30 {UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_1_MMR
, UVH_SI_ALIAS1_OVERLAY_CONFIG
},
31 {UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_2_MMR
, UVH_SI_ALIAS2_OVERLAY_CONFIG
},
34 static __init
void get_lowmem_redirect(unsigned long *base
, unsigned long *size
)
36 union uvh_si_alias0_overlay_config_u alias
;
37 union uvh_rh_gam_alias210_redirect_config_2_mmr_u redirect
;
40 for (i
= 0; i
< ARRAY_SIZE(redir_addrs
); i
++) {
41 alias
.v
= uv_read_local_mmr(redir_addrs
[i
].alias
);
42 if (alias
.s
.base
== 0) {
43 *size
= (1UL << alias
.s
.m_alias
);
44 redirect
.v
= uv_read_local_mmr(redir_addrs
[i
].redirect
);
45 *base
= (unsigned long)redirect
.s
.dest_base
<< DEST_SHIFT
;
52 void __init
uv_setup(char **cmdline_p
)
54 union uvh_si_addr_map_config_u m_n_config
;
55 union uvh_node_id_u node_id
;
56 unsigned long gnode_upper
;
57 int nid
, cpu
, m_val
, n_val
;
58 unsigned long mmr_base
, lowmem_redir_base
, lowmem_redir_size
;
61 lowmem_redir_base
= 0;
62 lowmem_redir_size
= 0;
64 m_n_config
.s
.m_skt
= 37;
65 m_n_config
.s
.n_skt
= 0;
68 get_lowmem_redirect(&lowmem_redir_base
, &lowmem_redir_size
);
69 node_id
.v
= uv_read_local_mmr(UVH_NODE_ID
);
70 m_n_config
.v
= uv_read_local_mmr(UVH_SI_ADDR_MAP_CONFIG
);
72 uv_read_local_mmr(UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR
) &
76 m_val
= m_n_config
.s
.m_skt
;
77 n_val
= m_n_config
.s
.n_skt
;
78 printk(KERN_DEBUG
"UV: global MMR base 0x%lx\n", mmr_base
);
80 gnode_upper
= (((unsigned long)node_id
.s
.node_id
) &
81 ~((1 << n_val
) - 1)) << m_val
;
83 for_each_present_cpu(cpu
) {
84 nid
= cpu_to_node(cpu
);
85 uv_cpu_hub_info(cpu
)->lowmem_remap_base
= lowmem_redir_base
;
86 uv_cpu_hub_info(cpu
)->lowmem_remap_top
=
87 lowmem_redir_base
+ lowmem_redir_size
;
88 uv_cpu_hub_info(cpu
)->m_val
= m_val
;
89 uv_cpu_hub_info(cpu
)->n_val
= m_val
;
90 uv_cpu_hub_info(cpu
)->pnode_mask
= (1 << n_val
) -1;
91 uv_cpu_hub_info(cpu
)->gpa_mask
= (1 << (m_val
+ n_val
)) - 1;
92 uv_cpu_hub_info(cpu
)->gnode_upper
= gnode_upper
;
93 uv_cpu_hub_info(cpu
)->global_mmr_base
= mmr_base
;
94 uv_cpu_hub_info(cpu
)->coherency_domain_number
= 0;/* ZZZ */
95 printk(KERN_DEBUG
"UV cpu %d, nid %d\n", cpu
, nid
);