Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d595d423 authored by Paul Burton's avatar Paul Burton Committed by Ralf Baechle
Browse files

MIPS: SMP: Allow boot_secondary SMP op to return errors



Allow the boot_secondary SMP op to return an error to __cpu_up(), which
will in turn return it to its caller.

This will allow SMP implementations to return errors quickly in cases
they they know have failed, rather than relying upon __cpu_up()
eventually timing out waiting for the cpu_running completion.

Signed-off-by: default avatarPaul Burton <paul.burton@imgtec.com>
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/17014/


Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
parent 68923cdc
Loading
Loading
Loading
Loading
+6 −2
Original line number Original line Diff line number Diff line
@@ -205,7 +205,7 @@ int plat_post_relocation(long offset)
 * Firmware CPU startup hook
 * Firmware CPU startup hook
 *
 *
 */
 */
static void octeon_boot_secondary(int cpu, struct task_struct *idle)
static int octeon_boot_secondary(int cpu, struct task_struct *idle)
{
{
	int count;
	int count;


@@ -223,8 +223,12 @@ static void octeon_boot_secondary(int cpu, struct task_struct *idle)
		udelay(1);
		udelay(1);
		count--;
		count--;
	}
	}
	if (count == 0)
	if (count == 0) {
		pr_err("Secondary boot timeout\n");
		pr_err("Secondary boot timeout\n");
		return -ETIMEDOUT;
	}

	return 0;
}
}


/**
/**
+1 −1
Original line number Original line Diff line number Diff line
@@ -26,7 +26,7 @@ struct plat_smp_ops {
	void (*send_ipi_mask)(const struct cpumask *mask, unsigned int action);
	void (*send_ipi_mask)(const struct cpumask *mask, unsigned int action);
	void (*init_secondary)(void);
	void (*init_secondary)(void);
	void (*smp_finish)(void);
	void (*smp_finish)(void);
	void (*boot_secondary)(int cpu, struct task_struct *idle);
	int (*boot_secondary)(int cpu, struct task_struct *idle);
	void (*smp_setup)(void);
	void (*smp_setup)(void);
	void (*prepare_cpus)(unsigned int max_cpus);
	void (*prepare_cpus)(unsigned int max_cpus);
#ifdef CONFIG_HOTPLUG_CPU
#ifdef CONFIG_HOTPLUG_CPU
+3 −1
Original line number Original line Diff line number Diff line
@@ -179,7 +179,7 @@ static void bmips_prepare_cpus(unsigned int max_cpus)
/*
/*
 * Tell the hardware to boot CPUx - runs on CPU0
 * Tell the hardware to boot CPUx - runs on CPU0
 */
 */
static void bmips_boot_secondary(int cpu, struct task_struct *idle)
static int bmips_boot_secondary(int cpu, struct task_struct *idle)
{
{
	bmips_smp_boot_sp = __KSTK_TOS(idle);
	bmips_smp_boot_sp = __KSTK_TOS(idle);
	bmips_smp_boot_gp = (unsigned long)task_thread_info(idle);
	bmips_smp_boot_gp = (unsigned long)task_thread_info(idle);
@@ -231,6 +231,8 @@ static void bmips_boot_secondary(int cpu, struct task_struct *idle)
		}
		}
		cpumask_set_cpu(cpu, &bmips_booted_mask);
		cpumask_set_cpu(cpu, &bmips_booted_mask);
	}
	}

	return 0;
}
}


/*
/*
+2 −1
Original line number Original line Diff line number Diff line
@@ -78,7 +78,7 @@ static void cmp_smp_finish(void)
 * __KSTK_TOS(idle) is apparently the stack pointer
 * __KSTK_TOS(idle) is apparently the stack pointer
 * (unsigned long)idle->thread_info the gp
 * (unsigned long)idle->thread_info the gp
 */
 */
static void cmp_boot_secondary(int cpu, struct task_struct *idle)
static int cmp_boot_secondary(int cpu, struct task_struct *idle)
{
{
	struct thread_info *gp = task_thread_info(idle);
	struct thread_info *gp = task_thread_info(idle);
	unsigned long sp = __KSTK_TOS(idle);
	unsigned long sp = __KSTK_TOS(idle);
@@ -95,6 +95,7 @@ static void cmp_boot_secondary(int cpu, struct task_struct *idle)
#endif
#endif


	amon_cpu_start(cpu, pc, sp, (unsigned long)gp, a0);
	amon_cpu_start(cpu, pc, sp, (unsigned long)gp, a0);
	return 0;
}
}


/*
/*
+2 −1
Original line number Original line Diff line number Diff line
@@ -288,7 +288,7 @@ static void remote_vpe_boot(void *dummy)
	mips_cps_boot_vpes(core_cfg, cpu_vpe_id(&current_cpu_data));
	mips_cps_boot_vpes(core_cfg, cpu_vpe_id(&current_cpu_data));
}
}


static void cps_boot_secondary(int cpu, struct task_struct *idle)
static int cps_boot_secondary(int cpu, struct task_struct *idle)
{
{
	unsigned core = cpu_core(&cpu_data[cpu]);
	unsigned core = cpu_core(&cpu_data[cpu]);
	unsigned vpe_id = cpu_vpe_id(&cpu_data[cpu]);
	unsigned vpe_id = cpu_vpe_id(&cpu_data[cpu]);
@@ -346,6 +346,7 @@ static void cps_boot_secondary(int cpu, struct task_struct *idle)
	mips_cps_boot_vpes(core_cfg, vpe_id);
	mips_cps_boot_vpes(core_cfg, vpe_id);
out:
out:
	preempt_enable();
	preempt_enable();
	return 0;
}
}


static void cps_init_secondary(void)
static void cps_init_secondary(void)
Loading