#ifndef __IPI_H
#define __IPI_H
#include <config.h>
#include <types.h>
#include <plat/machine.h>
#include <arch/smp/ipi.h>
#if CONFIG_MAX_NUM_NODES > 1
#define MAX_IPI_ARGS 3
void Arch_handleIPI(irq_t irq, bool_t irqPath);
void doRemoteMaskOp(IpiRemoteCall_t func, word_t data1, word_t data2, word_t data3, word_t mask);
static void inline doRemoteOp(IpiRemoteCall_t func, word_t data1, word_t data2, word_t data3, word_t cpu)
{
doRemoteMaskOp(func, data1, data2, data3, BIT(cpu));
}
static void inline doRemoteMaskOp0Arg(IpiRemoteCall_t func, word_t mask)
{
doRemoteMaskOp(func, 0, 0, 0, mask);
}
static void inline
doRemoteMaskOp1Arg(IpiRemoteCall_t func, word_t data1, word_t mask)
{
doRemoteMaskOp(func, data1, 0, 0, mask);
}
static void inline
doRemoteMaskOp2Arg(IpiRemoteCall_t func, word_t data1, word_t data2, word_t mask)
{
doRemoteMaskOp(func, data1, data2, 0, mask);
}
static void inline
doRemoteMaskOp3Arg(IpiRemoteCall_t func, word_t data1, word_t data2, word_t data3, word_t mask)
{
doRemoteMaskOp(func, data1, data2, data3, mask);
}
static void inline doRemoteOp0Arg(IpiRemoteCall_t func, word_t cpu)
{
doRemoteOp(func, 0, 0, 0, cpu);
}
static void inline
doRemoteOp1Arg(IpiRemoteCall_t func, word_t data1, word_t cpu)
{
doRemoteOp(func, data1, 0, 0, cpu);
}
static void inline
doRemoteOp2Arg(IpiRemoteCall_t func, word_t data1, word_t data2, word_t cpu)
{
doRemoteOp(func, data1, data2, 0, cpu);
}
void doMaskReschedule(word_t mask);
static void inline doReschedule(word_t cpu)
{
if (cpu != getCurrentCPUIndex()) {
assert(cpu < CONFIG_MAX_NUM_NODES);
doMaskReschedule(BIT(cpu));
}
}
#endif
#endif