x86_64 SGI UV: Fix mapping of MMIO registers
Subsystems (2)
PATCH 1/1 x86_64 SGI UV: Fix mapping of MMIO registers
[PATCH] x86_64 SGI UV: Fix mapping of MMIO registers
This fixes the problem of the initialization code not correctly mapping the entire MMIO space on a UV system. A side effect is the map_high() interface needed to be changed to accommodate different address and size shifts.
---arch/x86/kernel/apic/x2apic_uv_x.c | 15 ++++++++-------
1 file changed, 8 insertions(+), 7 deletions(-)
arch/x86/kernel/apic/x2apic_uv_x.c +0 -0
@@ -377,13 +377,13 @@
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)
@@ -399,7 +399,7 @@
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);@@ -413,7 +413,7 @@
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)
@@ -423,7 +423,8 @@
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)
[tip:x86/urgent] x86: SGI UV: Fix mapping of MMIO registers
Commit-ID: fcfbb2b5facd65efa7284cc315225bfe3d1856c2 Gitweb: http://git.kernel.org/tip/fcfbb2b5facd65efa7284cc315225bfe3d1856c2 Author: Mike Travis <[email protected]> AuthorDate: Fri, 8 Jan 2010 12:13:54 -0800 Committer: Ingo Molnar <[email protected]> CommitDate: Wed, 13 Jan 2010 10:56:27 +0100
x86: SGI UV: Fix mapping of MMIO registers
This fixes the problem of the initialization code not correctly mapping the entire MMIO space on a UV system. A side effect is the map_high() interface needed to be changed to accommodate different address and size shifts.
LKML-Reference: <[email protected]>
--- arch/x86/kernel/apic/x2apic_uv_x.c | 15 ++++++++------- 1 files changed, 8 insertions(+), 7 deletions(-)
arch/x86/kernel/apic/x2apic_uv_x.c +8 -7
@@ -374,13 +374,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 +396,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 +410,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 +420,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 )