
Hello Li.Xiubo@freescale.com,
On Fri, 14 Nov 2014 09:06:13 +0000, Li.Xiubo@freescale.com Li.Xiubo@freescale.com wrote:
Hi Albert,
+#if defined(CONFIG_ARMV7_NONSEC) || defined(CONFIG_ARMV7_VIRT) +/* Setting the address at which secondary cores start from.*/ +void smp_set_core_boot_addr(unsigned long addr, int corenr) +{
- struct ccsr_gur __iomem *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR);
- /*
* After setting the secondary cores start address,
* just release them to boot.
*/
- out_be32(&gur->scratchrw[0], addr);
- out_be32(&gur->brrl, 0x2);
+}
This function does not exactly "[set] the address at which secondary cores start from"; it sets *a* secondary core's boot address, and then it *boots* it.
Okay, I will fix it later.
Why does this version of smp_set_core_boot_addr() need to boot the core in addition to setting the address, whereas the existing ones in virt_v7, vexpress_common and arndale don't boot the cores?
Yes, they don't doing the release operation.
For Low Power Management requirement, maybe only one core will be used, and then We also make sure that the secondary core must be in low power and deep sleep mode(using wfi). So I just release it here, to make sure that the wfi instruction will be executed as early as possible.
Right after smp_set_core_boot_addr() is called, kick_all_cpus() isgoing to be called. Wouldn't that boot your CPUs just as well?
Thanks,
BRs, Xiubo
Amicalement,