Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 173058
b: refs/heads/master
c: fd12a0d
h: refs/heads/master
v: v3
  • Loading branch information
Jack Steiner authored and Ingo Molnar committed Nov 23, 2009
1 parent 6e7c226 commit ab8d454
Show file tree
Hide file tree
Showing 6 changed files with 34 additions and 5 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: e38e2af1c57c3eb5211331a5b4fcaae0c4a2a918
refs/heads/master: fd12a0d69aee6d90fa9b9890db24368a897f8423
2 changes: 2 additions & 0 deletions trunk/arch/x86/include/asm/pat.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,6 @@ int io_reserve_memtype(resource_size_t start, resource_size_t end,

void io_free_memtype(resource_size_t start, resource_size_t end);

int default_is_untracked_pat_range(u64 start, u64 end);

#endif /* _ASM_X86_PAT_H */
2 changes: 2 additions & 0 deletions trunk/arch/x86/include/asm/x86_init.h
Original file line number Diff line number Diff line change
Expand Up @@ -113,11 +113,13 @@ struct x86_cpuinit_ops {

/**
* struct x86_platform_ops - platform specific runtime functions
* @is_untracked_pat_range exclude from PAT logic
* @calibrate_tsc: calibrate TSC
* @get_wallclock: get time from HW clock like RTC etc.
* @set_wallclock: set time back to HW clock
*/
struct x86_platform_ops {
int (*is_untracked_pat_range)(u64 start, u64 end);
unsigned long (*calibrate_tsc)(void);
unsigned long (*get_wallclock)(void);
int (*set_wallclock)(unsigned long nowtime);
Expand Down
19 changes: 18 additions & 1 deletion trunk/arch/x86/kernel/apic/x2apic_uv_x.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,22 @@
#include <asm/apic.h>
#include <asm/ipi.h>
#include <asm/smp.h>
#include <asm/x86_init.h>

DEFINE_PER_CPU(int, x2apic_extra_bits);

static enum uv_system_type uv_system_type;
static u64 gru_start_paddr, gru_end_paddr;

static int is_GRU_range(u64 start, u64 end)
{
return start >= gru_start_paddr && end < gru_end_paddr;
}

static int uv_is_untracked_pat_range(u64 start, u64 end)
{
return is_ISA_range(start, end) || is_GRU_range(start, end);
}

static int early_get_nodeid(void)
{
Expand All @@ -49,6 +61,7 @@ static int early_get_nodeid(void)
static int __init uv_acpi_madt_oem_check(char *oem_id, char *oem_table_id)
{
if (!strcmp(oem_id, "SGI")) {
x86_platform.is_untracked_pat_range = uv_is_untracked_pat_range;
if (!strcmp(oem_table_id, "UVL"))
uv_system_type = UV_LEGACY_APIC;
else if (!strcmp(oem_table_id, "UVX"))
Expand Down Expand Up @@ -385,8 +398,12 @@ static __init void map_gru_high(int max_pnode)
int shift = UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR_BASE_SHFT;

gru.v = uv_read_local_mmr(UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR);
if (gru.s.enable)
if (gru.s.enable) {
map_high("GRU", gru.s.base, shift, max_pnode, map_wb);
gru_start_paddr = ((u64)gru.s.base << shift);
gru_end_paddr = gru_start_paddr + (1UL << shift) * (max_pnode + 1);

}
}

static __init void map_mmr_high(int max_pnode)
Expand Down
2 changes: 2 additions & 0 deletions trunk/arch/x86/kernel/x86_init.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
#include <asm/e820.h>
#include <asm/time.h>
#include <asm/irq.h>
#include <asm/pat.h>
#include <asm/tsc.h>

void __cpuinit x86_init_noop(void) { }
Expand Down Expand Up @@ -69,6 +70,7 @@ struct x86_cpuinit_ops x86_cpuinit __cpuinitdata = {
};

struct x86_platform_ops x86_platform = {
.is_untracked_pat_range = default_is_untracked_pat_range,
.calibrate_tsc = native_calibrate_tsc,
.get_wallclock = mach_get_cmos_time,
.set_wallclock = mach_set_rtc_mmss,
Expand Down
12 changes: 9 additions & 3 deletions trunk/arch/x86/mm/pat.c
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
#include <asm/cacheflush.h>
#include <asm/processor.h>
#include <asm/tlbflush.h>
#include <asm/x86_init.h>
#include <asm/pgtable.h>
#include <asm/fcntl.h>
#include <asm/e820.h>
Expand Down Expand Up @@ -348,6 +349,11 @@ static int free_ram_pages_type(u64 start, u64 end)
return 0;
}

int default_is_untracked_pat_range(u64 start, u64 end)
{
return is_ISA_range(start, end);
}

/*
* req_type typically has one of the:
* - _PAGE_CACHE_WB
Expand Down Expand Up @@ -388,7 +394,7 @@ int reserve_memtype(u64 start, u64 end, unsigned long req_type,
}

/* Low ISA region is always mapped WB in page table. No need to track */
if (is_ISA_range(start, end - 1)) {
if (x86_platform.is_untracked_pat_range(start, end - 1)) {
if (new_type)
*new_type = _PAGE_CACHE_WB;
return 0;
Expand Down Expand Up @@ -499,7 +505,7 @@ int free_memtype(u64 start, u64 end)
return 0;

/* Low ISA region is always mapped WB. No need to track */
if (is_ISA_range(start, end - 1))
if (x86_platform.is_untracked_pat_range(start, end - 1))
return 0;

is_range_ram = pat_pagerange_is_ram(start, end);
Expand Down Expand Up @@ -582,7 +588,7 @@ static unsigned long lookup_memtype(u64 paddr)
int rettype = _PAGE_CACHE_WB;
struct memtype *entry;

if (is_ISA_range(paddr, paddr + PAGE_SIZE - 1))
if (x86_platform.is_untracked_pat_range(paddr, paddr + PAGE_SIZE - 1))
return rettype;

if (pat_pagerange_is_ram(paddr, paddr + PAGE_SIZE)) {
Expand Down

0 comments on commit ab8d454

Please sign in to comment.