diff options
-rw-r--r-- | arch/x86/include/asm/pat.h | 2 | ||||
-rw-r--r-- | arch/x86/include/asm/x86_init.h | 2 | ||||
-rw-r--r-- | arch/x86/kernel/apic/x2apic_uv_x.c | 19 | ||||
-rw-r--r-- | arch/x86/kernel/x86_init.c | 2 | ||||
-rw-r--r-- | arch/x86/mm/pat.c | 12 |
5 files changed, 33 insertions, 4 deletions
diff --git a/arch/x86/include/asm/pat.h b/arch/x86/include/asm/pat.h index e2c1668dde7a..4c35dd016b54 100644 --- a/arch/x86/include/asm/pat.h +++ b/arch/x86/include/asm/pat.h | |||
@@ -24,4 +24,6 @@ int io_reserve_memtype(resource_size_t start, resource_size_t end, | |||
24 | 24 | ||
25 | void io_free_memtype(resource_size_t start, resource_size_t end); | 25 | void io_free_memtype(resource_size_t start, resource_size_t end); |
26 | 26 | ||
27 | int default_is_untracked_pat_range(u64 start, u64 end); | ||
28 | |||
27 | #endif /* _ASM_X86_PAT_H */ | 29 | #endif /* _ASM_X86_PAT_H */ |
diff --git a/arch/x86/include/asm/x86_init.h b/arch/x86/include/asm/x86_init.h index 2c756fd4ab0e..8112ed786287 100644 --- a/arch/x86/include/asm/x86_init.h +++ b/arch/x86/include/asm/x86_init.h | |||
@@ -113,11 +113,13 @@ struct x86_cpuinit_ops { | |||
113 | 113 | ||
114 | /** | 114 | /** |
115 | * struct x86_platform_ops - platform specific runtime functions | 115 | * struct x86_platform_ops - platform specific runtime functions |
116 | * @is_untracked_pat_range exclude from PAT logic | ||
116 | * @calibrate_tsc: calibrate TSC | 117 | * @calibrate_tsc: calibrate TSC |
117 | * @get_wallclock: get time from HW clock like RTC etc. | 118 | * @get_wallclock: get time from HW clock like RTC etc. |
118 | * @set_wallclock: set time back to HW clock | 119 | * @set_wallclock: set time back to HW clock |
119 | */ | 120 | */ |
120 | struct x86_platform_ops { | 121 | struct x86_platform_ops { |
122 | int (*is_untracked_pat_range)(u64 start, u64 end); | ||
121 | unsigned long (*calibrate_tsc)(void); | 123 | unsigned long (*calibrate_tsc)(void); |
122 | unsigned long (*get_wallclock)(void); | 124 | unsigned long (*get_wallclock)(void); |
123 | int (*set_wallclock)(unsigned long nowtime); | 125 | int (*set_wallclock)(unsigned long nowtime); |
diff --git a/arch/x86/kernel/apic/x2apic_uv_x.c b/arch/x86/kernel/apic/x2apic_uv_x.c index f5f5886a6b53..2477c9f88093 100644 --- a/arch/x86/kernel/apic/x2apic_uv_x.c +++ b/arch/x86/kernel/apic/x2apic_uv_x.c | |||
@@ -30,10 +30,22 @@ | |||
30 | #include <asm/apic.h> | 30 | #include <asm/apic.h> |
31 | #include <asm/ipi.h> | 31 | #include <asm/ipi.h> |
32 | #include <asm/smp.h> | 32 | #include <asm/smp.h> |
33 | #include <asm/x86_init.h> | ||
33 | 34 | ||
34 | DEFINE_PER_CPU(int, x2apic_extra_bits); | 35 | DEFINE_PER_CPU(int, x2apic_extra_bits); |
35 | 36 | ||
36 | static enum uv_system_type uv_system_type; | 37 | static enum uv_system_type uv_system_type; |
38 | static u64 gru_start_paddr, gru_end_paddr; | ||
39 | |||
40 | static int is_GRU_range(u64 start, u64 end) | ||
41 | { | ||
42 | return start >= gru_start_paddr && end < gru_end_paddr; | ||
43 | } | ||
44 | |||
45 | static int uv_is_untracked_pat_range(u64 start, u64 end) | ||
46 | { | ||
47 | return is_ISA_range(start, end) || is_GRU_range(start, end); | ||
48 | } | ||
37 | 49 | ||
38 | static int early_get_nodeid(void) | 50 | static int early_get_nodeid(void) |
39 | { | 51 | { |
@@ -49,6 +61,7 @@ static int early_get_nodeid(void) | |||
49 | static int __init uv_acpi_madt_oem_check(char *oem_id, char *oem_table_id) | 61 | static int __init uv_acpi_madt_oem_check(char *oem_id, char *oem_table_id) |
50 | { | 62 | { |
51 | if (!strcmp(oem_id, "SGI")) { | 63 | if (!strcmp(oem_id, "SGI")) { |
64 | x86_platform.is_untracked_pat_range = uv_is_untracked_pat_range; | ||
52 | if (!strcmp(oem_table_id, "UVL")) | 65 | if (!strcmp(oem_table_id, "UVL")) |
53 | uv_system_type = UV_LEGACY_APIC; | 66 | uv_system_type = UV_LEGACY_APIC; |
54 | else if (!strcmp(oem_table_id, "UVX")) | 67 | else if (!strcmp(oem_table_id, "UVX")) |
@@ -385,8 +398,12 @@ static __init void map_gru_high(int max_pnode) | |||
385 | int shift = UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR_BASE_SHFT; | 398 | int shift = UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR_BASE_SHFT; |
386 | 399 | ||
387 | gru.v = uv_read_local_mmr(UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR); | 400 | gru.v = uv_read_local_mmr(UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR); |
388 | if (gru.s.enable) | 401 | if (gru.s.enable) { |
389 | map_high("GRU", gru.s.base, shift, max_pnode, map_wb); | 402 | map_high("GRU", gru.s.base, shift, max_pnode, map_wb); |
403 | gru_start_paddr = ((u64)gru.s.base << shift); | ||
404 | gru_end_paddr = gru_start_paddr + (1UL << shift) * (max_pnode + 1); | ||
405 | |||
406 | } | ||
390 | } | 407 | } |
391 | 408 | ||
392 | static __init void map_mmr_high(int max_pnode) | 409 | static __init void map_mmr_high(int max_pnode) |
diff --git a/arch/x86/kernel/x86_init.c b/arch/x86/kernel/x86_init.c index 4449a4a2c2ed..bcc749ef62dc 100644 --- a/arch/x86/kernel/x86_init.c +++ b/arch/x86/kernel/x86_init.c | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <asm/e820.h> | 13 | #include <asm/e820.h> |
14 | #include <asm/time.h> | 14 | #include <asm/time.h> |
15 | #include <asm/irq.h> | 15 | #include <asm/irq.h> |
16 | #include <asm/pat.h> | ||
16 | #include <asm/tsc.h> | 17 | #include <asm/tsc.h> |
17 | 18 | ||
18 | void __cpuinit x86_init_noop(void) { } | 19 | void __cpuinit x86_init_noop(void) { } |
@@ -69,6 +70,7 @@ struct x86_cpuinit_ops x86_cpuinit __cpuinitdata = { | |||
69 | }; | 70 | }; |
70 | 71 | ||
71 | struct x86_platform_ops x86_platform = { | 72 | struct x86_platform_ops x86_platform = { |
73 | .is_untracked_pat_range = default_is_untracked_pat_range, | ||
72 | .calibrate_tsc = native_calibrate_tsc, | 74 | .calibrate_tsc = native_calibrate_tsc, |
73 | .get_wallclock = mach_get_cmos_time, | 75 | .get_wallclock = mach_get_cmos_time, |
74 | .set_wallclock = mach_set_rtc_mmss, | 76 | .set_wallclock = mach_set_rtc_mmss, |
diff --git a/arch/x86/mm/pat.c b/arch/x86/mm/pat.c index e78cd0ec2bcf..38a66ef9426d 100644 --- a/arch/x86/mm/pat.c +++ b/arch/x86/mm/pat.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <asm/cacheflush.h> | 20 | #include <asm/cacheflush.h> |
21 | #include <asm/processor.h> | 21 | #include <asm/processor.h> |
22 | #include <asm/tlbflush.h> | 22 | #include <asm/tlbflush.h> |
23 | #include <asm/x86_init.h> | ||
23 | #include <asm/pgtable.h> | 24 | #include <asm/pgtable.h> |
24 | #include <asm/fcntl.h> | 25 | #include <asm/fcntl.h> |
25 | #include <asm/e820.h> | 26 | #include <asm/e820.h> |
@@ -348,6 +349,11 @@ static int free_ram_pages_type(u64 start, u64 end) | |||
348 | return 0; | 349 | return 0; |
349 | } | 350 | } |
350 | 351 | ||
352 | int default_is_untracked_pat_range(u64 start, u64 end) | ||
353 | { | ||
354 | return is_ISA_range(start, end); | ||
355 | } | ||
356 | |||
351 | /* | 357 | /* |
352 | * req_type typically has one of the: | 358 | * req_type typically has one of the: |
353 | * - _PAGE_CACHE_WB | 359 | * - _PAGE_CACHE_WB |
@@ -388,7 +394,7 @@ int reserve_memtype(u64 start, u64 end, unsigned long req_type, | |||
388 | } | 394 | } |
389 | 395 | ||
390 | /* Low ISA region is always mapped WB in page table. No need to track */ | 396 | /* Low ISA region is always mapped WB in page table. No need to track */ |
391 | if (is_ISA_range(start, end - 1)) { | 397 | if (x86_platform.is_untracked_pat_range(start, end - 1)) { |
392 | if (new_type) | 398 | if (new_type) |
393 | *new_type = _PAGE_CACHE_WB; | 399 | *new_type = _PAGE_CACHE_WB; |
394 | return 0; | 400 | return 0; |
@@ -499,7 +505,7 @@ int free_memtype(u64 start, u64 end) | |||
499 | return 0; | 505 | return 0; |
500 | 506 | ||
501 | /* Low ISA region is always mapped WB. No need to track */ | 507 | /* Low ISA region is always mapped WB. No need to track */ |
502 | if (is_ISA_range(start, end - 1)) | 508 | if (x86_platform.is_untracked_pat_range(start, end - 1)) |
503 | return 0; | 509 | return 0; |
504 | 510 | ||
505 | is_range_ram = pat_pagerange_is_ram(start, end); | 511 | is_range_ram = pat_pagerange_is_ram(start, end); |
@@ -582,7 +588,7 @@ static unsigned long lookup_memtype(u64 paddr) | |||
582 | int rettype = _PAGE_CACHE_WB; | 588 | int rettype = _PAGE_CACHE_WB; |
583 | struct memtype *entry; | 589 | struct memtype *entry; |
584 | 590 | ||
585 | if (is_ISA_range(paddr, paddr + PAGE_SIZE - 1)) | 591 | if (x86_platform.is_untracked_pat_range(paddr, paddr + PAGE_SIZE - 1)) |
586 | return rettype; | 592 | return rettype; |
587 | 593 | ||
588 | if (pat_pagerange_is_ram(paddr, paddr + PAGE_SIZE)) { | 594 | if (pat_pagerange_is_ram(paddr, paddr + PAGE_SIZE)) { |