np = of_find_compatible_node(NULL, NULL, "ste,dbx500-backupram"); if (!np) {
pr_err("No backupram base address\n"); return;
}
backupram = of_iomap(np, 0);
of_node_put(np); if (!backupram) {
pr_err("No backupram remap\n"); return;
}
np = of_find_compatible_node(NULL, NULL, "arm,cortex-a9-scu"); if (!np) {
pr_err("No SCU base address\n"); return;
}
scu_base = of_iomap(np, 0);
of_node_put(np); if (!scu_base) {
pr_err("No SCU remap\n"); return;
}
scu_enable(scu_base);
ncores = scu_get_core_count(scu_base); for (i = 0; i < ncores; i++)
set_cpu_possible(i, true);
iounmap(scu_base);
}
staticint ux500_boot_secondary(unsignedint cpu, struct task_struct *idle)
{ /* * write the address of secondary startup into the backup ram register * at offset 0x1FF4, then write the magic number 0xA1FEED01 to the * backup ram register at offset 0x1FF0, which is what boot rom code * is waiting for. This will wake up the secondary core from WFE.
*/
writel(__pa_symbol(secondary_startup),
backupram + UX500_CPU1_JUMPADDR_OFFSET);
writel(0xA1FEED01,
backupram + UX500_CPU1_WAKEMAGIC_OFFSET);
/* make sure write buffer is drained */
mb();
arch_send_wakeup_ipi_mask(cpumask_of(cpu)); return 0;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.