diff options
| -rw-r--r-- | arch/x86/include/asm/processor.h | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/common.c | 12 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/intel.c | 5 | ||||
| -rw-r--r-- | arch/x86/mm/ioremap.c | 17 |
4 files changed, 25 insertions, 11 deletions
diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h index 76139506c3e4..bd3406db1d68 100644 --- a/arch/x86/include/asm/processor.h +++ b/arch/x86/include/asm/processor.h | |||
| @@ -75,9 +75,9 @@ struct cpuinfo_x86 { | |||
| 75 | #else | 75 | #else |
| 76 | /* Number of 4K pages in DTLB/ITLB combined(in pages): */ | 76 | /* Number of 4K pages in DTLB/ITLB combined(in pages): */ |
| 77 | int x86_tlbsize; | 77 | int x86_tlbsize; |
| 78 | #endif | ||
| 78 | __u8 x86_virt_bits; | 79 | __u8 x86_virt_bits; |
| 79 | __u8 x86_phys_bits; | 80 | __u8 x86_phys_bits; |
| 80 | #endif | ||
| 81 | /* CPUID returned core id bits: */ | 81 | /* CPUID returned core id bits: */ |
| 82 | __u8 x86_coreid_bits; | 82 | __u8 x86_coreid_bits; |
| 83 | /* Max extended CPUID function supported: */ | 83 | /* Max extended CPUID function supported: */ |
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index 826d5c876278..a95e9480bb9c 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c | |||
| @@ -549,13 +549,15 @@ static void __cpuinit get_cpu_cap(struct cpuinfo_x86 *c) | |||
| 549 | } | 549 | } |
| 550 | } | 550 | } |
| 551 | 551 | ||
| 552 | #ifdef CONFIG_X86_64 | ||
| 553 | if (c->extended_cpuid_level >= 0x80000008) { | 552 | if (c->extended_cpuid_level >= 0x80000008) { |
| 554 | u32 eax = cpuid_eax(0x80000008); | 553 | u32 eax = cpuid_eax(0x80000008); |
| 555 | 554 | ||
| 556 | c->x86_virt_bits = (eax >> 8) & 0xff; | 555 | c->x86_virt_bits = (eax >> 8) & 0xff; |
| 557 | c->x86_phys_bits = eax & 0xff; | 556 | c->x86_phys_bits = eax & 0xff; |
| 558 | } | 557 | } |
| 558 | #ifdef CONFIG_X86_32 | ||
| 559 | else if (cpu_has(c, X86_FEATURE_PAE) || cpu_has(c, X86_FEATURE_PSE36)) | ||
| 560 | c->x86_phys_bits = 36; | ||
| 559 | #endif | 561 | #endif |
| 560 | 562 | ||
| 561 | if (c->extended_cpuid_level >= 0x80000007) | 563 | if (c->extended_cpuid_level >= 0x80000007) |
| @@ -602,8 +604,12 @@ static void __init early_identify_cpu(struct cpuinfo_x86 *c) | |||
| 602 | { | 604 | { |
| 603 | #ifdef CONFIG_X86_64 | 605 | #ifdef CONFIG_X86_64 |
| 604 | c->x86_clflush_size = 64; | 606 | c->x86_clflush_size = 64; |
| 607 | c->x86_phys_bits = 36; | ||
| 608 | c->x86_virt_bits = 48; | ||
| 605 | #else | 609 | #else |
| 606 | c->x86_clflush_size = 32; | 610 | c->x86_clflush_size = 32; |
| 611 | c->x86_phys_bits = 32; | ||
| 612 | c->x86_virt_bits = 32; | ||
| 607 | #endif | 613 | #endif |
| 608 | c->x86_cache_alignment = c->x86_clflush_size; | 614 | c->x86_cache_alignment = c->x86_clflush_size; |
| 609 | 615 | ||
| @@ -726,9 +732,13 @@ static void __cpuinit identify_cpu(struct cpuinfo_x86 *c) | |||
| 726 | c->x86_coreid_bits = 0; | 732 | c->x86_coreid_bits = 0; |
| 727 | #ifdef CONFIG_X86_64 | 733 | #ifdef CONFIG_X86_64 |
| 728 | c->x86_clflush_size = 64; | 734 | c->x86_clflush_size = 64; |
| 735 | c->x86_phys_bits = 36; | ||
| 736 | c->x86_virt_bits = 48; | ||
| 729 | #else | 737 | #else |
| 730 | c->cpuid_level = -1; /* CPUID not detected */ | 738 | c->cpuid_level = -1; /* CPUID not detected */ |
| 731 | c->x86_clflush_size = 32; | 739 | c->x86_clflush_size = 32; |
| 740 | c->x86_phys_bits = 32; | ||
| 741 | c->x86_virt_bits = 32; | ||
| 732 | #endif | 742 | #endif |
| 733 | c->x86_cache_alignment = c->x86_clflush_size; | 743 | c->x86_cache_alignment = c->x86_clflush_size; |
| 734 | memset(&c->x86_capability, 0, sizeof c->x86_capability); | 744 | memset(&c->x86_capability, 0, sizeof c->x86_capability); |
diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c index 191117f1ad51..ae769471042e 100644 --- a/arch/x86/kernel/cpu/intel.c +++ b/arch/x86/kernel/cpu/intel.c | |||
| @@ -54,6 +54,11 @@ static void __cpuinit early_init_intel(struct cpuinfo_x86 *c) | |||
| 54 | c->x86_cache_alignment = 128; | 54 | c->x86_cache_alignment = 128; |
| 55 | #endif | 55 | #endif |
| 56 | 56 | ||
| 57 | /* CPUID workaround for 0F33/0F34 CPU */ | ||
| 58 | if (c->x86 == 0xF && c->x86_model == 0x3 | ||
| 59 | && (c->x86_mask == 0x3 || c->x86_mask == 0x4)) | ||
| 60 | c->x86_phys_bits = 36; | ||
| 61 | |||
| 57 | /* | 62 | /* |
| 58 | * c->x86_power is 8000_0007 edx. Bit 8 is TSC runs at constant rate | 63 | * c->x86_power is 8000_0007 edx. Bit 8 is TSC runs at constant rate |
| 59 | * with P/T states and does not stop in deep C-states | 64 | * with P/T states and does not stop in deep C-states |
diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c index aca924a30ee6..83ed74affba9 100644 --- a/arch/x86/mm/ioremap.c +++ b/arch/x86/mm/ioremap.c | |||
| @@ -22,13 +22,17 @@ | |||
| 22 | #include <asm/pgalloc.h> | 22 | #include <asm/pgalloc.h> |
| 23 | #include <asm/pat.h> | 23 | #include <asm/pat.h> |
| 24 | 24 | ||
| 25 | #ifdef CONFIG_X86_64 | 25 | static inline int phys_addr_valid(resource_size_t addr) |
| 26 | |||
| 27 | static inline int phys_addr_valid(unsigned long addr) | ||
| 28 | { | 26 | { |
| 29 | return addr < (1UL << boot_cpu_data.x86_phys_bits); | 27 | #ifdef CONFIG_PHYS_ADDR_T_64BIT |
| 28 | return !(addr >> boot_cpu_data.x86_phys_bits); | ||
| 29 | #else | ||
| 30 | return 1; | ||
| 31 | #endif | ||
| 30 | } | 32 | } |
| 31 | 33 | ||
| 34 | #ifdef CONFIG_X86_64 | ||
| 35 | |||
| 32 | unsigned long __phys_addr(unsigned long x) | 36 | unsigned long __phys_addr(unsigned long x) |
| 33 | { | 37 | { |
| 34 | if (x >= __START_KERNEL_map) { | 38 | if (x >= __START_KERNEL_map) { |
| @@ -65,11 +69,6 @@ EXPORT_SYMBOL(__virt_addr_valid); | |||
| 65 | 69 | ||
| 66 | #else | 70 | #else |
| 67 | 71 | ||
| 68 | static inline int phys_addr_valid(unsigned long addr) | ||
| 69 | { | ||
| 70 | return 1; | ||
| 71 | } | ||
| 72 | |||
| 73 | #ifdef CONFIG_DEBUG_VIRTUAL | 72 | #ifdef CONFIG_DEBUG_VIRTUAL |
| 74 | unsigned long __phys_addr(unsigned long x) | 73 | unsigned long __phys_addr(unsigned long x) |
| 75 | { | 74 | { |
