mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-11-25 13:20:52 +07:00
ARC: smp: Introduce smp hook @init_irq_cpu called for all cores
Note this is not part of platform owned static machine_desc, but more of device owned plat_smp_ops (rather misnamed) which a IPI provider or some such typically defines. This will help us seperate out the IPI registration from platform specific init_cpu_smp() into device specific init_irq_cpu() Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
This commit is contained in:
parent
8721a7f5a6
commit
286130ebf1
@ -48,6 +48,8 @@ extern int smp_ipi_irq_setup(int cpu, int irq);
|
|||||||
* @init_early_smp: A SMP specific h/w block can init itself
|
* @init_early_smp: A SMP specific h/w block can init itself
|
||||||
* Could be common across platforms so not covered by
|
* Could be common across platforms so not covered by
|
||||||
* mach_desc->init_early()
|
* mach_desc->init_early()
|
||||||
|
* @init_irq_cpu: Called for each core so SMP h/w block driver can do
|
||||||
|
* any needed setup per cpu (e.g. IPI request)
|
||||||
* @cpu_kick: For Master to kickstart a cpu (optionally at a PC)
|
* @cpu_kick: For Master to kickstart a cpu (optionally at a PC)
|
||||||
* @ipi_send: To send IPI to a @cpu
|
* @ipi_send: To send IPI to a @cpu
|
||||||
* @ips_clear: To clear IPI received at @irq
|
* @ips_clear: To clear IPI received at @irq
|
||||||
@ -55,6 +57,7 @@ extern int smp_ipi_irq_setup(int cpu, int irq);
|
|||||||
struct plat_smp_ops {
|
struct plat_smp_ops {
|
||||||
const char *info;
|
const char *info;
|
||||||
void (*init_early_smp)(void);
|
void (*init_early_smp)(void);
|
||||||
|
void (*init_irq_cpu)(int cpu);
|
||||||
void (*cpu_kick)(int cpu, unsigned long pc);
|
void (*cpu_kick)(int cpu, unsigned long pc);
|
||||||
void (*ipi_send)(int cpu);
|
void (*ipi_send)(int cpu);
|
||||||
void (*ipi_clear)(int irq);
|
void (*ipi_clear)(int irq);
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/irqchip.h>
|
#include <linux/irqchip.h>
|
||||||
#include <asm/mach_desc.h>
|
#include <asm/mach_desc.h>
|
||||||
|
#include <asm/smp.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Late Interrupt system init called from start_kernel for Boot CPU only
|
* Late Interrupt system init called from start_kernel for Boot CPU only
|
||||||
@ -27,7 +28,10 @@ void __init init_IRQ(void)
|
|||||||
irqchip_init();
|
irqchip_init();
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
/* Master CPU can initialize it's side of IPI */
|
/* a SMP H/w block could do IPI IRQ request here */
|
||||||
|
if (plat_smp_ops.init_irq_cpu)
|
||||||
|
plat_smp_ops.init_irq_cpu(smp_processor_id());
|
||||||
|
|
||||||
if (machine_desc->init_cpu_smp)
|
if (machine_desc->init_cpu_smp)
|
||||||
machine_desc->init_cpu_smp(smp_processor_id());
|
machine_desc->init_cpu_smp(smp_processor_id());
|
||||||
#endif
|
#endif
|
||||||
|
@ -131,6 +131,10 @@ void start_kernel_secondary(void)
|
|||||||
|
|
||||||
pr_info("## CPU%u LIVE ##: Executing Code...\n", cpu);
|
pr_info("## CPU%u LIVE ##: Executing Code...\n", cpu);
|
||||||
|
|
||||||
|
/* Some SMP H/w setup - for each cpu */
|
||||||
|
if (plat_smp_ops.init_irq_cpu)
|
||||||
|
plat_smp_ops.init_irq_cpu(cpu);
|
||||||
|
|
||||||
if (machine_desc->init_cpu_smp)
|
if (machine_desc->init_cpu_smp)
|
||||||
machine_desc->init_cpu_smp(cpu);
|
machine_desc->init_cpu_smp(cpu);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user