static int __init smp_spin_table_cpu_up(int cpu) { paddr_t __iomem *release; if (!cpu_release_addr[cpu]) { printk("CPU%d: No release addr\n", cpu); return -ENODEV; } release = ioremap_nocache(cpu_release_addr[cpu], 8); if ( !release ) { dprintk(XENLOG_ERR, "CPU%d: Unable to map release address\n", cpu); return -EFAULT; } writeq(__pa(init_secondary), release); iounmap(release); sev(); return cpu_up_send_sgi(cpu); }
static int exynos5_cpu_up(int cpu) { u64 power_base_addr; u64 size; void __iomem *power; int rc; rc = exynos5_get_pmu_baseandsize(&power_base_addr, &size); if ( rc ) return rc; power = ioremap_nocache(power_base_addr, size); if ( !power ) { dprintk(XENLOG_ERR, "Unable to map power MMIO\n"); return -EFAULT; } rc = exynos5_cpu_power_up(power, cpu); if ( rc ) { iounmap(power); return -ETIMEDOUT; } iounmap(power); if ( secure_firmware ) call_smc(SMC_CMD_CPU1BOOT, cpu, 0, 0); return cpu_up_send_sgi(cpu); }