From: mark.rutland@arm.com (Mark Rutland)
To: linux-arm-kernel@lists.infradead.org
Subject: PSCI_CPU_ON flow
Date: Wed, 4 Nov 2015 17:10:49 +0000 [thread overview]
Message-ID: <20151104171048.GE23860@leverpostej> (raw)
In-Reply-To: <BY1PR0301MB1303B5D1A8CD0B7FA07AA40A822A0@BY1PR0301MB1303.namprd03.prod.outlook.com>
On Wed, Nov 04, 2015 at 04:18:40PM +0000, Sharma Bhupesh wrote:
> Hi,
Hi,
> I am trying to build and verify a custom ARM trusted firmware like implementation with
> the linux-next to verify if I can use the PSCI interface to get the CPU hotplug
> to work (CPU_OFF and CPU_ON sequence).
>
> My EL3 firmware implements the PSCI v0.2 specifications and I enable the same
> as the CPU enable_method in the DTS.
>
> Now, while I can get the secondary CPU to shutdown properly via the PSCI implementing
> firmware, I cannot seem to get them back-on:
>
> # echo 0 > /sys/devices/system/cpu/cpu2/online
> CPU2: shutdown
> psci: CPU2 killed.
>
> # echo 1 > /sys/devices/system/cpu/cpu2/online
> CPU2: failed to come online
>
> I notice that the call to PSCI CPU_ON from kernel returns successfully,
> so the EL3 FW returns PSCI_SUCCESS:
>
> static int cpu_psci_cpu_boot(unsigned int cpu)
> {
> int err = psci_ops.cpu_on(cpu_logical_map(cpu), __pa(secondary_entry));
> if (err)
> pr_err("failed to boot CPU%d (%d)\n", cpu, err);
>
> return err;
> }
>
> However, I cannot seem to get the secondaries to enter the 'secondary_entry'
> leg, i.e. I cannot see the normal 'CPU%u: Booted secondary processor' prints
> from here:
>
> /*
> * This is the secondary CPU boot entry. We're using this CPUs
> * idle thread stack, but a set of temporary page tables.
> */
> asmlinkage void secondary_start_kernel(void)
> {
> struct mm_struct *mm = &init_mm;
> unsigned int cpu = smp_processor_id();
>
> /*
> * All kernel threads share the same mm context; grab a
> * reference and switch to it.
> */
> atomic_inc(&mm->mm_count);
> current->active_mm = mm;
> cpumask_set_cpu(cpu, mm_cpumask(mm));
>
> set_my_cpu_offset(per_cpu_offset(smp_processor_id()));
> printk("CPU%u: Booted secondary processor\n", cpu);
I see this isn't the same as next-20151104, though the difference is a
trivial change to the logging. Which linux-next version are you using?
> So, I am wondering if my understanding is correct, as to whether the
> secondaries will start execution from __pa(secondary_entry), i.e.
> secondary_start_kernel
Yes, the CPU should start at __pa(secondary_entry) in head.S. From there
it will branch to secondary_startup:
ENTRY(secondary_entry)
bl el2_setup // Drop to EL1
bl set_cpu_boot_mode_flag
b secondary_startup
ENDPROC(secondary_entry)
> and I should see the above prints in the PSCI CPU_ON case as well,
Yes, the print should occur for any PSCI CPU_ON of any CPU.
> or is this path only taken in case of a cold boot.
The same path is taken regardless of cold/warm boot.
I don't see issues on Juno with next-20151104:
root at ribbensteg:/home/nanook# echo 0 > /sys/devices/system/cpu/cpu2/online
CPU2: shutdown
psci: CPU2 killed.
root at ribbensteg:/home/nanook# echo 1 > /sys/devices/system/cpu/cpu2/online
Detected PIPT I-cache on CPU2
CPU2: Booted secondary processor [410fd070]
Given that, and the successful cold boot, it looks like the issue is
with the FW rather than the kernel.
I guess that either the CPU is stuck in the FW, or that it left the FW
in a bad state, and things went wrong before it could execute
secondary_start_kernel.
The following patch may be able to tell you if the CPU is stuck in the
FW (the CPU will likely never leave state 2 / ON_PENDING in this case).
Thanks,
Mark.
---->8----
>From 0573953e0426b2990a71d9993b550d542bf36d87 Mon Sep 17 00:00:00 2001
From: Mark Rutland <mark.rutland@arm.com>
Date: Wed, 4 Nov 2015 17:01:45 +0000
Subject: [PATCH] arm64: psci: HACK: query AFFINTIY_INFO after CPU_ON
Buggy PSCI firmware can report a successful CPU_ON, yet the CPU may
never leave ON_PENDING. Query AFFINITY_INFO after a successful CPU_ON to
aid debugging such issues.
This is rather noisy, and is only useful as a debugging tool.
Signed-off-by: Mark Rutland <mark.rutland@arm.com>
---
arch/arm64/kernel/psci.c | 28 ++++++++++++++++++++++++++--
1 file changed, 26 insertions(+), 2 deletions(-)
diff --git a/arch/arm64/kernel/psci.c b/arch/arm64/kernel/psci.c
index f67f35b..8dd9e0a 100644
--- a/arch/arm64/kernel/psci.c
+++ b/arch/arm64/kernel/psci.c
@@ -111,13 +111,37 @@ static int __init cpu_psci_cpu_prepare(unsigned int cpu)
return 0;
}
+static int cpu_psci_check_online(int cpu)
+{
+ int err, i;
+
+ if (!psci_ops.affinity_info)
+ return 0;
+
+ for (i = 0; i < 10; i++) {
+ err = psci_ops.affinity_info(cpu_logical_map(cpu), 0);
+ if (err == PSCI_0_2_AFFINITY_LEVEL_ON) {
+ pr_info("CPU%d reported online\n", cpu);
+ return 0;
+ }
+ msleep(10);
+ pr_info("CPU%d reported in state %d", cpu, err);
+ }
+
+ pr_warn("CPU%d was not reported online in a timely fashion\n", cpu);
+
+ return -ETIMEDOUT;
+}
+
static int cpu_psci_cpu_boot(unsigned int cpu)
{
int err = psci_ops.cpu_on(cpu_logical_map(cpu), __pa(secondary_entry));
- if (err)
+ if (err) {
pr_err("failed to boot CPU%d (%d)\n", cpu, err);
+ return err;
+ }
- return err;
+ return cpu_psci_check_online(cpu);
}
#ifdef CONFIG_HOTPLUG_CPU
--
1.9.1
next prev parent reply other threads:[~2015-11-04 17:10 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-11-04 16:18 PSCI_CPU_ON flow Sharma Bhupesh
2015-11-04 17:10 ` Mark Rutland [this message]
2015-11-04 19:31 ` Russell King - ARM Linux
2015-11-05 10:08 ` Catalin Marinas
2015-11-05 11:10 ` Mark Rutland
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20151104171048.GE23860@leverpostej \
--to=mark.rutland@arm.com \
--cc=linux-arm-kernel@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox