12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- #include <linux/delay.h>
- #include <linux/threads.h>
- #include <asm/asm.h>
- #include <asm/asm-offsets.h>
- #include <asm/mipsregs.h>
- #include <asm/addrspace.h>
- #include <asm/string.h>
- #include <asm/netlogic/haldefs.h>
- #include <asm/netlogic/common.h>
- #include <asm/netlogic/mips-extns.h>
- #include <asm/netlogic/xlr/iomap.h>
- #include <asm/netlogic/xlr/pic.h>
- int xlr_wakeup_secondary_cpus(void)
- {
- struct nlm_soc_info *nodep;
- unsigned int i, j, boot_cpu;
- volatile u32 *cpu_ready = nlm_get_boot_data(BOOT_CPU_READY);
-
- nodep = nlm_get_node(0);
- boot_cpu = hard_smp_processor_id();
- nlm_set_nmi_handler(nlm_rmiboot_preboot);
- for (i = 0; i < NR_CPUS; i++) {
- if (i == boot_cpu || !cpumask_test_cpu(i, &nlm_cpumask))
- continue;
- nlm_pic_send_ipi(nodep->picbase, i, 1, 1);
- }
-
- nodep->coremask = 1;
- for (i = 1; i < nlm_cores_per_node(); i++) {
- for (j = 1000000; j > 0; j--) {
- if (cpu_ready[i * NLM_THREADS_PER_CORE])
- break;
- udelay(10);
- }
- if (j != 0)
- nodep->coremask |= (1u << i);
- else
- pr_err("Failed to wakeup core %d\n", i);
- }
- return 0;
- }
|