@@ -48,6 +48,16 @@ unsigned int uv_apicid_hibits;
48
48
EXPORT_SYMBOL_GPL (uv_apicid_hibits );
49
49
static DEFINE_SPINLOCK (uv_nmi_lock );
50
50
51
+ static unsigned long __init uv_early_read_mmr (unsigned long addr )
52
+ {
53
+ unsigned long val , * mmr ;
54
+
55
+ mmr = early_ioremap (UV_LOCAL_MMR_BASE | addr , sizeof (* mmr ));
56
+ val = * mmr ;
57
+ early_iounmap (mmr , sizeof (* mmr ));
58
+ return val ;
59
+ }
60
+
51
61
static inline bool is_GRU_range (u64 start , u64 end )
52
62
{
53
63
return start >= gru_start_paddr && end <= gru_end_paddr ;
@@ -58,28 +68,24 @@ static bool uv_is_untracked_pat_range(u64 start, u64 end)
58
68
return is_ISA_range (start , end ) || is_GRU_range (start , end );
59
69
}
60
70
61
- static int early_get_nodeid (void )
71
+ static int __init early_get_pnodeid (void )
62
72
{
63
73
union uvh_node_id_u node_id ;
64
- unsigned long * mmr ;
65
-
66
- mmr = early_ioremap (UV_LOCAL_MMR_BASE | UVH_NODE_ID , sizeof (* mmr ));
67
- node_id .v = * mmr ;
68
- early_iounmap (mmr , sizeof (* mmr ));
74
+ union uvh_rh_gam_config_mmr_u m_n_config ;
75
+ int pnode ;
69
76
70
77
/* Currently, all blades have same revision number */
78
+ node_id .v = uv_early_read_mmr (UVH_NODE_ID );
79
+ m_n_config .v = uv_early_read_mmr (UVH_RH_GAM_CONFIG_MMR );
71
80
uv_min_hub_revision_id = node_id .s .revision ;
72
81
73
- return node_id .s .node_id ;
82
+ pnode = (node_id .s .node_id >> 1 ) & ((1 << m_n_config .s .n_skt ) - 1 );
83
+ return pnode ;
74
84
}
75
85
76
86
static void __init early_get_apic_pnode_shift (void )
77
87
{
78
- unsigned long * mmr ;
79
-
80
- mmr = early_ioremap (UV_LOCAL_MMR_BASE | UVH_APICID , sizeof (* mmr ));
81
- uvh_apicid .v = * mmr ;
82
- early_iounmap (mmr , sizeof (* mmr ));
88
+ uvh_apicid .v = uv_early_read_mmr (UVH_APICID );
83
89
if (!uvh_apicid .v )
84
90
/*
85
91
* Old bios, use default value
@@ -95,21 +101,17 @@ static void __init early_get_apic_pnode_shift(void)
95
101
static void __init uv_set_apicid_hibit (void )
96
102
{
97
103
union uvh_lb_target_physical_apic_id_mask_u apicid_mask ;
98
- unsigned long * mmr ;
99
104
100
- mmr = early_ioremap (UV_LOCAL_MMR_BASE |
101
- UVH_LB_TARGET_PHYSICAL_APIC_ID_MASK , sizeof (* mmr ));
102
- apicid_mask .v = * mmr ;
103
- early_iounmap (mmr , sizeof (* mmr ));
105
+ apicid_mask .v = uv_early_read_mmr (UVH_LB_TARGET_PHYSICAL_APIC_ID_MASK );
104
106
uv_apicid_hibits = apicid_mask .s .bit_enables & UV_APICID_HIBIT_MASK ;
105
107
}
106
108
107
109
static int __init uv_acpi_madt_oem_check (char * oem_id , char * oem_table_id )
108
110
{
109
- int nodeid ;
111
+ int pnodeid ;
110
112
111
113
if (!strcmp (oem_id , "SGI" )) {
112
- nodeid = early_get_nodeid ();
114
+ pnodeid = early_get_pnodeid ();
113
115
early_get_apic_pnode_shift ();
114
116
x86_platform .is_untracked_pat_range = uv_is_untracked_pat_range ;
115
117
x86_platform .nmi_init = uv_nmi_init ;
@@ -119,7 +121,7 @@ static int __init uv_acpi_madt_oem_check(char *oem_id, char *oem_table_id)
119
121
uv_system_type = UV_X2APIC ;
120
122
else if (!strcmp (oem_table_id , "UVH" )) {
121
123
__get_cpu_var (x2apic_extra_bits ) =
122
- nodeid << ( uvh_apicid .s .pnode_shift - 1 ) ;
124
+ pnodeid << uvh_apicid .s .pnode_shift ;
123
125
uv_system_type = UV_NON_UNIQUE_APIC ;
124
126
uv_set_apicid_hibit ();
125
127
return 1 ;
@@ -682,27 +684,32 @@ void uv_nmi_init(void)
682
684
void __init uv_system_init (void )
683
685
{
684
686
union uvh_rh_gam_config_mmr_u m_n_config ;
687
+ union uvh_rh_gam_mmioh_overlay_config_mmr_u mmioh ;
685
688
union uvh_node_id_u node_id ;
686
689
unsigned long gnode_upper , lowmem_redir_base , lowmem_redir_size ;
687
- int bytes , nid , cpu , lcpu , pnode , blade , i , j , m_val , n_val ;
690
+ int bytes , nid , cpu , lcpu , pnode , blade , i , j , m_val , n_val , n_io ;
688
691
int gnode_extra , max_pnode = 0 ;
689
692
unsigned long mmr_base , present , paddr ;
690
- unsigned short pnode_mask ;
693
+ unsigned short pnode_mask , pnode_io_mask ;
691
694
692
695
map_low_mmrs ();
693
696
694
697
m_n_config .v = uv_read_local_mmr (UVH_RH_GAM_CONFIG_MMR );
695
698
m_val = m_n_config .s .m_skt ;
696
699
n_val = m_n_config .s .n_skt ;
700
+ mmioh .v = uv_read_local_mmr (UVH_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR );
701
+ n_io = mmioh .s .n_io ;
697
702
mmr_base =
698
703
uv_read_local_mmr (UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR ) &
699
704
~UV_MMR_ENABLE ;
700
705
pnode_mask = (1 << n_val ) - 1 ;
706
+ pnode_io_mask = (1 << n_io ) - 1 ;
707
+
701
708
node_id .v = uv_read_local_mmr (UVH_NODE_ID );
702
709
gnode_extra = (node_id .s .node_id & ~((1 << n_val ) - 1 )) >> 1 ;
703
710
gnode_upper = ((unsigned long )gnode_extra << m_val );
704
- printk (KERN_DEBUG "UV: N %d, M %d, gnode_upper 0x%lx, gnode_extra 0x%x\n" ,
705
- n_val , m_val , gnode_upper , gnode_extra );
711
+ printk (KERN_INFO "UV: N %d, M %d, N_IO: %d, gnode_upper 0x%lx, gnode_extra 0x%x, pnode_mask 0x%x, pnode_io_mask 0x%x\n" ,
712
+ n_val , m_val , n_io , gnode_upper , gnode_extra , pnode_mask , pnode_io_mask );
706
713
707
714
printk (KERN_DEBUG "UV: global MMR base 0x%lx\n" , mmr_base );
708
715
@@ -735,7 +742,7 @@ void __init uv_system_init(void)
735
742
for (j = 0 ; j < 64 ; j ++ ) {
736
743
if (!test_bit (j , & present ))
737
744
continue ;
738
- pnode = (i * 64 + j );
745
+ pnode = (i * 64 + j ) & pnode_mask ;
739
746
uv_blade_info [blade ].pnode = pnode ;
740
747
uv_blade_info [blade ].nr_possible_cpus = 0 ;
741
748
uv_blade_info [blade ].nr_online_cpus = 0 ;
@@ -756,6 +763,7 @@ void __init uv_system_init(void)
756
763
/*
757
764
* apic_pnode_shift must be set before calling uv_apicid_to_pnode();
758
765
*/
766
+ uv_cpu_hub_info (cpu )-> pnode_mask = pnode_mask ;
759
767
uv_cpu_hub_info (cpu )-> apic_pnode_shift = uvh_apicid .s .pnode_shift ;
760
768
pnode = uv_apicid_to_pnode (apicid );
761
769
blade = boot_pnode_to_blade (pnode );
@@ -772,7 +780,6 @@ void __init uv_system_init(void)
772
780
uv_cpu_hub_info (cpu )-> numa_blade_id = blade ;
773
781
uv_cpu_hub_info (cpu )-> blade_processor_id = lcpu ;
774
782
uv_cpu_hub_info (cpu )-> pnode = pnode ;
775
- uv_cpu_hub_info (cpu )-> pnode_mask = pnode_mask ;
776
783
uv_cpu_hub_info (cpu )-> gpa_mask = (1UL << (m_val + n_val )) - 1 ;
777
784
uv_cpu_hub_info (cpu )-> gnode_upper = gnode_upper ;
778
785
uv_cpu_hub_info (cpu )-> gnode_extra = gnode_extra ;
@@ -796,7 +803,7 @@ void __init uv_system_init(void)
796
803
797
804
map_gru_high (max_pnode );
798
805
map_mmr_high (max_pnode );
799
- map_mmioh_high (max_pnode );
806
+ map_mmioh_high (max_pnode & pnode_io_mask );
800
807
801
808
uv_cpu_init ();
802
809
uv_scir_register_cpu_notifier ();
0 commit comments