ARC: [Review] Multi-platform image #8: platform registers SMP callbacks
Platforms export their SMP callbacks by populating arc_smp_ops. The population itself needs to be done pretty early, from init_early callback. Signed-off-by: Vineet Gupta <vgupta@synopsys.com> Cc: Arnd Bergmann <arnd@arndb.de>
This commit is contained in:
parent
10b1271875
commit
b830cde5a4
3 changed files with 28 additions and 18 deletions
|
@ -111,6 +111,7 @@ extern void idu_irq_set_tgtcpu(uint8_t irq, uint32_t mask);
|
||||||
extern void idu_irq_set_mode(uint8_t irq, uint8_t dest_mode, uint8_t trig_mode);
|
extern void idu_irq_set_mode(uint8_t irq, uint8_t dest_mode, uint8_t trig_mode);
|
||||||
|
|
||||||
extern void iss_model_init_smp(unsigned int cpu);
|
extern void iss_model_init_smp(unsigned int cpu);
|
||||||
|
extern void iss_model_init_early_smp(void);
|
||||||
|
|
||||||
#endif /* CONFIG_SMP */
|
#endif /* CONFIG_SMP */
|
||||||
|
|
||||||
|
|
|
@ -162,6 +162,10 @@ static void __init plat_fpga_early_init(void)
|
||||||
setup_bvci_lat_unit();
|
setup_bvci_lat_unit();
|
||||||
|
|
||||||
arc_fpga_serial_init();
|
arc_fpga_serial_init();
|
||||||
|
|
||||||
|
#ifdef CONFIG_SMP
|
||||||
|
iss_model_init_early_smp();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct of_dev_auxdata plat_auxdata_lookup[] __initdata = {
|
static struct of_dev_auxdata plat_auxdata_lookup[] __initdata = {
|
||||||
|
|
|
@ -24,25 +24,10 @@ static char smp_cpuinfo_buf[128];
|
||||||
*-------------------------------------------------------------------
|
*-------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const char *arc_platform_smp_cpuinfo(void)
|
|
||||||
{
|
|
||||||
#define IS_AVAIL1(var, str) ((var) ? str : "")
|
|
||||||
|
|
||||||
struct bcr_mp mp;
|
|
||||||
|
|
||||||
READ_BCR(ARC_REG_MP_BCR, mp);
|
|
||||||
|
|
||||||
sprintf(smp_cpuinfo_buf, "Extn [700-SMP]: v%d, arch(%d) %s %s %s\n",
|
|
||||||
mp.ver, mp.mp_arch, IS_AVAIL1(mp.scu, "SCU"),
|
|
||||||
IS_AVAIL1(mp.idu, "IDU"), IS_AVAIL1(mp.sdu, "SDU"));
|
|
||||||
|
|
||||||
return smp_cpuinfo_buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Master kick starting another CPU
|
* Master kick starting another CPU
|
||||||
*/
|
*/
|
||||||
void arc_platform_smp_wakeup_cpu(int cpu, unsigned long pc)
|
static void iss_model_smp_wakeup_cpu(int cpu, unsigned long pc)
|
||||||
{
|
{
|
||||||
/* setup the start PC */
|
/* setup the start PC */
|
||||||
write_aux_reg(ARC_AUX_XTL_REG_PARAM, pc);
|
write_aux_reg(ARC_AUX_XTL_REG_PARAM, pc);
|
||||||
|
@ -103,19 +88,39 @@ void iss_model_init_smp(unsigned int cpu)
|
||||||
smp_ipi_irq_setup(cpu, IDU_INTERRUPT_0 + cpu);
|
smp_ipi_irq_setup(cpu, IDU_INTERRUPT_0 + cpu);
|
||||||
}
|
}
|
||||||
|
|
||||||
void arc_platform_ipi_send(const struct cpumask *callmap)
|
static void iss_model_ipi_send(void *arg)
|
||||||
{
|
{
|
||||||
|
struct cpumask *callmap = arg;
|
||||||
unsigned int cpu;
|
unsigned int cpu;
|
||||||
|
|
||||||
for_each_cpu(cpu, callmap)
|
for_each_cpu(cpu, callmap)
|
||||||
idu_irq_assert(cpu);
|
idu_irq_assert(cpu);
|
||||||
}
|
}
|
||||||
|
|
||||||
void arc_platform_ipi_clear(int cpu, int irq)
|
static void iss_model_ipi_clear(int cpu, int irq)
|
||||||
{
|
{
|
||||||
idu_irq_clear(IDU_INTERRUPT_0 + cpu);
|
idu_irq_clear(IDU_INTERRUPT_0 + cpu);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void iss_model_init_early_smp(void)
|
||||||
|
{
|
||||||
|
#define IS_AVAIL1(var, str) ((var) ? str : "")
|
||||||
|
|
||||||
|
struct bcr_mp mp;
|
||||||
|
|
||||||
|
READ_BCR(ARC_REG_MP_BCR, mp);
|
||||||
|
|
||||||
|
sprintf(smp_cpuinfo_buf, "Extn [ISS-SMP]: v%d, arch(%d) %s %s %s\n",
|
||||||
|
mp.ver, mp.mp_arch, IS_AVAIL1(mp.scu, "SCU"),
|
||||||
|
IS_AVAIL1(mp.idu, "IDU"), IS_AVAIL1(mp.sdu, "SDU"));
|
||||||
|
|
||||||
|
plat_smp_ops.info = smp_cpuinfo_buf;
|
||||||
|
|
||||||
|
plat_smp_ops.cpu_kick = iss_model_smp_wakeup_cpu;
|
||||||
|
plat_smp_ops.ipi_send = iss_model_ipi_send;
|
||||||
|
plat_smp_ops.ipi_clear = iss_model_ipi_clear;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*-------------------------------------------------------------------
|
*-------------------------------------------------------------------
|
||||||
* Low level Platform IPI Providers
|
* Low level Platform IPI Providers
|
||||||
|
|
Loading…
Add table
Reference in a new issue