Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756898AbbHZMKD (ORCPT ); Wed, 26 Aug 2015 08:10:03 -0400 Received: from mail-bn1bon0116.outbound.protection.outlook.com ([157.56.111.116]:50176 "EHLO na01-bn1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1756803AbbHZMJ6 (ORCPT ); Wed, 26 Aug 2015 08:09:58 -0400 Authentication-Results: spf=fail (sender IP is 192.88.158.2) smtp.mailfrom=freescale.com; freescale.mail.onmicrosoft.com; dkim=none (message not signed) header.d=none; From: Chenhui Zhao To: , CC: , Subject: [PATCH v2,4/5] PowerPC/mpc85xx: Add hotplug support on E5500 and E500MC cores Date: Wed, 26 Aug 2015 20:09:47 +0800 Message-ID: <1440590988-25594-4-git-send-email-chenhui.zhao@freescale.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1440590988-25594-1-git-send-email-chenhui.zhao@freescale.com> References: <1440590988-25594-1-git-send-email-chenhui.zhao@freescale.com> X-EOPAttributedMessage: 0 X-Microsoft-Exchange-Diagnostics: 1;BY2FFO11FD025;1:gg8H0DyRdUhMw7HLGxQJcKgtbjk0VQG1vFdqL9z2QaKdoGSO8l/AIRAlCtgosdY2edYs3A2NxDZ5dTMP9Ie6aWvf6XmxWme5zC/t09s9fFC9HO66cqvxTg9LYRjMhq0BfijXnkxQc2hO9pFSCU7oZs8mzrDQS0NBHz4S+oClI5wjZMMguj9Pa9kDzW+oOpAOTQ52a5RZNh/YlJF52wQFd4zM1o6m72M/4TQNReECn9XUBXamZZsBUJIchfp1UdvWFtQ5NCMsdklrNbSVhE2VzEPI0ud/IelGAOwFruqaY0YsDaTfXz8HG6oz1oY5JSjuCm32B9ADD3BlbNsGUP4Oya4RMhL/f6g8n37zsGsAV8jvOS+L4L9DWF9VqueMT/fOUuAuPWiThVoK8hNcZ9HNo31nCH+gResctBk4qKjITwY= X-Forefront-Antispam-Report: CIP:192.88.158.2;CTRY:US;IPV:NLI;EFV:NLI;SFV:NSPM;SFS:(10019020)(6009001)(2980300002)(339900001)(3050300001)(199003)(189002)(33646002)(5001860100001)(104016003)(4001450100002)(77096005)(106466001)(46102003)(47776003)(85426001)(189998001)(50466002)(5007970100001)(4001540100001)(19580395003)(50226001)(64706001)(36756003)(81156007)(5001770100001)(76176999)(68736005)(62966003)(49486002)(69596002)(50986999)(86362001)(107886002)(5001960100002)(97736004)(77156002)(19580405001)(48376002)(6806004)(92566002)(5001830100001)(5003940100001)(105606002)(87936001)(2950100001)(229853001)(4001430100001);DIR:OUT;SFP:1102;SCL:1;SRVR:BY2PR03MB297;H:az84smr01.freescale.net;FPR:;SPF:Fail;PTR:InfoDomainNonexistent;A:1;MX:1;LANG:en; MIME-Version: 1.0 Content-Type: text/plain X-Microsoft-Exchange-Diagnostics: 1;BY2PR03MB297;2:Sta9WBQGUHrG6RgfJgqM06VWtwjgr8AgPcW+WqNHGNrN6BvtsIwhkQ7fLw4uRbBAolR6sL/T2QJnQ/8X3Vy8Tn3fHrD9KalrkI37cr6htchQ88oXdX4xOuKZUXcWjyTEQf7tkNXJ4jeWirkjb3oZMxEksy8xUY6OeLwk4qdt+YQ=;3:mzn9/MOvcu6iuswVA8brBehPPi47i6DyZ1Y5liixqCG8bpXoHuiDI+wyc9Gs3zBf84gMw5QunMI8gFzDFJd0g0e2QBkVslfxIR+LfNy2+ia/9ykNwypStEsse2Gcj44fPExVKhqDgErV+JdOclE48AO6GXsSBP6SQdQX+TGiExV+lYaSaIbjb5RRlrHckP4LM+b7z5DBSpoGOdqhRL2lwy2jqHIgUOyXdZ9EHb/9Tx4=;25:i2GdrUrgeNIPiQRJDX5nrFxsMfbv4P+q3FsPoD6cG3951s0Qz7pZOWc2PJo6CuZ4tEzLcihKCEKeoggIHjIR9eJM9yMXJg5zIODv61xvRQIpwB3RedEVrBjiHnRiv6Y3/xkBO7rBpZVRM0lt7AWxun0Zr4oweC5JUagdTPuLe+OSpsP3iz0Y1POYq9arFoeVQodC2hx3sWv8BmysRusHlgzb6mno20nuCJzuLGUmiYxtH5yvE1xomZlcmhG0J2Vdw3cmUsKnbBhBPxL3lEtbhQ== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BY2PR03MB297; X-Microsoft-Exchange-Diagnostics: 1;BY2PR03MB297;20:mXiHwxHNVXqKVlpYuLNAm4OrIsG4Xasw+38mTcqFrROOpG0TyGGAxbAF45T7fgtl7uQKfXdFdcmuL8DGoO3IQGa9yj0Lbnw8toqxYCEFFdCx6f+Fsmo4/m9Wbf1drrA8w8WQA3ig/YUfJEBgzzNq+dKpS0HFwHHxH68luld1FswetZvTcOsWOHqk62Aq4vDpwc6CDN/K682ZYZm4H6+QIF9VSUccxph5GlfYYxL21Rbv0Q2vk0COaZ/7yLluVVbMy0dQiKgJGBgcLA+gAZUlyrlcdwE/hZYYXG8Kp07zqS9xBi2Gk6SN/wuhoL/1egz7VI5KzB2TcDfE1gxqiy8yZfBP6HjHmmxTCb1dm66YZM8=;4:qf0EfTfoJH7bGXh/aIOVE9cqUdIoH8CaTIbJZoiycEXPALdrgvUgOJdnvG10WWKT3v+gkvJsPWyxFryIHtwngPTEOxM+4wkf8Mef+Xg0/+zjG7pLNTncXKOmVHmcFNNx4ID4pMhg+/X7fv1d09hVvDfwN7rZOUIqIWnFb6OfnZvv7ewDrQ5juDBKPwUUKmiKZzhWuk7+hKR2qtO3nKmKV7c7gMtf9a/kNmaQbzmP8ImqIVFWoZeZh90Hk5PgDAHsaDv7VJf4mm1ojHTP9VB+GO8eqInr4YCZOZstcdt8oxfNlEGxi7aO0w5Zw22zV3Iq X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(8121501046)(5005006)(3002001);SRVR:BY2PR03MB297;BCL:0;PCL:0;RULEID:;SRVR:BY2PR03MB297; X-Forefront-PRVS: 0680FADD48 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;BY2PR03MB297;23:YySXf1L/9UhtCuUOoy71BoNVdFDkPKcUWXJz5hB5rO?= =?us-ascii?Q?86uerYTI5meO8TTjxdXLRQPstheC150YmXwkGhXGWNsOF3mfvy45jTQH2GOF?= =?us-ascii?Q?T1bzMYTpTpICTK1L6XLdo/nuzPp2BZkD7zyNckERTotKzG9QkbMfvWTeVjIC?= =?us-ascii?Q?VH0WtRF1jkC8enS/gBG3Zj3vY6mO8c4HoP0cQEA047260AQXAZPcGKBmd1OX?= =?us-ascii?Q?Er40RNADg7Gy+qHScjScLbs7b9biAr8uYLeF4bbWIrP+TTvldYrMJeXoRefB?= =?us-ascii?Q?0KscOvCzdUIhA5lY525KdmocIEN8mSCVxfCNXtNdJPO9WGjQAD9W6KPXZVzs?= =?us-ascii?Q?uoeTnoVdWNTB6BNXoJDD06xA4lI1iF1j5DRic9dy0+/0QqbQQ4bLz97uXW6k?= =?us-ascii?Q?frObJaSXlPuv9BqVXxEZoOyfvp3yY4c/9kr1U0Ti22hi5DID06kMgIyT2Ngd?= =?us-ascii?Q?5w314pakaqfnS6Hv+e/X4VUDzNEa+YiuLd48kB5uSDPDQixqpGXFuFeINvRF?= =?us-ascii?Q?2xSd/K4KH6Mw9gGJBOUVn6kqbivCY56cEutXiHUU84SGz4TIM3iLoJp3+9yW?= =?us-ascii?Q?6YFHNYxbgWnl+UM1oGc4JkbnkUMW8EOTCh3dnEIm289HXGlwNkQpj9UrcCkw?= =?us-ascii?Q?UWxUWrg54weYwdKlYekIKTQtS+yoYJrvb+Y324HcXFM1FiL0EQnbV1ACpiMg?= =?us-ascii?Q?7p8iHWlnQwd8jIK9MwOpydpjX5tqA4C5Ho8b4WP2JKEsdh0UMP3IbV4UB6Vf?= =?us-ascii?Q?ZKJmeXKPt2Hh35Z6vLSwJXe2qshaLNdC0naMBq3CAv/04DvZ3gbt16qmtyUw?= =?us-ascii?Q?FtOd7mAgzqEFjE1OgyqMkf9ih7FCVzTKmbiy6JvsT6TRDMS610PqFyo+mVx+?= =?us-ascii?Q?/BPbDSKpNNnnvONugnAtcaE2K9+pMaDzSI164+tRIDJiN9mKDd2W12PEH5Nq?= =?us-ascii?Q?uBQXIs+aPpy8OZBIgE/nHfEKnqfRFAUNOOxbRBCP2J/QrCXWpOY38nfzoRdr?= =?us-ascii?Q?e8cbt9bzViEHMlA14TxSk+Z9GKDx+IDQX7GU9mePTwQjVabHTqAWdWemAN0c?= =?us-ascii?Q?EgNozfKXfc89bRrQzE3SbzQcitEwFdW7lGYZiCYja5zLRtELE+1EOhjlc9Vj?= =?us-ascii?Q?cbHVx+cSv52y+5SuFt8te5YWFRHdOaTnzY1ZLYmltJQZk/c9yE/tfqMcvdip?= =?us-ascii?Q?10v0nD8xKuvYtMGGwRWpopcKWKJUp49MEUmA3plqi8uWonf7jKOmVxBpP6EQ?= =?us-ascii?Q?Iq7Q5OJr9mM/tBey0in4vPqMjNov2mXVUTvKlmvJKLZ0quU0t71DUiG7GA0w?= =?us-ascii?Q?=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1;BY2PR03MB297;5:8ON/AAFQXcLNrFruqEcqXx6y1JjQeu4OC5eZOeV8YQjW0WD8MwKiGzsfvkSVPw7OE/Xb67nE2aryUL6/ARH3r8ZiHSRMYLHSqaFO62KANCisHliWOcd7/I3UNFQGlzqP0BhnEMXeXmkgBroeYwYX2w==;24:imTMCAZ2IowB79J/q8jX9MLLpBkSPyqyJOuk+mV1xnLCo21m0vxJWX+UZ2Vdf4Bp7VlugmTs267/lm5Djh5hV9xWrwWtA8NpeoIEcokVo6M=;20:qSQnLAMRsrqUU5ET3SnGchlQLoNo9ZHbf/u9+FZWEDlL7cvxwDrz8itOdnWqTfn2SsCQFNzquzWi3vXgUpCPfg== X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 Aug 2015 12:09:54.3803 (UTC) X-MS-Exchange-CrossTenant-Id: 710a03f5-10f6-4d38-9ff4-a80b81da590d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=710a03f5-10f6-4d38-9ff4-a80b81da590d;Ip=[192.88.158.2];Helo=[az84smr01.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY2PR03MB297 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 10354 Lines: 381 Freescale E500MC and E5500 core-based platforms, like P4080, T1040, support disabling/enabling CPU dynamically. This patch adds this feature on those platforms. Signed-off-by: Chenhui Zhao Signed-off-by: Tang Yuantian --- major changes for v2: * factor out smp_85xx_start_cpu() * move fsl_rcpm_init() into mpc85xx_smp_init() due to the init sequence * add hard_irq_disable() after local_irq_save(). for platforms that implement lazy enabling/disabling of interrupts, call hard_irq_disable() to ensure interrupts are disabled physically. arch/powerpc/Kconfig | 2 +- arch/powerpc/include/asm/smp.h | 3 + arch/powerpc/kernel/smp.c | 7 +- arch/powerpc/platforms/85xx/smp.c | 193 ++++++++++++++++++++++---------------- arch/powerpc/platforms/85xx/smp.h | 1 + 5 files changed, 122 insertions(+), 84 deletions(-) diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index 5ef2711..dd9e252 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig @@ -386,7 +386,7 @@ config SWIOTLB config HOTPLUG_CPU bool "Support for enabling/disabling CPUs" depends on SMP && (PPC_PSERIES || \ - PPC_PMAC || PPC_POWERNV || (PPC_85xx && !PPC_E500MC)) + PPC_PMAC || PPC_POWERNV || FSL_SOC_BOOKE) ---help--- Say Y here to be able to disable and re-enable individual CPUs at runtime on SMP machines. diff --git a/arch/powerpc/include/asm/smp.h b/arch/powerpc/include/asm/smp.h index 825663c..4ff5b71 100644 --- a/arch/powerpc/include/asm/smp.h +++ b/arch/powerpc/include/asm/smp.h @@ -67,6 +67,9 @@ void generic_cpu_die(unsigned int cpu); void generic_set_cpu_dead(unsigned int cpu); void generic_set_cpu_up(unsigned int cpu); int generic_check_cpu_restart(unsigned int cpu); +int check_cpu_dead(unsigned int cpu); +#else +#define generic_set_cpu_up(i) do { } while (0) #endif #ifdef CONFIG_PPC64 diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c index ec9ec20..95111f2 100644 --- a/arch/powerpc/kernel/smp.c +++ b/arch/powerpc/kernel/smp.c @@ -427,7 +427,7 @@ void generic_cpu_die(unsigned int cpu) for (i = 0; i < 100; i++) { smp_rmb(); - if (per_cpu(cpu_state, cpu) == CPU_DEAD) + if (check_cpu_dead(cpu)) return; msleep(100); } @@ -454,6 +454,11 @@ int generic_check_cpu_restart(unsigned int cpu) return per_cpu(cpu_state, cpu) == CPU_UP_PREPARE; } +int check_cpu_dead(unsigned int cpu) +{ + return per_cpu(cpu_state, cpu) == CPU_DEAD; +} + static bool secondaries_inhibited(void) { return kvm_hv_mode_active(); diff --git a/arch/powerpc/platforms/85xx/smp.c b/arch/powerpc/platforms/85xx/smp.c index f9552b8..73eb994 100644 --- a/arch/powerpc/platforms/85xx/smp.c +++ b/arch/powerpc/platforms/85xx/smp.c @@ -10,6 +10,8 @@ * option) any later version. */ +#define pr_fmt(fmt) "smp: %s: " fmt, __func__ + #include #include #include @@ -52,6 +54,7 @@ static void mpc85xx_give_timebase(void) unsigned long flags; local_irq_save(flags); + hard_irq_disable(); while (!tb_req) barrier(); @@ -100,6 +103,7 @@ static void mpc85xx_take_timebase(void) unsigned long flags; local_irq_save(flags); + hard_irq_disable(); tb_req = 1; while (!tb_valid) @@ -135,8 +139,31 @@ static void smp_85xx_mach_cpu_die(void) while (1) ; } + +static void qoriq_cpu_kill(unsigned int cpu) +{ + int i; + + for (i = 0; i < 500; i++) { + if (check_cpu_dead(cpu)) { +#ifdef CONFIG_PPC64 + paca[cpu].cpu_start = 0; +#endif + return; + } + msleep(20); + } + pr_err("CPU%d didn't die...\n", cpu); +} #endif +/* + * To keep it compatible with old boot program which uses + * cache-inhibit spin table, we need to flush the cache + * before accessing spin table to invalidate any staled data. + * We also need to flush the cache after writing to spin + * table to push data out. + */ static inline void flush_spin_table(void *spin_table) { flush_dcache_range((ulong)spin_table, @@ -168,51 +195,20 @@ static void wake_hw_thread(void *info) } #endif -static int smp_85xx_kick_cpu(int nr) +static int smp_85xx_start_cpu(int cpu) { - unsigned long flags; - const u64 *cpu_rel_addr; - __iomem struct epapr_spin_table *spin_table; + int ret = 0; struct device_node *np; - int hw_cpu = get_hard_smp_processor_id(nr); + const u64 *cpu_rel_addr; + unsigned long flags; int ioremappable; - int ret = 0; - - WARN_ON(nr < 0 || nr >= NR_CPUS); - WARN_ON(hw_cpu < 0 || hw_cpu >= NR_CPUS); - - pr_debug("smp_85xx_kick_cpu: kick CPU #%d\n", nr); - -#ifdef CONFIG_PPC64 - /* Threads don't use the spin table */ - if (cpu_thread_in_core(nr) != 0) { - int primary = cpu_first_thread_sibling(nr); - - if (WARN_ON_ONCE(!cpu_has_feature(CPU_FTR_SMT))) - return -ENOENT; - - if (cpu_thread_in_core(nr) != 1) { - pr_err("%s: cpu %d: invalid hw thread %d\n", - __func__, nr, cpu_thread_in_core(nr)); - return -ENOENT; - } + int hw_cpu = get_hard_smp_processor_id(cpu); + struct epapr_spin_table __iomem *spin_table; - if (!cpu_online(primary)) { - pr_err("%s: cpu %d: primary %d not online\n", - __func__, nr, primary); - return -ENOENT; - } - - smp_call_function_single(primary, wake_hw_thread, &nr, 0); - return 0; - } -#endif - - np = of_get_cpu_node(nr, NULL); + np = of_get_cpu_node(cpu, NULL); cpu_rel_addr = of_get_property(np, "cpu-release-addr", NULL); - - if (cpu_rel_addr == NULL) { - printk(KERN_ERR "No cpu-release-addr for cpu %d\n", nr); + if (!cpu_rel_addr) { + pr_err("No cpu-release-addr for cpu %d\n", cpu); return -ENOENT; } @@ -232,28 +228,18 @@ static int smp_85xx_kick_cpu(int nr) spin_table = phys_to_virt(*cpu_rel_addr); local_irq_save(flags); -#ifdef CONFIG_PPC32 -#ifdef CONFIG_HOTPLUG_CPU - /* Corresponding to generic_set_cpu_dead() */ - generic_set_cpu_up(nr); + hard_irq_disable(); - if (system_state == SYSTEM_RUNNING) { - /* - * To keep it compatible with old boot program which uses - * cache-inhibit spin table, we need to flush the cache - * before accessing spin table to invalidate any staled data. - * We also need to flush the cache after writing to spin - * table to push data out. - */ - flush_spin_table(spin_table); - out_be32(&spin_table->addr_l, 0); - flush_spin_table(spin_table); + if (qoriq_pm_ops) + qoriq_pm_ops->cpu_up_prepare(cpu); + /* if cpu is not spinning, reset it */ + if (read_spin_table_addr_l(spin_table) != 1) { /* * We don't set the BPTR register here since it already points * to the boot page properly. */ - mpic_reset_core(nr); + mpic_reset_core(cpu); /* * wait until core is ready... @@ -263,40 +249,23 @@ static int smp_85xx_kick_cpu(int nr) if (!spin_event_timeout( read_spin_table_addr_l(spin_table) == 1, 10000, 100)) { - pr_err("%s: timeout waiting for core %d to reset\n", - __func__, hw_cpu); - ret = -ENOENT; - goto out; + pr_err("timeout waiting for cpu %d to reset\n", + hw_cpu); + ret = -EAGAIN; + goto err; } - - /* clear the acknowledge status */ - __secondary_hold_acknowledge = -1; } -#endif - flush_spin_table(spin_table); - out_be32(&spin_table->pir, hw_cpu); - out_be32(&spin_table->addr_l, __pa(__early_start)); - flush_spin_table(spin_table); - - /* Wait a bit for the CPU to ack. */ - if (!spin_event_timeout(__secondary_hold_acknowledge == hw_cpu, - 10000, 100)) { - pr_err("%s: timeout waiting for core %d to ack\n", - __func__, hw_cpu); - ret = -ENOENT; - goto out; - } -out: -#else - smp_generic_kick_cpu(nr); flush_spin_table(spin_table); out_be32(&spin_table->pir, hw_cpu); +#ifdef CONFIG_PPC64 out_be64((u64 *)(&spin_table->addr_h), __pa(ppc_function_entry(generic_secondary_smp_init))); - flush_spin_table(spin_table); +#else + out_be32(&spin_table->addr_l, __pa(__early_start)); #endif - + flush_spin_table(spin_table); +err: local_irq_restore(flags); if (ioremappable) @@ -305,6 +274,61 @@ out: return ret; } +static int smp_85xx_kick_cpu(int nr) +{ + int ret = 0; +#ifdef CONFIG_PPC64 + int primary = nr; + int primary_hw = get_hard_smp_processor_id(primary); +#endif + + WARN_ON(nr < 0 || nr >= num_possible_cpus()); + + pr_debug("kick CPU #%d\n", nr); + +#ifdef CONFIG_PPC64 + /* Threads don't use the spin table */ + if (cpu_thread_in_core(nr) != 0) { + int primary = cpu_first_thread_sibling(nr); + + if (WARN_ON_ONCE(!cpu_has_feature(CPU_FTR_SMT))) + return -ENOENT; + + if (cpu_thread_in_core(nr) != 1) { + pr_err("%s: cpu %d: invalid hw thread %d\n", + __func__, nr, cpu_thread_in_core(nr)); + return -ENOENT; + } + + if (!cpu_online(primary)) { + pr_err("%s: cpu %d: primary %d not online\n", + __func__, nr, primary); + return -ENOENT; + } + + smp_call_function_single(primary, wake_hw_thread, &nr, 0); + return 0; + } + + ret = smp_85xx_start_cpu(primary); + if (ret) + return ret; + + paca[nr].cpu_start = 1; + generic_set_cpu_up(nr); + + return ret; +#else + ret = smp_85xx_start_cpu(nr); + if (ret) + return ret; + + generic_set_cpu_up(nr); + + return ret; +#endif +} + struct smp_ops_t smp_85xx_ops = { .kick_cpu = smp_85xx_kick_cpu, .cpu_bootable = smp_generic_cpu_bootable, @@ -402,6 +426,10 @@ void __init mpc85xx_smp_init(void) } #ifdef CONFIG_HOTPLUG_CPU +#ifdef CONFIG_FSL_CORENET_RCPM + fsl_rcpm_init(); +#endif + #ifdef CONFIG_FSL_PMC mpc85xx_setup_pmc(); #endif @@ -409,6 +437,7 @@ void __init mpc85xx_smp_init(void) smp_85xx_ops.give_timebase = mpc85xx_give_timebase; smp_85xx_ops.take_timebase = mpc85xx_take_timebase; ppc_md.cpu_die = smp_85xx_mach_cpu_die; + smp_85xx_ops.cpu_die = qoriq_cpu_kill; } #endif smp_ops = &smp_85xx_ops; diff --git a/arch/powerpc/platforms/85xx/smp.h b/arch/powerpc/platforms/85xx/smp.h index 0b20ae3..8ee19a3 100644 --- a/arch/powerpc/platforms/85xx/smp.h +++ b/arch/powerpc/platforms/85xx/smp.h @@ -6,6 +6,7 @@ #ifdef CONFIG_SMP void __init mpc85xx_smp_init(void); int __init mpc85xx_setup_pmc(void); +int __init fsl_rcpm_init(void); #else static inline void mpc85xx_smp_init(void) { -- 1.9.1 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/