#include "types.h"
#include "irq_chip.h"
+#include "l4_types.h"
+#include <cxx/type_traits>
/**
- * Interface used to manage harware IRQs on a platform.
+ * Interface used to manage hardware IRQs on a platform.
*
* The main purpose of this interface is to allow an
* abstract mapping of global IRQ numbers to a chip
class Irq_mgr
{
public:
+ struct Msi_info
+ {
+ Unsigned64 addr;
+ Unsigned32 data;
+ };
+
/**
* Chip and pin for an IRQ pin.
*/
/** Get the message to use for a given MSI.
* \pre The IRQ pin needs to be already allocated before using this function.
*/
- virtual Mword msg(Mword irqnum) const { (void)irqnum; return 0; }
+ virtual int msg(Mword irqnum, Unsigned64, Msi_info *) const
+ { (void)irqnum; return -L4_err::EPerm; }
- virtual void set_cpu(Mword irqnum, unsigned cpu) const;
+ virtual void set_cpu(Mword irqnum, Cpu_number cpu) const;
/// The pointer to the single global instance of the actual IRQ manager.
static Irq_mgr *mgr;
public:
Irq_mgr_single_chip() {}
- template<typename A1>
- explicit Irq_mgr_single_chip(A1 const &a1) : c(a1) {}
-
- template<typename A1, typename A2>
- Irq_mgr_single_chip(A1 const &a1, A2 const &a2) : c(a1, a2) {}
-
+ template< typename... A >
+ explicit Irq_mgr_single_chip(A&&... args) : c(cxx::forward<A>(args)...) {}
Irq chip(Mword irqnum) const { return Irq(&c, irqnum); }
unsigned nr_irqs() const { return c.nr_irqs(); }
PUBLIC inline
bool
-Irq_mgr::alloc(Irq_base *irq, Mword pin)
+Irq_mgr::alloc(Irq_base *irq, Mword global_irq)
{
- Irq i = chip(pin);
+ Irq i = chip(global_irq);
if (!i.chip)
return false;
- return i.chip->alloc(irq, i.pin);
+ if (i.chip->alloc(irq, i.pin))
+ {
+ i.chip->set_cpu(i.pin, Cpu_number::boot_cpu());
+ return true;
+ }
+ return false;
}
PUBLIC inline
IMPLEMENT
void
-Irq_mgr::set_cpu(Mword irqnum, unsigned cpu) const
+Irq_mgr::set_cpu(Mword irqnum, Cpu_number cpu) const
{
- WARNX(Warning, "IRQ%ld: ignoring CPU setting (%d).\n", irqnum, cpu);
+ Irq i = chip(irqnum);
+ if (!i.chip)
+ return;
+
+ return i.chip->set_cpu(i.pin, cpu);
}