diff options
| -rw-r--r-- | arch/powerpc/Kconfig | 2 | ||||
| -rw-r--r-- | arch/powerpc/include/asm/cputable.h | 16 | ||||
| -rw-r--r-- | arch/powerpc/include/asm/pte-common.h | 2 | ||||
| -rw-r--r-- | arch/powerpc/kernel/cputable.c | 2 | ||||
| -rw-r--r-- | arch/powerpc/kernel/crash.c | 12 | ||||
| -rw-r--r-- | arch/powerpc/kernel/legacy_serial.c | 8 | ||||
| -rw-r--r-- | arch/powerpc/kernel/perf_event.c | 37 | ||||
| -rw-r--r-- | arch/powerpc/kernel/time.c | 3 | ||||
| -rw-r--r-- | arch/powerpc/platforms/powermac/smp.c | 8 | ||||
| -rw-r--r-- | arch/powerpc/platforms/pseries/setup.c | 12 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/fsl_pci.c | 5 |
11 files changed, 81 insertions, 26 deletions
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index b6ff882f695b..8f4d50b0adfa 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig | |||
| @@ -209,7 +209,7 @@ config ARCH_HIBERNATION_POSSIBLE | |||
| 209 | config ARCH_SUSPEND_POSSIBLE | 209 | config ARCH_SUSPEND_POSSIBLE |
| 210 | def_bool y | 210 | def_bool y |
| 211 | depends on ADB_PMU || PPC_EFIKA || PPC_LITE5200 || PPC_83xx || \ | 211 | depends on ADB_PMU || PPC_EFIKA || PPC_LITE5200 || PPC_83xx || \ |
| 212 | PPC_85xx || PPC_86xx || PPC_PSERIES || 44x || 40x | 212 | (PPC_85xx && !SMP) || PPC_86xx || PPC_PSERIES || 44x || 40x |
| 213 | 213 | ||
| 214 | config PPC_DCR_NATIVE | 214 | config PPC_DCR_NATIVE |
| 215 | bool | 215 | bool |
diff --git a/arch/powerpc/include/asm/cputable.h b/arch/powerpc/include/asm/cputable.h index be3cdf9134ce..1833d1a07e79 100644 --- a/arch/powerpc/include/asm/cputable.h +++ b/arch/powerpc/include/asm/cputable.h | |||
| @@ -382,10 +382,12 @@ extern const char *powerpc_base_platform; | |||
| 382 | #define CPU_FTRS_E500_2 (CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | \ | 382 | #define CPU_FTRS_E500_2 (CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | \ |
| 383 | CPU_FTR_SPE_COMP | CPU_FTR_MAYBE_CAN_NAP | \ | 383 | CPU_FTR_SPE_COMP | CPU_FTR_MAYBE_CAN_NAP | \ |
| 384 | CPU_FTR_NODSISRALIGN | CPU_FTR_NOEXECUTE) | 384 | CPU_FTR_NODSISRALIGN | CPU_FTR_NOEXECUTE) |
| 385 | #define CPU_FTRS_E500MC (CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | \ | 385 | #define CPU_FTRS_E500MC (CPU_FTR_USE_TB | CPU_FTR_NODSISRALIGN | \ |
| 386 | CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_NODSISRALIGN | \ | ||
| 387 | CPU_FTR_L2CSR | CPU_FTR_LWSYNC | CPU_FTR_NOEXECUTE | \ | 386 | CPU_FTR_L2CSR | CPU_FTR_LWSYNC | CPU_FTR_NOEXECUTE | \ |
| 388 | CPU_FTR_DBELL) | 387 | CPU_FTR_DBELL) |
| 388 | #define CPU_FTRS_E5500 (CPU_FTR_USE_TB | CPU_FTR_NODSISRALIGN | \ | ||
| 389 | CPU_FTR_L2CSR | CPU_FTR_LWSYNC | CPU_FTR_NOEXECUTE | \ | ||
| 390 | CPU_FTR_DBELL | CPU_FTR_POPCNTB | CPU_FTR_POPCNTD) | ||
| 389 | #define CPU_FTRS_GENERIC_32 (CPU_FTR_COMMON | CPU_FTR_NODSISRALIGN) | 391 | #define CPU_FTRS_GENERIC_32 (CPU_FTR_COMMON | CPU_FTR_NODSISRALIGN) |
| 390 | 392 | ||
| 391 | /* 64-bit CPUs */ | 393 | /* 64-bit CPUs */ |
| @@ -435,11 +437,15 @@ extern const char *powerpc_base_platform; | |||
| 435 | #define CPU_FTRS_COMPATIBLE (CPU_FTR_USE_TB | CPU_FTR_PPCAS_ARCH_V2) | 437 | #define CPU_FTRS_COMPATIBLE (CPU_FTR_USE_TB | CPU_FTR_PPCAS_ARCH_V2) |
| 436 | 438 | ||
| 437 | #ifdef __powerpc64__ | 439 | #ifdef __powerpc64__ |
| 440 | #ifdef CONFIG_PPC_BOOK3E | ||
| 441 | #define CPU_FTRS_POSSIBLE (CPU_FTRS_E5500) | ||
| 442 | #else | ||
| 438 | #define CPU_FTRS_POSSIBLE \ | 443 | #define CPU_FTRS_POSSIBLE \ |
| 439 | (CPU_FTRS_POWER3 | CPU_FTRS_RS64 | CPU_FTRS_POWER4 | \ | 444 | (CPU_FTRS_POWER3 | CPU_FTRS_RS64 | CPU_FTRS_POWER4 | \ |
| 440 | CPU_FTRS_PPC970 | CPU_FTRS_POWER5 | CPU_FTRS_POWER6 | \ | 445 | CPU_FTRS_PPC970 | CPU_FTRS_POWER5 | CPU_FTRS_POWER6 | \ |
| 441 | CPU_FTRS_POWER7 | CPU_FTRS_CELL | CPU_FTRS_PA6T | \ | 446 | CPU_FTRS_POWER7 | CPU_FTRS_CELL | CPU_FTRS_PA6T | \ |
| 442 | CPU_FTR_1T_SEGMENT | CPU_FTR_VSX) | 447 | CPU_FTR_1T_SEGMENT | CPU_FTR_VSX) |
| 448 | #endif | ||
| 443 | #else | 449 | #else |
| 444 | enum { | 450 | enum { |
| 445 | CPU_FTRS_POSSIBLE = | 451 | CPU_FTRS_POSSIBLE = |
| @@ -473,16 +479,21 @@ enum { | |||
| 473 | #endif | 479 | #endif |
| 474 | #ifdef CONFIG_E500 | 480 | #ifdef CONFIG_E500 |
| 475 | CPU_FTRS_E500 | CPU_FTRS_E500_2 | CPU_FTRS_E500MC | | 481 | CPU_FTRS_E500 | CPU_FTRS_E500_2 | CPU_FTRS_E500MC | |
| 482 | CPU_FTRS_E5500 | | ||
| 476 | #endif | 483 | #endif |
| 477 | 0, | 484 | 0, |
| 478 | }; | 485 | }; |
| 479 | #endif /* __powerpc64__ */ | 486 | #endif /* __powerpc64__ */ |
| 480 | 487 | ||
| 481 | #ifdef __powerpc64__ | 488 | #ifdef __powerpc64__ |
| 489 | #ifdef CONFIG_PPC_BOOK3E | ||
| 490 | #define CPU_FTRS_ALWAYS (CPU_FTRS_E5500) | ||
| 491 | #else | ||
| 482 | #define CPU_FTRS_ALWAYS \ | 492 | #define CPU_FTRS_ALWAYS \ |
| 483 | (CPU_FTRS_POWER3 & CPU_FTRS_RS64 & CPU_FTRS_POWER4 & \ | 493 | (CPU_FTRS_POWER3 & CPU_FTRS_RS64 & CPU_FTRS_POWER4 & \ |
| 484 | CPU_FTRS_PPC970 & CPU_FTRS_POWER5 & CPU_FTRS_POWER6 & \ | 494 | CPU_FTRS_PPC970 & CPU_FTRS_POWER5 & CPU_FTRS_POWER6 & \ |
| 485 | CPU_FTRS_POWER7 & CPU_FTRS_CELL & CPU_FTRS_PA6T & CPU_FTRS_POSSIBLE) | 495 | CPU_FTRS_POWER7 & CPU_FTRS_CELL & CPU_FTRS_PA6T & CPU_FTRS_POSSIBLE) |
| 496 | #endif | ||
| 486 | #else | 497 | #else |
| 487 | enum { | 498 | enum { |
| 488 | CPU_FTRS_ALWAYS = | 499 | CPU_FTRS_ALWAYS = |
| @@ -513,6 +524,7 @@ enum { | |||
| 513 | #endif | 524 | #endif |
| 514 | #ifdef CONFIG_E500 | 525 | #ifdef CONFIG_E500 |
| 515 | CPU_FTRS_E500 & CPU_FTRS_E500_2 & CPU_FTRS_E500MC & | 526 | CPU_FTRS_E500 & CPU_FTRS_E500_2 & CPU_FTRS_E500MC & |
| 527 | CPU_FTRS_E5500 & | ||
| 516 | #endif | 528 | #endif |
| 517 | CPU_FTRS_POSSIBLE, | 529 | CPU_FTRS_POSSIBLE, |
| 518 | }; | 530 | }; |
diff --git a/arch/powerpc/include/asm/pte-common.h b/arch/powerpc/include/asm/pte-common.h index 811f04ac3660..8d1569c29042 100644 --- a/arch/powerpc/include/asm/pte-common.h +++ b/arch/powerpc/include/asm/pte-common.h | |||
| @@ -162,7 +162,7 @@ extern unsigned long bad_call_to_PMD_PAGE_SIZE(void); | |||
| 162 | * on platforms where such control is possible. | 162 | * on platforms where such control is possible. |
| 163 | */ | 163 | */ |
| 164 | #if defined(CONFIG_KGDB) || defined(CONFIG_XMON) || defined(CONFIG_BDI_SWITCH) ||\ | 164 | #if defined(CONFIG_KGDB) || defined(CONFIG_XMON) || defined(CONFIG_BDI_SWITCH) ||\ |
| 165 | defined(CONFIG_KPROBES) | 165 | defined(CONFIG_KPROBES) || defined(CONFIG_DYNAMIC_FTRACE) |
| 166 | #define PAGE_KERNEL_TEXT PAGE_KERNEL_X | 166 | #define PAGE_KERNEL_TEXT PAGE_KERNEL_X |
| 167 | #else | 167 | #else |
| 168 | #define PAGE_KERNEL_TEXT PAGE_KERNEL_ROX | 168 | #define PAGE_KERNEL_TEXT PAGE_KERNEL_ROX |
diff --git a/arch/powerpc/kernel/cputable.c b/arch/powerpc/kernel/cputable.c index c9b68d07ac4f..b9602ee06deb 100644 --- a/arch/powerpc/kernel/cputable.c +++ b/arch/powerpc/kernel/cputable.c | |||
| @@ -1973,7 +1973,7 @@ static struct cpu_spec __initdata cpu_specs[] = { | |||
| 1973 | .pvr_mask = 0xffff0000, | 1973 | .pvr_mask = 0xffff0000, |
| 1974 | .pvr_value = 0x80240000, | 1974 | .pvr_value = 0x80240000, |
| 1975 | .cpu_name = "e5500", | 1975 | .cpu_name = "e5500", |
| 1976 | .cpu_features = CPU_FTRS_E500MC, | 1976 | .cpu_features = CPU_FTRS_E5500, |
| 1977 | .cpu_user_features = COMMON_USER_BOOKE, | 1977 | .cpu_user_features = COMMON_USER_BOOKE, |
| 1978 | .mmu_features = MMU_FTR_TYPE_FSL_E | MMU_FTR_BIG_PHYS | | 1978 | .mmu_features = MMU_FTR_TYPE_FSL_E | MMU_FTR_BIG_PHYS | |
| 1979 | MMU_FTR_USE_TLBILX, | 1979 | MMU_FTR_USE_TLBILX, |
diff --git a/arch/powerpc/kernel/crash.c b/arch/powerpc/kernel/crash.c index 3d3d416339dd..5b5e1f002a8e 100644 --- a/arch/powerpc/kernel/crash.c +++ b/arch/powerpc/kernel/crash.c | |||
| @@ -163,7 +163,7 @@ static void crash_kexec_prepare_cpus(int cpu) | |||
| 163 | } | 163 | } |
| 164 | 164 | ||
| 165 | /* wait for all the CPUs to hit real mode but timeout if they don't come in */ | 165 | /* wait for all the CPUs to hit real mode but timeout if they don't come in */ |
| 166 | #if defined(CONFIG_PPC_STD_MMU_64) && defined(CONFIG_SMP) | 166 | #ifdef CONFIG_PPC_STD_MMU_64 |
| 167 | static void crash_kexec_wait_realmode(int cpu) | 167 | static void crash_kexec_wait_realmode(int cpu) |
| 168 | { | 168 | { |
| 169 | unsigned int msecs; | 169 | unsigned int msecs; |
| @@ -188,9 +188,7 @@ static void crash_kexec_wait_realmode(int cpu) | |||
| 188 | } | 188 | } |
| 189 | mb(); | 189 | mb(); |
| 190 | } | 190 | } |
| 191 | #else | 191 | #endif /* CONFIG_PPC_STD_MMU_64 */ |
| 192 | static inline void crash_kexec_wait_realmode(int cpu) {} | ||
| 193 | #endif | ||
| 194 | 192 | ||
| 195 | /* | 193 | /* |
| 196 | * This function will be called by secondary cpus or by kexec cpu | 194 | * This function will be called by secondary cpus or by kexec cpu |
| @@ -235,7 +233,9 @@ void crash_kexec_secondary(struct pt_regs *regs) | |||
| 235 | crash_ipi_callback(regs); | 233 | crash_ipi_callback(regs); |
| 236 | } | 234 | } |
| 237 | 235 | ||
| 238 | #else | 236 | #else /* ! CONFIG_SMP */ |
| 237 | static inline void crash_kexec_wait_realmode(int cpu) {} | ||
| 238 | |||
| 239 | static void crash_kexec_prepare_cpus(int cpu) | 239 | static void crash_kexec_prepare_cpus(int cpu) |
| 240 | { | 240 | { |
| 241 | /* | 241 | /* |
| @@ -255,7 +255,7 @@ void crash_kexec_secondary(struct pt_regs *regs) | |||
| 255 | { | 255 | { |
| 256 | cpus_in_sr = CPU_MASK_NONE; | 256 | cpus_in_sr = CPU_MASK_NONE; |
| 257 | } | 257 | } |
| 258 | #endif | 258 | #endif /* CONFIG_SMP */ |
| 259 | 259 | ||
| 260 | /* | 260 | /* |
| 261 | * Register a function to be called on shutdown. Only use this if you | 261 | * Register a function to be called on shutdown. Only use this if you |
diff --git a/arch/powerpc/kernel/legacy_serial.c b/arch/powerpc/kernel/legacy_serial.c index c834757bebc0..2b97b80d6d7d 100644 --- a/arch/powerpc/kernel/legacy_serial.c +++ b/arch/powerpc/kernel/legacy_serial.c | |||
| @@ -330,9 +330,11 @@ void __init find_legacy_serial_ports(void) | |||
| 330 | if (!parent) | 330 | if (!parent) |
| 331 | continue; | 331 | continue; |
| 332 | if (of_match_node(legacy_serial_parents, parent) != NULL) { | 332 | if (of_match_node(legacy_serial_parents, parent) != NULL) { |
| 333 | index = add_legacy_soc_port(np, np); | 333 | if (of_device_is_available(np)) { |
| 334 | if (index >= 0 && np == stdout) | 334 | index = add_legacy_soc_port(np, np); |
| 335 | legacy_serial_console = index; | 335 | if (index >= 0 && np == stdout) |
| 336 | legacy_serial_console = index; | ||
| 337 | } | ||
| 336 | } | 338 | } |
| 337 | of_node_put(parent); | 339 | of_node_put(parent); |
| 338 | } | 340 | } |
diff --git a/arch/powerpc/kernel/perf_event.c b/arch/powerpc/kernel/perf_event.c index c4063b7f49a0..822f63008ae1 100644 --- a/arch/powerpc/kernel/perf_event.c +++ b/arch/powerpc/kernel/perf_event.c | |||
| @@ -398,6 +398,25 @@ static int check_excludes(struct perf_event **ctrs, unsigned int cflags[], | |||
| 398 | return 0; | 398 | return 0; |
| 399 | } | 399 | } |
| 400 | 400 | ||
| 401 | static u64 check_and_compute_delta(u64 prev, u64 val) | ||
| 402 | { | ||
| 403 | u64 delta = (val - prev) & 0xfffffffful; | ||
| 404 | |||
| 405 | /* | ||
| 406 | * POWER7 can roll back counter values, if the new value is smaller | ||
| 407 | * than the previous value it will cause the delta and the counter to | ||
| 408 | * have bogus values unless we rolled a counter over. If a coutner is | ||
| 409 | * rolled back, it will be smaller, but within 256, which is the maximum | ||
| 410 | * number of events to rollback at once. If we dectect a rollback | ||
| 411 | * return 0. This can lead to a small lack of precision in the | ||
| 412 | * counters. | ||
| 413 | */ | ||
| 414 | if (prev > val && (prev - val) < 256) | ||
| 415 | delta = 0; | ||
| 416 | |||
| 417 | return delta; | ||
| 418 | } | ||
| 419 | |||
| 401 | static void power_pmu_read(struct perf_event *event) | 420 | static void power_pmu_read(struct perf_event *event) |
| 402 | { | 421 | { |
| 403 | s64 val, delta, prev; | 422 | s64 val, delta, prev; |
| @@ -416,10 +435,11 @@ static void power_pmu_read(struct perf_event *event) | |||
| 416 | prev = local64_read(&event->hw.prev_count); | 435 | prev = local64_read(&event->hw.prev_count); |
| 417 | barrier(); | 436 | barrier(); |
| 418 | val = read_pmc(event->hw.idx); | 437 | val = read_pmc(event->hw.idx); |
| 438 | delta = check_and_compute_delta(prev, val); | ||
| 439 | if (!delta) | ||
| 440 | return; | ||
| 419 | } while (local64_cmpxchg(&event->hw.prev_count, prev, val) != prev); | 441 | } while (local64_cmpxchg(&event->hw.prev_count, prev, val) != prev); |
| 420 | 442 | ||
| 421 | /* The counters are only 32 bits wide */ | ||
| 422 | delta = (val - prev) & 0xfffffffful; | ||
| 423 | local64_add(delta, &event->count); | 443 | local64_add(delta, &event->count); |
| 424 | local64_sub(delta, &event->hw.period_left); | 444 | local64_sub(delta, &event->hw.period_left); |
| 425 | } | 445 | } |
| @@ -449,8 +469,9 @@ static void freeze_limited_counters(struct cpu_hw_events *cpuhw, | |||
| 449 | val = (event->hw.idx == 5) ? pmc5 : pmc6; | 469 | val = (event->hw.idx == 5) ? pmc5 : pmc6; |
| 450 | prev = local64_read(&event->hw.prev_count); | 470 | prev = local64_read(&event->hw.prev_count); |
| 451 | event->hw.idx = 0; | 471 | event->hw.idx = 0; |
| 452 | delta = (val - prev) & 0xfffffffful; | 472 | delta = check_and_compute_delta(prev, val); |
| 453 | local64_add(delta, &event->count); | 473 | if (delta) |
| 474 | local64_add(delta, &event->count); | ||
| 454 | } | 475 | } |
| 455 | } | 476 | } |
| 456 | 477 | ||
| @@ -458,14 +479,16 @@ static void thaw_limited_counters(struct cpu_hw_events *cpuhw, | |||
| 458 | unsigned long pmc5, unsigned long pmc6) | 479 | unsigned long pmc5, unsigned long pmc6) |
| 459 | { | 480 | { |
| 460 | struct perf_event *event; | 481 | struct perf_event *event; |
| 461 | u64 val; | 482 | u64 val, prev; |
| 462 | int i; | 483 | int i; |
| 463 | 484 | ||
| 464 | for (i = 0; i < cpuhw->n_limited; ++i) { | 485 | for (i = 0; i < cpuhw->n_limited; ++i) { |
| 465 | event = cpuhw->limited_counter[i]; | 486 | event = cpuhw->limited_counter[i]; |
| 466 | event->hw.idx = cpuhw->limited_hwidx[i]; | 487 | event->hw.idx = cpuhw->limited_hwidx[i]; |
| 467 | val = (event->hw.idx == 5) ? pmc5 : pmc6; | 488 | val = (event->hw.idx == 5) ? pmc5 : pmc6; |
| 468 | local64_set(&event->hw.prev_count, val); | 489 | prev = local64_read(&event->hw.prev_count); |
| 490 | if (check_and_compute_delta(prev, val)) | ||
| 491 | local64_set(&event->hw.prev_count, val); | ||
| 469 | perf_event_update_userpage(event); | 492 | perf_event_update_userpage(event); |
| 470 | } | 493 | } |
| 471 | } | 494 | } |
| @@ -1197,7 +1220,7 @@ static void record_and_restart(struct perf_event *event, unsigned long val, | |||
| 1197 | 1220 | ||
| 1198 | /* we don't have to worry about interrupts here */ | 1221 | /* we don't have to worry about interrupts here */ |
| 1199 | prev = local64_read(&event->hw.prev_count); | 1222 | prev = local64_read(&event->hw.prev_count); |
| 1200 | delta = (val - prev) & 0xfffffffful; | 1223 | delta = check_and_compute_delta(prev, val); |
| 1201 | local64_add(delta, &event->count); | 1224 | local64_add(delta, &event->count); |
| 1202 | 1225 | ||
| 1203 | /* | 1226 | /* |
diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c index 375480c56eb9..f33acfd872ad 100644 --- a/arch/powerpc/kernel/time.c +++ b/arch/powerpc/kernel/time.c | |||
| @@ -229,6 +229,9 @@ static u64 scan_dispatch_log(u64 stop_tb) | |||
| 229 | u64 stolen = 0; | 229 | u64 stolen = 0; |
| 230 | u64 dtb; | 230 | u64 dtb; |
| 231 | 231 | ||
| 232 | if (!dtl) | ||
| 233 | return 0; | ||
| 234 | |||
| 232 | if (i == vpa->dtl_idx) | 235 | if (i == vpa->dtl_idx) |
| 233 | return 0; | 236 | return 0; |
| 234 | while (i < vpa->dtl_idx) { | 237 | while (i < vpa->dtl_idx) { |
diff --git a/arch/powerpc/platforms/powermac/smp.c b/arch/powerpc/platforms/powermac/smp.c index a830c5e80657..bc5f0dc6ae1e 100644 --- a/arch/powerpc/platforms/powermac/smp.c +++ b/arch/powerpc/platforms/powermac/smp.c | |||
| @@ -842,6 +842,7 @@ static void __devinit smp_core99_setup_cpu(int cpu_nr) | |||
| 842 | mpic_setup_this_cpu(); | 842 | mpic_setup_this_cpu(); |
| 843 | } | 843 | } |
| 844 | 844 | ||
| 845 | #ifdef CONFIG_PPC64 | ||
| 845 | #ifdef CONFIG_HOTPLUG_CPU | 846 | #ifdef CONFIG_HOTPLUG_CPU |
| 846 | static int smp_core99_cpu_notify(struct notifier_block *self, | 847 | static int smp_core99_cpu_notify(struct notifier_block *self, |
| 847 | unsigned long action, void *hcpu) | 848 | unsigned long action, void *hcpu) |
| @@ -879,7 +880,6 @@ static struct notifier_block __cpuinitdata smp_core99_cpu_nb = { | |||
| 879 | 880 | ||
| 880 | static void __init smp_core99_bringup_done(void) | 881 | static void __init smp_core99_bringup_done(void) |
| 881 | { | 882 | { |
| 882 | #ifdef CONFIG_PPC64 | ||
| 883 | extern void g5_phy_disable_cpu1(void); | 883 | extern void g5_phy_disable_cpu1(void); |
| 884 | 884 | ||
| 885 | /* Close i2c bus if it was used for tb sync */ | 885 | /* Close i2c bus if it was used for tb sync */ |
| @@ -894,14 +894,14 @@ static void __init smp_core99_bringup_done(void) | |||
| 894 | set_cpu_present(1, false); | 894 | set_cpu_present(1, false); |
| 895 | g5_phy_disable_cpu1(); | 895 | g5_phy_disable_cpu1(); |
| 896 | } | 896 | } |
| 897 | #endif /* CONFIG_PPC64 */ | ||
| 898 | |||
| 899 | #ifdef CONFIG_HOTPLUG_CPU | 897 | #ifdef CONFIG_HOTPLUG_CPU |
| 900 | register_cpu_notifier(&smp_core99_cpu_nb); | 898 | register_cpu_notifier(&smp_core99_cpu_nb); |
| 901 | #endif | 899 | #endif |
| 900 | |||
| 902 | if (ppc_md.progress) | 901 | if (ppc_md.progress) |
| 903 | ppc_md.progress("smp_core99_bringup_done", 0x349); | 902 | ppc_md.progress("smp_core99_bringup_done", 0x349); |
| 904 | } | 903 | } |
| 904 | #endif /* CONFIG_PPC64 */ | ||
| 905 | 905 | ||
| 906 | #ifdef CONFIG_HOTPLUG_CPU | 906 | #ifdef CONFIG_HOTPLUG_CPU |
| 907 | 907 | ||
| @@ -975,7 +975,9 @@ static void pmac_cpu_die(void) | |||
| 975 | struct smp_ops_t core99_smp_ops = { | 975 | struct smp_ops_t core99_smp_ops = { |
| 976 | .message_pass = smp_mpic_message_pass, | 976 | .message_pass = smp_mpic_message_pass, |
| 977 | .probe = smp_core99_probe, | 977 | .probe = smp_core99_probe, |
| 978 | #ifdef CONFIG_PPC64 | ||
| 978 | .bringup_done = smp_core99_bringup_done, | 979 | .bringup_done = smp_core99_bringup_done, |
| 980 | #endif | ||
| 979 | .kick_cpu = smp_core99_kick_cpu, | 981 | .kick_cpu = smp_core99_kick_cpu, |
| 980 | .setup_cpu = smp_core99_setup_cpu, | 982 | .setup_cpu = smp_core99_setup_cpu, |
| 981 | .give_timebase = smp_core99_give_timebase, | 983 | .give_timebase = smp_core99_give_timebase, |
diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c index 000724149089..6c42cfde8415 100644 --- a/arch/powerpc/platforms/pseries/setup.c +++ b/arch/powerpc/platforms/pseries/setup.c | |||
| @@ -287,14 +287,22 @@ static int alloc_dispatch_logs(void) | |||
| 287 | int cpu, ret; | 287 | int cpu, ret; |
| 288 | struct paca_struct *pp; | 288 | struct paca_struct *pp; |
| 289 | struct dtl_entry *dtl; | 289 | struct dtl_entry *dtl; |
| 290 | struct kmem_cache *dtl_cache; | ||
| 290 | 291 | ||
| 291 | if (!firmware_has_feature(FW_FEATURE_SPLPAR)) | 292 | if (!firmware_has_feature(FW_FEATURE_SPLPAR)) |
| 292 | return 0; | 293 | return 0; |
| 293 | 294 | ||
| 295 | dtl_cache = kmem_cache_create("dtl", DISPATCH_LOG_BYTES, | ||
| 296 | DISPATCH_LOG_BYTES, 0, NULL); | ||
| 297 | if (!dtl_cache) { | ||
| 298 | pr_warn("Failed to create dispatch trace log buffer cache\n"); | ||
| 299 | pr_warn("Stolen time statistics will be unreliable\n"); | ||
| 300 | return 0; | ||
| 301 | } | ||
| 302 | |||
| 294 | for_each_possible_cpu(cpu) { | 303 | for_each_possible_cpu(cpu) { |
| 295 | pp = &paca[cpu]; | 304 | pp = &paca[cpu]; |
| 296 | dtl = kmalloc_node(DISPATCH_LOG_BYTES, GFP_KERNEL, | 305 | dtl = kmem_cache_alloc(dtl_cache, GFP_KERNEL); |
| 297 | cpu_to_node(cpu)); | ||
| 298 | if (!dtl) { | 306 | if (!dtl) { |
| 299 | pr_warn("Failed to allocate dispatch trace log for cpu %d\n", | 307 | pr_warn("Failed to allocate dispatch trace log for cpu %d\n", |
| 300 | cpu); | 308 | cpu); |
diff --git a/arch/powerpc/sysdev/fsl_pci.c b/arch/powerpc/sysdev/fsl_pci.c index f8f7f28c6343..68ca9290df94 100644 --- a/arch/powerpc/sysdev/fsl_pci.c +++ b/arch/powerpc/sysdev/fsl_pci.c | |||
| @@ -324,6 +324,11 @@ int __init fsl_add_bridge(struct device_node *dev, int is_primary) | |||
| 324 | struct resource rsrc; | 324 | struct resource rsrc; |
| 325 | const int *bus_range; | 325 | const int *bus_range; |
| 326 | 326 | ||
| 327 | if (!of_device_is_available(dev)) { | ||
| 328 | pr_warning("%s: disabled\n", dev->full_name); | ||
| 329 | return -ENODEV; | ||
| 330 | } | ||
| 331 | |||
| 327 | pr_debug("Adding PCI host bridge %s\n", dev->full_name); | 332 | pr_debug("Adding PCI host bridge %s\n", dev->full_name); |
| 328 | 333 | ||
| 329 | /* Fetch host bridge registers address */ | 334 | /* Fetch host bridge registers address */ |
