diff options
| -rw-r--r-- | arch/arm/include/asm/cputype.h | 37 | ||||
| -rw-r--r-- | arch/arm/include/asm/smp_scu.h | 2 | ||||
| -rw-r--r-- | arch/arm/kernel/perf_event_cpu.c | 55 | ||||
| -rw-r--r-- | arch/arm/kvm/guest.c | 8 | ||||
| -rw-r--r-- | arch/arm/mach-exynos/mcpm-exynos.c | 4 | ||||
| -rw-r--r-- | arch/arm/mach-exynos/platsmp.c | 4 | ||||
| -rw-r--r-- | arch/arm/mach-exynos/pm.c | 11 | ||||
| -rw-r--r-- | arch/arm/mach-vexpress/tc2_pm.c | 4 | ||||
| -rw-r--r-- | arch/arm/mm/cache-l2x0.c | 2 | ||||
| -rw-r--r-- | drivers/clocksource/arm_global_timer.c | 2 |
10 files changed, 66 insertions, 63 deletions
diff --git a/arch/arm/include/asm/cputype.h b/arch/arm/include/asm/cputype.h index 8c2b7321a478..963a2515906d 100644 --- a/arch/arm/include/asm/cputype.h +++ b/arch/arm/include/asm/cputype.h | |||
| @@ -62,17 +62,18 @@ | |||
| 62 | #define ARM_CPU_IMP_ARM 0x41 | 62 | #define ARM_CPU_IMP_ARM 0x41 |
| 63 | #define ARM_CPU_IMP_INTEL 0x69 | 63 | #define ARM_CPU_IMP_INTEL 0x69 |
| 64 | 64 | ||
| 65 | #define ARM_CPU_PART_ARM1136 0xB360 | 65 | /* ARM implemented processors */ |
| 66 | #define ARM_CPU_PART_ARM1156 0xB560 | 66 | #define ARM_CPU_PART_ARM1136 0x4100b360 |
| 67 | #define ARM_CPU_PART_ARM1176 0xB760 | 67 | #define ARM_CPU_PART_ARM1156 0x4100b560 |
| 68 | #define ARM_CPU_PART_ARM11MPCORE 0xB020 | 68 | #define ARM_CPU_PART_ARM1176 0x4100b760 |
| 69 | #define ARM_CPU_PART_CORTEX_A8 0xC080 | 69 | #define ARM_CPU_PART_ARM11MPCORE 0x4100b020 |
| 70 | #define ARM_CPU_PART_CORTEX_A9 0xC090 | 70 | #define ARM_CPU_PART_CORTEX_A8 0x4100c080 |
| 71 | #define ARM_CPU_PART_CORTEX_A5 0xC050 | 71 | #define ARM_CPU_PART_CORTEX_A9 0x4100c090 |
| 72 | #define ARM_CPU_PART_CORTEX_A15 0xC0F0 | 72 | #define ARM_CPU_PART_CORTEX_A5 0x4100c050 |
| 73 | #define ARM_CPU_PART_CORTEX_A7 0xC070 | 73 | #define ARM_CPU_PART_CORTEX_A7 0x4100c070 |
| 74 | #define ARM_CPU_PART_CORTEX_A12 0xC0D0 | 74 | #define ARM_CPU_PART_CORTEX_A12 0x4100c0d0 |
| 75 | #define ARM_CPU_PART_CORTEX_A17 0xC0E0 | 75 | #define ARM_CPU_PART_CORTEX_A17 0x4100c0e0 |
| 76 | #define ARM_CPU_PART_CORTEX_A15 0x4100c0f0 | ||
| 76 | 77 | ||
| 77 | #define ARM_CPU_XSCALE_ARCH_MASK 0xe000 | 78 | #define ARM_CPU_XSCALE_ARCH_MASK 0xe000 |
| 78 | #define ARM_CPU_XSCALE_ARCH_V1 0x2000 | 79 | #define ARM_CPU_XSCALE_ARCH_V1 0x2000 |
| @@ -171,14 +172,24 @@ static inline unsigned int __attribute_const__ read_cpuid_implementor(void) | |||
| 171 | return (read_cpuid_id() & 0xFF000000) >> 24; | 172 | return (read_cpuid_id() & 0xFF000000) >> 24; |
| 172 | } | 173 | } |
| 173 | 174 | ||
| 174 | static inline unsigned int __attribute_const__ read_cpuid_part_number(void) | 175 | /* |
| 176 | * The CPU part number is meaningless without referring to the CPU | ||
| 177 | * implementer: implementers are free to define their own part numbers | ||
| 178 | * which are permitted to clash with other implementer part numbers. | ||
| 179 | */ | ||
| 180 | static inline unsigned int __attribute_const__ read_cpuid_part(void) | ||
| 181 | { | ||
| 182 | return read_cpuid_id() & 0xff00fff0; | ||
| 183 | } | ||
| 184 | |||
| 185 | static inline unsigned int __attribute_const__ __deprecated read_cpuid_part_number(void) | ||
| 175 | { | 186 | { |
| 176 | return read_cpuid_id() & 0xFFF0; | 187 | return read_cpuid_id() & 0xFFF0; |
| 177 | } | 188 | } |
| 178 | 189 | ||
| 179 | static inline unsigned int __attribute_const__ xscale_cpu_arch_version(void) | 190 | static inline unsigned int __attribute_const__ xscale_cpu_arch_version(void) |
| 180 | { | 191 | { |
| 181 | return read_cpuid_part_number() & ARM_CPU_XSCALE_ARCH_MASK; | 192 | return read_cpuid_id() & ARM_CPU_XSCALE_ARCH_MASK; |
| 182 | } | 193 | } |
| 183 | 194 | ||
| 184 | static inline unsigned int __attribute_const__ read_cpuid_cachetype(void) | 195 | static inline unsigned int __attribute_const__ read_cpuid_cachetype(void) |
diff --git a/arch/arm/include/asm/smp_scu.h b/arch/arm/include/asm/smp_scu.h index 0393fbab8dd5..bfe163c40024 100644 --- a/arch/arm/include/asm/smp_scu.h +++ b/arch/arm/include/asm/smp_scu.h | |||
| @@ -11,7 +11,7 @@ | |||
| 11 | 11 | ||
| 12 | static inline bool scu_a9_has_base(void) | 12 | static inline bool scu_a9_has_base(void) |
| 13 | { | 13 | { |
| 14 | return read_cpuid_part_number() == ARM_CPU_PART_CORTEX_A9; | 14 | return read_cpuid_part() == ARM_CPU_PART_CORTEX_A9; |
| 15 | } | 15 | } |
| 16 | 16 | ||
| 17 | static inline unsigned long scu_a9_get_base(void) | 17 | static inline unsigned long scu_a9_get_base(void) |
diff --git a/arch/arm/kernel/perf_event_cpu.c b/arch/arm/kernel/perf_event_cpu.c index af9e35e8836f..c02c2e8c877d 100644 --- a/arch/arm/kernel/perf_event_cpu.c +++ b/arch/arm/kernel/perf_event_cpu.c | |||
| @@ -250,40 +250,39 @@ static struct platform_device_id cpu_pmu_plat_device_ids[] = { | |||
| 250 | static int probe_current_pmu(struct arm_pmu *pmu) | 250 | static int probe_current_pmu(struct arm_pmu *pmu) |
| 251 | { | 251 | { |
| 252 | int cpu = get_cpu(); | 252 | int cpu = get_cpu(); |
| 253 | unsigned long implementor = read_cpuid_implementor(); | ||
| 254 | unsigned long part_number = read_cpuid_part_number(); | ||
| 255 | int ret = -ENODEV; | 253 | int ret = -ENODEV; |
| 256 | 254 | ||
| 257 | pr_info("probing PMU on CPU %d\n", cpu); | 255 | pr_info("probing PMU on CPU %d\n", cpu); |
| 258 | 256 | ||
| 257 | switch (read_cpuid_part()) { | ||
| 259 | /* ARM Ltd CPUs. */ | 258 | /* ARM Ltd CPUs. */ |
| 260 | if (implementor == ARM_CPU_IMP_ARM) { | 259 | case ARM_CPU_PART_ARM1136: |
| 261 | switch (part_number) { | 260 | case ARM_CPU_PART_ARM1156: |
| 262 | case ARM_CPU_PART_ARM1136: | 261 | case ARM_CPU_PART_ARM1176: |
| 263 | case ARM_CPU_PART_ARM1156: | 262 | ret = armv6pmu_init(pmu); |
| 264 | case ARM_CPU_PART_ARM1176: | 263 | break; |
| 265 | ret = armv6pmu_init(pmu); | 264 | case ARM_CPU_PART_ARM11MPCORE: |
| 266 | break; | 265 | ret = armv6mpcore_pmu_init(pmu); |
| 267 | case ARM_CPU_PART_ARM11MPCORE: | 266 | break; |
| 268 | ret = armv6mpcore_pmu_init(pmu); | 267 | case ARM_CPU_PART_CORTEX_A8: |
| 269 | break; | 268 | ret = armv7_a8_pmu_init(pmu); |
| 270 | case ARM_CPU_PART_CORTEX_A8: | 269 | break; |
| 271 | ret = armv7_a8_pmu_init(pmu); | 270 | case ARM_CPU_PART_CORTEX_A9: |
| 272 | break; | 271 | ret = armv7_a9_pmu_init(pmu); |
| 273 | case ARM_CPU_PART_CORTEX_A9: | 272 | break; |
| 274 | ret = armv7_a9_pmu_init(pmu); | 273 | |
| 275 | break; | 274 | default: |
| 276 | } | 275 | if (read_cpuid_implementor() == ARM_CPU_IMP_INTEL) { |
| 277 | /* Intel CPUs [xscale]. */ | 276 | switch (xscale_cpu_arch_version()) { |
| 278 | } else if (implementor == ARM_CPU_IMP_INTEL) { | 277 | case ARM_CPU_XSCALE_ARCH_V1: |
| 279 | switch (xscale_cpu_arch_version()) { | 278 | ret = xscale1pmu_init(pmu); |
| 280 | case ARM_CPU_XSCALE_ARCH_V1: | 279 | break; |
| 281 | ret = xscale1pmu_init(pmu); | 280 | case ARM_CPU_XSCALE_ARCH_V2: |
| 282 | break; | 281 | ret = xscale2pmu_init(pmu); |
| 283 | case ARM_CPU_XSCALE_ARCH_V2: | 282 | break; |
| 284 | ret = xscale2pmu_init(pmu); | 283 | } |
| 285 | break; | ||
| 286 | } | 284 | } |
| 285 | break; | ||
| 287 | } | 286 | } |
| 288 | 287 | ||
| 289 | put_cpu(); | 288 | put_cpu(); |
diff --git a/arch/arm/kvm/guest.c b/arch/arm/kvm/guest.c index b23a59c1c522..70bf49b8b244 100644 --- a/arch/arm/kvm/guest.c +++ b/arch/arm/kvm/guest.c | |||
| @@ -274,13 +274,7 @@ int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu, | |||
| 274 | 274 | ||
| 275 | int __attribute_const__ kvm_target_cpu(void) | 275 | int __attribute_const__ kvm_target_cpu(void) |
| 276 | { | 276 | { |
| 277 | unsigned long implementor = read_cpuid_implementor(); | 277 | switch (read_cpuid_part()) { |
| 278 | unsigned long part_number = read_cpuid_part_number(); | ||
| 279 | |||
| 280 | if (implementor != ARM_CPU_IMP_ARM) | ||
| 281 | return -EINVAL; | ||
| 282 | |||
| 283 | switch (part_number) { | ||
| 284 | case ARM_CPU_PART_CORTEX_A7: | 278 | case ARM_CPU_PART_CORTEX_A7: |
| 285 | return KVM_ARM_TARGET_CORTEX_A7; | 279 | return KVM_ARM_TARGET_CORTEX_A7; |
| 286 | case ARM_CPU_PART_CORTEX_A15: | 280 | case ARM_CPU_PART_CORTEX_A15: |
diff --git a/arch/arm/mach-exynos/mcpm-exynos.c b/arch/arm/mach-exynos/mcpm-exynos.c index 0d95bc8e49d8..a96b78f93f2b 100644 --- a/arch/arm/mach-exynos/mcpm-exynos.c +++ b/arch/arm/mach-exynos/mcpm-exynos.c | |||
| @@ -196,7 +196,7 @@ static void exynos_power_down(void) | |||
| 196 | if (last_man && __mcpm_outbound_enter_critical(cpu, cluster)) { | 196 | if (last_man && __mcpm_outbound_enter_critical(cpu, cluster)) { |
| 197 | arch_spin_unlock(&exynos_mcpm_lock); | 197 | arch_spin_unlock(&exynos_mcpm_lock); |
| 198 | 198 | ||
| 199 | if (read_cpuid_part_number() == ARM_CPU_PART_CORTEX_A15) { | 199 | if (read_cpuid_part() == ARM_CPU_PART_CORTEX_A15) { |
| 200 | /* | 200 | /* |
| 201 | * On the Cortex-A15 we need to disable | 201 | * On the Cortex-A15 we need to disable |
| 202 | * L2 prefetching before flushing the cache. | 202 | * L2 prefetching before flushing the cache. |
| @@ -291,7 +291,7 @@ static void __naked exynos_pm_power_up_setup(unsigned int affinity_level) | |||
| 291 | 291 | ||
| 292 | static void __init exynos_cache_off(void) | 292 | static void __init exynos_cache_off(void) |
| 293 | { | 293 | { |
| 294 | if (read_cpuid_part_number() == ARM_CPU_PART_CORTEX_A15) { | 294 | if (read_cpuid_part() == ARM_CPU_PART_CORTEX_A15) { |
| 295 | /* disable L2 prefetching on the Cortex-A15 */ | 295 | /* disable L2 prefetching on the Cortex-A15 */ |
| 296 | asm volatile( | 296 | asm volatile( |
| 297 | "mcr p15, 1, %0, c15, c0, 3\n\t" | 297 | "mcr p15, 1, %0, c15, c0, 3\n\t" |
diff --git a/arch/arm/mach-exynos/platsmp.c b/arch/arm/mach-exynos/platsmp.c index 1c8d31e39520..8dc1d3a3a8bf 100644 --- a/arch/arm/mach-exynos/platsmp.c +++ b/arch/arm/mach-exynos/platsmp.c | |||
| @@ -188,7 +188,7 @@ static void __init exynos_smp_init_cpus(void) | |||
| 188 | void __iomem *scu_base = scu_base_addr(); | 188 | void __iomem *scu_base = scu_base_addr(); |
| 189 | unsigned int i, ncores; | 189 | unsigned int i, ncores; |
| 190 | 190 | ||
| 191 | if (read_cpuid_part_number() == ARM_CPU_PART_CORTEX_A9) | 191 | if (read_cpuid_part() == ARM_CPU_PART_CORTEX_A9) |
| 192 | ncores = scu_base ? scu_get_core_count(scu_base) : 1; | 192 | ncores = scu_base ? scu_get_core_count(scu_base) : 1; |
| 193 | else | 193 | else |
| 194 | /* | 194 | /* |
| @@ -214,7 +214,7 @@ static void __init exynos_smp_prepare_cpus(unsigned int max_cpus) | |||
| 214 | 214 | ||
| 215 | exynos_sysram_init(); | 215 | exynos_sysram_init(); |
| 216 | 216 | ||
| 217 | if (read_cpuid_part_number() == ARM_CPU_PART_CORTEX_A9) | 217 | if (read_cpuid_part() == ARM_CPU_PART_CORTEX_A9) |
| 218 | scu_enable(scu_base_addr()); | 218 | scu_enable(scu_base_addr()); |
| 219 | 219 | ||
| 220 | /* | 220 | /* |
diff --git a/arch/arm/mach-exynos/pm.c b/arch/arm/mach-exynos/pm.c index 202ca73e49c4..67d383de614f 100644 --- a/arch/arm/mach-exynos/pm.c +++ b/arch/arm/mach-exynos/pm.c | |||
| @@ -300,7 +300,7 @@ static int exynos_pm_suspend(void) | |||
| 300 | tmp = (S5P_USE_STANDBY_WFI0 | S5P_USE_STANDBY_WFE0); | 300 | tmp = (S5P_USE_STANDBY_WFI0 | S5P_USE_STANDBY_WFE0); |
| 301 | __raw_writel(tmp, S5P_CENTRAL_SEQ_OPTION); | 301 | __raw_writel(tmp, S5P_CENTRAL_SEQ_OPTION); |
| 302 | 302 | ||
| 303 | if (read_cpuid_part_number() == ARM_CPU_PART_CORTEX_A9) | 303 | if (read_cpuid_part() == ARM_CPU_PART_CORTEX_A9) |
| 304 | exynos_cpu_save_register(); | 304 | exynos_cpu_save_register(); |
| 305 | 305 | ||
| 306 | return 0; | 306 | return 0; |
| @@ -334,7 +334,7 @@ static void exynos_pm_resume(void) | |||
| 334 | if (exynos_pm_central_resume()) | 334 | if (exynos_pm_central_resume()) |
| 335 | goto early_wakeup; | 335 | goto early_wakeup; |
| 336 | 336 | ||
| 337 | if (read_cpuid_part_number() == ARM_CPU_PART_CORTEX_A9) | 337 | if (read_cpuid_part() == ARM_CPU_PART_CORTEX_A9) |
| 338 | exynos_cpu_restore_register(); | 338 | exynos_cpu_restore_register(); |
| 339 | 339 | ||
| 340 | /* For release retention */ | 340 | /* For release retention */ |
| @@ -353,7 +353,7 @@ static void exynos_pm_resume(void) | |||
| 353 | 353 | ||
| 354 | s3c_pm_do_restore_core(exynos_core_save, ARRAY_SIZE(exynos_core_save)); | 354 | s3c_pm_do_restore_core(exynos_core_save, ARRAY_SIZE(exynos_core_save)); |
| 355 | 355 | ||
| 356 | if (read_cpuid_part_number() == ARM_CPU_PART_CORTEX_A9) | 356 | if (read_cpuid_part() == ARM_CPU_PART_CORTEX_A9) |
| 357 | scu_enable(S5P_VA_SCU); | 357 | scu_enable(S5P_VA_SCU); |
| 358 | 358 | ||
| 359 | early_wakeup: | 359 | early_wakeup: |
| @@ -440,15 +440,14 @@ static int exynos_cpu_pm_notifier(struct notifier_block *self, | |||
| 440 | case CPU_PM_ENTER: | 440 | case CPU_PM_ENTER: |
| 441 | if (cpu == 0) { | 441 | if (cpu == 0) { |
| 442 | exynos_pm_central_suspend(); | 442 | exynos_pm_central_suspend(); |
| 443 | if (read_cpuid_part_number() == ARM_CPU_PART_CORTEX_A9) | 443 | if (read_cpuid_part() == ARM_CPU_PART_CORTEX_A9) |
| 444 | exynos_cpu_save_register(); | 444 | exynos_cpu_save_register(); |
| 445 | } | 445 | } |
| 446 | break; | 446 | break; |
| 447 | 447 | ||
| 448 | case CPU_PM_EXIT: | 448 | case CPU_PM_EXIT: |
| 449 | if (cpu == 0) { | 449 | if (cpu == 0) { |
| 450 | if (read_cpuid_part_number() == | 450 | if (read_cpuid_part() == ARM_CPU_PART_CORTEX_A9) { |
| 451 | ARM_CPU_PART_CORTEX_A9) { | ||
| 452 | scu_enable(S5P_VA_SCU); | 451 | scu_enable(S5P_VA_SCU); |
| 453 | exynos_cpu_restore_register(); | 452 | exynos_cpu_restore_register(); |
| 454 | } | 453 | } |
diff --git a/arch/arm/mach-vexpress/tc2_pm.c b/arch/arm/mach-vexpress/tc2_pm.c index 54a9fff77c7d..2fb78b4648cb 100644 --- a/arch/arm/mach-vexpress/tc2_pm.c +++ b/arch/arm/mach-vexpress/tc2_pm.c | |||
| @@ -152,7 +152,7 @@ static void tc2_pm_down(u64 residency) | |||
| 152 | if (last_man && __mcpm_outbound_enter_critical(cpu, cluster)) { | 152 | if (last_man && __mcpm_outbound_enter_critical(cpu, cluster)) { |
| 153 | arch_spin_unlock(&tc2_pm_lock); | 153 | arch_spin_unlock(&tc2_pm_lock); |
| 154 | 154 | ||
| 155 | if (read_cpuid_part_number() == ARM_CPU_PART_CORTEX_A15) { | 155 | if (read_cpuid_part() == ARM_CPU_PART_CORTEX_A15) { |
| 156 | /* | 156 | /* |
| 157 | * On the Cortex-A15 we need to disable | 157 | * On the Cortex-A15 we need to disable |
| 158 | * L2 prefetching before flushing the cache. | 158 | * L2 prefetching before flushing the cache. |
| @@ -326,7 +326,7 @@ static void __naked tc2_pm_power_up_setup(unsigned int affinity_level) | |||
| 326 | static void __init tc2_cache_off(void) | 326 | static void __init tc2_cache_off(void) |
| 327 | { | 327 | { |
| 328 | pr_info("TC2: disabling cache during MCPM loopback test\n"); | 328 | pr_info("TC2: disabling cache during MCPM loopback test\n"); |
| 329 | if (read_cpuid_part_number() == ARM_CPU_PART_CORTEX_A15) { | 329 | if (read_cpuid_part() == ARM_CPU_PART_CORTEX_A15) { |
| 330 | /* disable L2 prefetching on the Cortex-A15 */ | 330 | /* disable L2 prefetching on the Cortex-A15 */ |
| 331 | asm volatile( | 331 | asm volatile( |
| 332 | "mcr p15, 1, %0, c15, c0, 3 \n\t" | 332 | "mcr p15, 1, %0, c15, c0, 3 \n\t" |
diff --git a/arch/arm/mm/cache-l2x0.c b/arch/arm/mm/cache-l2x0.c index 076172b69422..556df22e89bd 100644 --- a/arch/arm/mm/cache-l2x0.c +++ b/arch/arm/mm/cache-l2x0.c | |||
| @@ -665,7 +665,7 @@ static int l2c310_cpu_enable_flz(struct notifier_block *nb, unsigned long act, v | |||
| 665 | static void __init l2c310_enable(void __iomem *base, u32 aux, unsigned num_lock) | 665 | static void __init l2c310_enable(void __iomem *base, u32 aux, unsigned num_lock) |
| 666 | { | 666 | { |
| 667 | unsigned rev = readl_relaxed(base + L2X0_CACHE_ID) & L2X0_CACHE_ID_PART_MASK; | 667 | unsigned rev = readl_relaxed(base + L2X0_CACHE_ID) & L2X0_CACHE_ID_PART_MASK; |
| 668 | bool cortex_a9 = read_cpuid_part_number() == ARM_CPU_PART_CORTEX_A9; | 668 | bool cortex_a9 = read_cpuid_part() == ARM_CPU_PART_CORTEX_A9; |
| 669 | 669 | ||
| 670 | if (rev >= L310_CACHE_ID_RTL_R2P0) { | 670 | if (rev >= L310_CACHE_ID_RTL_R2P0) { |
| 671 | if (cortex_a9) { | 671 | if (cortex_a9) { |
diff --git a/drivers/clocksource/arm_global_timer.c b/drivers/clocksource/arm_global_timer.c index 60e5a170c4d2..e6833771a716 100644 --- a/drivers/clocksource/arm_global_timer.c +++ b/drivers/clocksource/arm_global_timer.c | |||
| @@ -250,7 +250,7 @@ static void __init global_timer_of_register(struct device_node *np) | |||
| 250 | * fire when the timer value is greater than or equal to. In previous | 250 | * fire when the timer value is greater than or equal to. In previous |
| 251 | * revisions the comparators fired when the timer value was equal to. | 251 | * revisions the comparators fired when the timer value was equal to. |
| 252 | */ | 252 | */ |
| 253 | if (read_cpuid_part_number() == ARM_CPU_PART_CORTEX_A9 | 253 | if (read_cpuid_part() == ARM_CPU_PART_CORTEX_A9 |
| 254 | && (read_cpuid_id() & 0xf0000f) < 0x200000) { | 254 | && (read_cpuid_id() & 0xf0000f) < 0x200000) { |
| 255 | pr_warn("global-timer: non support for this cpu version.\n"); | 255 | pr_warn("global-timer: non support for this cpu version.\n"); |
| 256 | return; | 256 | return; |
