/* XXX spear_pen_release is cargo culted code - DO NOT COPY XXX */ volatileint spear_pen_release = -1;
/* * XXX CARGO CULTED CODE - DO NOT COPY XXX * * Write spear_pen_release in a way that is guaranteed to be visible to * all observers, irrespective of whether they're taking part in coherency * or not. This is necessary for the hotplug code to work reliably.
*/ staticvoid spear_write_pen_release(int val)
{
spear_pen_release = val;
smp_wmb();
sync_cache_w(&spear_pen_release);
}
staticvoid spear13xx_secondary_init(unsignedint cpu)
{ /* * let the primary processor know we're out of the * pen, then head off into the C entry point
*/
spear_write_pen_release(-1);
/* * Synchronise with the boot thread.
*/
spin_lock(&boot_lock);
spin_unlock(&boot_lock);
}
/* * set synchronisation state between this boot processor * and the secondary one
*/
spin_lock(&boot_lock);
/* * The secondary processor is waiting to be released from * the holding pen - release it, then wait for it to flag * that it has been released by resetting spear_pen_release. * * Note that "spear_pen_release" is the hardware CPU ID, whereas * "cpu" is Linux's internal ID.
*/
spear_write_pen_release(cpu);
timeout = jiffies + (1 * HZ); while (time_before(jiffies, timeout)) {
smp_rmb(); if (spear_pen_release == -1) break;
udelay(10);
}
/* * now the secondary core is starting up let it run its * calibrations, then wait for it to finish
*/
spin_unlock(&boot_lock);
return spear_pen_release != -1 ? -ENOSYS : 0;
}
/* * Initialise the CPU possible map early - this describes the CPUs * which may be present or become present in the system.
*/ staticvoid __init spear13xx_smp_init_cpus(void)
{ unsignedint i, ncores = scu_get_core_count(scu_base);
if (ncores > nr_cpu_ids) {
pr_warn("SMP: %u cores greater than maximum (%u), clipping\n",
ncores, nr_cpu_ids);
ncores = nr_cpu_ids;
}
for (i = 0; i < ncores; i++)
set_cpu_possible(i, true);
}
/* * Write the address of secondary startup into the system-wide location * (presently it is in SRAM). The BootMonitor waits until it receives a * soft interrupt, and then the secondary CPU branches to this address.
*/
__raw_writel(__pa_symbol(spear13xx_secondary_startup), SYS_LOCATION);
}
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.