在飞腾cpu平台上,本地cpu端的核心发送函数smp_cross_call,即函数__ipi_send_mask。
static void smp_cross_call(const struct cpumask *target, unsigned int ipinr)
{
trace_ipi_raise(target, ipi_types[ipinr]);
__ipi_send_mask(ipi_desc[ipinr], target);
}
其中,cpumask *target是指定CPU集合的掩码,ipinr为IPI功能号。
在kernel/irq/ipi.c中实现了函数__ipi_send_mask,这个函数最终调用了中断控制器chip的函数ipi_send_mask实现对IPI中断目标cpu集合的设置。由于飞腾CPU采用了GIC系列中断控制器,因此有.ipi_send_mask = gic_ipi_send_mask。
static void gic_ipi_send_mask(struct irq_data *d, const struct cpumask *mask)
{
int cpu;
unsigned long flags, map = 0
gic_lock_irqsave(flags);
/*兼容GIC的CPU集合描述*/
for_each_cpu(cpu, mask)
map |= gic_cpu_map[cpu];
dmb(ishst);
/* 对GIC0控制器软中断GIC_DIST_SOFTINT的设置 */
writel_relaxed(map << 16 | d->hwirq,
gic_data_dist_base(&gic_data[0]) + GIC_DIST_SOFTINT);
gic_unlock_irqrestore(flags);
}