|
@@ -36,6 +36,8 @@ DEFINE_PER_CPU(int, x2apic_extra_bits);
|
|
|
|
|
|
static enum uv_system_type uv_system_type;
|
|
|
static u64 gru_start_paddr, gru_end_paddr;
|
|
|
+int uv_min_hub_revision_id;
|
|
|
+EXPORT_SYMBOL_GPL(uv_min_hub_revision_id);
|
|
|
|
|
|
static inline bool is_GRU_range(u64 start, u64 end)
|
|
|
{
|
|
@@ -55,12 +57,19 @@ static int early_get_nodeid(void)
|
|
|
mmr = early_ioremap(UV_LOCAL_MMR_BASE | UVH_NODE_ID, sizeof(*mmr));
|
|
|
node_id.v = *mmr;
|
|
|
early_iounmap(mmr, sizeof(*mmr));
|
|
|
+
|
|
|
+ /* Currently, all blades have same revision number */
|
|
|
+ uv_min_hub_revision_id = node_id.s.revision;
|
|
|
+
|
|
|
return node_id.s.node_id;
|
|
|
}
|
|
|
|
|
|
static int __init uv_acpi_madt_oem_check(char *oem_id, char *oem_table_id)
|
|
|
{
|
|
|
+ int nodeid;
|
|
|
+
|
|
|
if (!strcmp(oem_id, "SGI")) {
|
|
|
+ nodeid = early_get_nodeid();
|
|
|
x86_platform.is_untracked_pat_range = uv_is_untracked_pat_range;
|
|
|
if (!strcmp(oem_table_id, "UVL"))
|
|
|
uv_system_type = UV_LEGACY_APIC;
|
|
@@ -68,7 +77,7 @@ static int __init uv_acpi_madt_oem_check(char *oem_id, char *oem_table_id)
|
|
|
uv_system_type = UV_X2APIC;
|
|
|
else if (!strcmp(oem_table_id, "UVH")) {
|
|
|
__get_cpu_var(x2apic_extra_bits) =
|
|
|
- early_get_nodeid() << (UV_APIC_PNODE_SHIFT - 1);
|
|
|
+ nodeid << (UV_APIC_PNODE_SHIFT - 1);
|
|
|
uv_system_type = UV_NON_UNIQUE_APIC;
|
|
|
return 1;
|
|
|
}
|
|
@@ -374,13 +383,13 @@ static __init void get_lowmem_redirect(unsigned long *base, unsigned long *size)
|
|
|
|
|
|
enum map_type {map_wb, map_uc};
|
|
|
|
|
|
-static __init void map_high(char *id, unsigned long base, int shift,
|
|
|
- int max_pnode, enum map_type map_type)
|
|
|
+static __init void map_high(char *id, unsigned long base, int pshift,
|
|
|
+ int bshift, int max_pnode, enum map_type map_type)
|
|
|
{
|
|
|
unsigned long bytes, paddr;
|
|
|
|
|
|
- paddr = base << shift;
|
|
|
- bytes = (1UL << shift) * (max_pnode + 1);
|
|
|
+ paddr = base << pshift;
|
|
|
+ bytes = (1UL << bshift) * (max_pnode + 1);
|
|
|
printk(KERN_INFO "UV: Map %s_HI 0x%lx - 0x%lx\n", id, paddr,
|
|
|
paddr + bytes);
|
|
|
if (map_type == map_uc)
|
|
@@ -396,7 +405,7 @@ static __init void map_gru_high(int max_pnode)
|
|
|
|
|
|
gru.v = uv_read_local_mmr(UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR);
|
|
|
if (gru.s.enable) {
|
|
|
- map_high("GRU", gru.s.base, shift, max_pnode, map_wb);
|
|
|
+ map_high("GRU", gru.s.base, shift, shift, max_pnode, map_wb);
|
|
|
gru_start_paddr = ((u64)gru.s.base << shift);
|
|
|
gru_end_paddr = gru_start_paddr + (1UL << shift) * (max_pnode + 1);
|
|
|
|
|
@@ -410,7 +419,7 @@ static __init void map_mmr_high(int max_pnode)
|
|
|
|
|
|
mmr.v = uv_read_local_mmr(UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR);
|
|
|
if (mmr.s.enable)
|
|
|
- map_high("MMR", mmr.s.base, shift, max_pnode, map_uc);
|
|
|
+ map_high("MMR", mmr.s.base, shift, shift, max_pnode, map_uc);
|
|
|
}
|
|
|
|
|
|
static __init void map_mmioh_high(int max_pnode)
|
|
@@ -420,7 +429,8 @@ static __init void map_mmioh_high(int max_pnode)
|
|
|
|
|
|
mmioh.v = uv_read_local_mmr(UVH_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR);
|
|
|
if (mmioh.s.enable)
|
|
|
- map_high("MMIOH", mmioh.s.base, shift, max_pnode, map_uc);
|
|
|
+ map_high("MMIOH", mmioh.s.base, shift, mmioh.s.m_io,
|
|
|
+ max_pnode, map_uc);
|
|
|
}
|
|
|
|
|
|
static __init void map_low_mmrs(void)
|