L4Re – L4 Runtime Environment
irq
Go to the documentation of this file.
1 // vi:set ft=cpp: -*- Mode: C++ -*-
6 /*
7  * (c) 2008-2009 Adam Lackorzynski <adam@os.inf.tu-dresden.de>,
8  * Alexander Warg <warg@os.inf.tu-dresden.de>
9  * economic rights: Technische Universität Dresden (Germany)
10  *
11  * This file is part of TUD:OS and distributed under the terms of the
12  * GNU General Public License 2.
13  * Please see the COPYING-GPL-2 file for details.
14  *
15  * As a special exception, you may use this file as part of a free software
16  * library without restriction. Specifically, if other files instantiate
17  * templates or use macros or inline functions from this file, or you compile
18  * this file and link it with other files to produce an executable, this
19  * file does not by itself cause the resulting executable to be covered by
20  * the GNU General Public License. This exception does not however
21  * invalidate any other reasons why the executable file might be covered by
22  * the GNU General Public License.
23  */
24 
25 #pragma once
26 
27 #include <l4/sys/icu.h>
28 #include <l4/sys/irq.h>
29 #include <l4/sys/capability>
30 #include <l4/sys/rcv_endpoint>
31 #include <l4/sys/cxx/ipc_iface>
32 #include <l4/sys/cxx/ipc_types>
33 
34 namespace L4 {
35 
43 class Irq_eoi : public Kobject_0t<Irq_eoi, L4::PROTO_EMPTY>
44 {
45 public:
65  l4_msgtag_t unmask(unsigned irqnum, l4_umword_t *label = 0,
66  l4_timeout_t to = L4_IPC_NEVER,
67  l4_utcb_t *utcb = l4_utcb()) noexcept
68  {
69  return l4_icu_control_u(cap(), irqnum, L4_ICU_CTL_UNMASK, label, to, utcb);
70  }
71 };
72 
78 struct Triggerable : Kobject_t<Triggerable, Irq_eoi, L4_PROTO_IRQ>
79 {
93  l4_msgtag_t trigger(l4_utcb_t *utcb = l4_utcb()) noexcept
94  { return l4_irq_trigger_u(cap(), utcb); }
95 };
96 
117 class Irq : public Kobject_2t<Irq, Triggerable, Rcv_endpoint, L4_PROTO_IRQ_SENDER>
118 {
119 public:
120  using Triggerable::unmask;
121 
129  l4_msgtag_t detach(l4_utcb_t *utcb = l4_utcb()) noexcept
130  { return l4_irq_detach_u(cap(), utcb); }
131 
132 
144  l4_msgtag_t receive(l4_timeout_t timeout = L4_IPC_NEVER,
145  l4_utcb_t *utcb = l4_utcb()) noexcept
146  { return l4_irq_receive_u(cap(), timeout, utcb); }
147 
157  l4_msgtag_t wait(l4_umword_t *label, l4_timeout_t timeout = L4_IPC_NEVER,
158  l4_utcb_t *utcb = l4_utcb()) noexcept
159  { return unmask(-1, label, timeout, utcb); }
160 
180  l4_msgtag_t unmask(l4_utcb_t *utcb = l4_utcb()) noexcept
181  { return unmask(-1, 0, L4_IPC_NEVER, utcb); }
182 };
183 
197 struct Irq_mux : Kobject_t<Irq_mux, Triggerable, L4_PROTO_IRQ_MUX>
198 {
213  l4_utcb_t *utcb = l4_utcb()) noexcept
214  { return l4_irq_mux_chain_u(cap(), slave.cap(), utcb); }
215 };
216 
217 
236 class Icu :
237  public Kobject_t<Icu, Irq_eoi, L4_PROTO_IRQ,
238  Type_info::Demand_t<1> >
239 {
240 public:
241  enum Mode
242  {
243  F_none = L4_IRQ_F_NONE,
244  F_level_high = L4_IRQ_F_LEVEL_HIGH,
245  F_level_low = L4_IRQ_F_LEVEL_LOW,
246  F_pos_edge = L4_IRQ_F_POS_EDGE,
247  F_neg_edge = L4_IRQ_F_NEG_EDGE,
248  F_both_edge = L4_IRQ_F_BOTH_EDGE,
249  F_mask = L4_IRQ_F_MASK,
250 
251  F_set_wakeup = L4_IRQ_F_SET_WAKEUP,
252  F_clear_wakeup = L4_IRQ_F_CLEAR_WAKEUP,
253  };
254 
255  enum Flags
256  {
257  F_msi = L4_ICU_FLAG_MSI
258  };
259 
263  class Info : public l4_icu_info_t
264  {
265  public:
267  bool supports_msi() const noexcept { return features & F_msi; }
268  };
269 
285  l4_msgtag_t bind(unsigned irqnum, L4::Cap<Triggerable> irq,
286  l4_utcb_t *utcb = l4_utcb()) noexcept
287  { return l4_icu_bind_u(cap(), irqnum, irq.cap(), utcb); }
288 
289  L4_RPC_NF_OP(
291  l4_msgtag_t, bind, (l4_umword_t irqnum, Ipc::Cap<Irq> irq)
292  );
293 
304  l4_utcb_t *utcb = l4_utcb()) noexcept
305  { return l4_icu_unbind_u(cap(), irqnum, irq.cap(), utcb); }
306 
307  L4_RPC_NF_OP(
310  );
311 
321  { return l4_icu_info_u(cap(), info, utcb); }
322 
323  struct _Info { l4_umword_t features, nr_irqs, nr_msis; };
325 
339  l4_msgtag_t, msi_info, (l4_umword_t irqnum, l4_uint64_t source,
341 
345  l4_msgtag_t control(unsigned irqnum, unsigned op, l4_umword_t *label,
346  l4_timeout_t to, l4_utcb_t *utcb = l4_utcb()) noexcept
347  { return l4_icu_control_u(cap(), irqnum, op, label, to, utcb); }
348 
363  l4_msgtag_t mask(unsigned irqnum,
364  l4_umword_t *label = 0,
365  l4_timeout_t to = L4_IPC_NEVER,
366  l4_utcb_t *utcb = l4_utcb()) noexcept
367  { return l4_icu_mask_u(cap(), irqnum, label, to, utcb); }
368 
369  L4_RPC_NF_OP(
371  l4_msgtag_t, mask, (l4_umword_t irqnum),
373  );
374 
375 
376  L4_RPC_NF_OP(
378  l4_msgtag_t, unmask, (l4_umword_t irqnum),
380  );
381 
391  l4_msgtag_t set_mode(unsigned irqnum, l4_umword_t mode,
392  l4_utcb_t *utcb = l4_utcb()) noexcept
393  { return l4_icu_set_mode_u(cap(), irqnum, mode, utcb); }
394 
395  L4_RPC_NF_OP(
398  );
399 
400  typedef L4::Typeid::Rpcs_sys<
401  bind_t, unbind_t, info_t, msi_info_t, unmask_t, mask_t, set_mode_t
402  > Rpcs;
403 };
404 
405 }
L4::Cap related definitions.
l4_cap_idx_t cap() const noexcept
Return capability selector.
Definition: capability.h:52
C++ interface for capabilities.
Definition: capability.h:219
This class encapsulates information about an ICU.
Definition: irq:264
bool supports_msi() const noexcept
True, if the ICU has support for MSIs.
Definition: irq:267
C++ Icu interface.
Definition: irq:239
l4_msgtag_t msi_info(l4_umword_t irqnum, l4_uint64_t source, l4_icu_msi_info_t *msi_info)
Get MSI info about IRQ.
l4_msgtag_t info(l4_icu_info_t *info, l4_utcb_t *utcb=l4_utcb()) noexcept
Get information about the capabilities of the ICU.
Definition: irq:320
l4_msgtag_t set_mode(unsigned irqnum, l4_umword_t mode, l4_utcb_t *utcb=l4_utcb()) noexcept
Set interrupt mode.
Definition: irq:391
l4_msgtag_t unbind(unsigned irqnum, L4::Cap< Triggerable > irq, l4_utcb_t *utcb=l4_utcb()) noexcept
Remove binding of an interrupt line from the interrupt controller object.
Definition: irq:303
l4_msgtag_t mask(unsigned irqnum, l4_umword_t *label=0, l4_timeout_t to=L4_IPC_NEVER, l4_utcb_t *utcb=l4_utcb()) noexcept
Mask an IRQ line.
Definition: irq:363
l4_msgtag_t bind(unsigned irqnum, L4::Cap< Triggerable > irq, l4_utcb_t *utcb=l4_utcb()) noexcept
Bind an interrupt line of an interrupt controller to an interrupt object.
Definition: irq:285
Capability type for RPC interfaces (see L4::Cap<T>).
Definition: ipc_types:542
Interface for sending an acknowledge message to an object.
Definition: irq:44
l4_msgtag_t unmask(unsigned irqnum, l4_umword_t *label=0, l4_timeout_t to=L4_IPC_NEVER, l4_utcb_t *utcb=l4_utcb()) noexcept
Acknowledge the given interrupt line.
Definition: irq:65
C++ Irq interface.
Definition: irq:118
l4_msgtag_t detach(l4_utcb_t *utcb=l4_utcb()) noexcept
Detach from this interrupt.
Definition: irq:129
l4_msgtag_t wait(l4_umword_t *label, l4_timeout_t timeout=L4_IPC_NEVER, l4_utcb_t *utcb=l4_utcb()) noexcept
Unmask IRQ and (open) wait for any message.
Definition: irq:157
l4_msgtag_t unmask(l4_utcb_t *utcb=l4_utcb()) noexcept
Unmask IRQ.
Definition: irq:180
l4_msgtag_t receive(l4_timeout_t timeout=L4_IPC_NEVER, l4_utcb_t *utcb=l4_utcb()) noexcept
Unmask and wait for this IRQ.
Definition: irq:144
Helper class to create an L4Re interface class that is derived from two base classes (see L4::Kobject...
Definition: __typeinfo.h:836
Helper class to create an L4Re interface class that is derived from a single base class.
Definition: __typeinfo.h:760
l4_cap_idx_t cap() const noexcept
Return capability selector.
Definition: kobject:79
unsigned long l4_umword_t
Unsigned machine word.
Definition: l4int.h:52
unsigned long long l4_uint64_t
Unsigned 64bit value.
Definition: l4int.h:42
l4_msgtag_t l4_icu_bind_u(l4_cap_idx_t icu, unsigned irqnum, l4_cap_idx_t irq, l4_utcb_t *utcb) L4_NOTHROW
Bind an interrupt line of an interrupt controller to an interrupt object.
Definition: icu.h:373
l4_msgtag_t l4_icu_info_u(l4_cap_idx_t icu, l4_icu_info_t *info, l4_utcb_t *utcb) L4_NOTHROW
Get information about the capabilities of the ICU.
Definition: icu.h:397
l4_msgtag_t l4_icu_set_mode_u(l4_cap_idx_t icu, unsigned irqnum, l4_umword_t mode, l4_utcb_t *utcb) L4_NOTHROW
Set interrupt mode.
Definition: icu.h:434
l4_msgtag_t l4_icu_mask_u(l4_cap_idx_t icu, unsigned irqnum, l4_umword_t *label, l4_timeout_t to, l4_utcb_t *utcb) L4_NOTHROW
Mask an IRQ line.
Definition: icu.h:460
l4_msgtag_t l4_icu_unbind_u(l4_cap_idx_t icu, unsigned irqnum, l4_cap_idx_t irq, l4_utcb_t *utcb) L4_NOTHROW
Remove binding of an interrupt line from the interrupt controller object.
Definition: icu.h:385
@ L4_ICU_FLAG_MSI
Flag to denote that the IRQ is actually an MSI.
Definition: icu.h:59
l4_msgtag_t l4_irq_mux_chain_u(l4_cap_idx_t irq, l4_cap_idx_t slave, l4_utcb_t *utcb) L4_NOTHROW
Attach an IRQ to this multiplexer.
Definition: irq.h:230
l4_msgtag_t l4_irq_trigger_u(l4_cap_idx_t irq, l4_utcb_t *utcb) L4_NOTHROW
Trigger.
Definition: irq.h:250
l4_msgtag_t l4_irq_receive_u(l4_cap_idx_t irq, l4_timeout_t timeout, l4_utcb_t *utcb) L4_NOTHROW
Unmask and wait for this IRQ.
Definition: irq.h:257
l4_msgtag_t l4_irq_detach_u(l4_cap_idx_t irq, l4_utcb_t *utcb) L4_NOTHROW
Detach from this interrupt.
Definition: irq.h:242
@ L4_IRQ_F_MASK
Mask.
Definition: icu.h:81
@ L4_IRQ_F_NEG_EDGE
Negative edge trigger.
Definition: icu.h:79
@ L4_IRQ_F_CLEAR_WAKEUP
Do not use irq as wakeup source.
Definition: icu.h:85
@ L4_IRQ_F_SET_WAKEUP
Wakeup source?
Definition: icu.h:84
@ L4_IRQ_F_LEVEL_HIGH
Level high trigger.
Definition: icu.h:76
@ L4_IRQ_F_BOTH_EDGE
Both edges trigger.
Definition: icu.h:80
@ L4_IRQ_F_POS_EDGE
Positive edge trigger.
Definition: icu.h:78
@ L4_IRQ_F_NONE
Flow types.
Definition: icu.h:70
@ L4_IRQ_F_LEVEL_LOW
Level low trigger.
Definition: icu.h:77
@ L4_ICU_OP_MASK
Mask opcode.
Definition: icu.h:135
@ L4_ICU_OP_SET_MODE
Set-mode opcode.
Definition: icu.h:142
@ L4_ICU_OP_UNMASK
Unmask opcode.
Definition: icu.h:128
@ L4_ICU_OP_INFO
Info opcode.
Definition: icu.h:114
@ L4_ICU_OP_MSI_INFO
Msi-info opcode.
Definition: icu.h:121
@ L4_ICU_OP_UNBIND
Unbind opcode.
Definition: icu.h:107
@ L4_ICU_OP_BIND
Bind opcode.
Definition: icu.h:100
struct l4_utcb_t l4_utcb_t
Opaque type for the UTCB.
Definition: utcb.h:67
l4_utcb_t * l4_utcb(void) L4_NOTHROW L4_PURE
Get the UTCB address.
Definition: utcb.h:340
Interrupt controller.
Interface Definition Language.
#define L4_RPC_NF_OP(op, res, name, args...)
Define an RPC call type with specific opcode (the type only, no callable).
Definition: ipc_iface:512
#define L4_INLINE_RPC_OP(op, res, name, args, attr...)
Define an inline RPC call with specific opcode (type and callable).
Definition: ipc_iface:484
C Irq interface.
L4 low-level kernel interface.
The C++ Receive endpoint interface.
RPC attribute for a send-only RPC.
Definition: ipc_iface:275
IRQ multiplexer for shared IRQs.
Definition: irq:198
l4_msgtag_t chain(Cap< Triggerable > const &slave, l4_utcb_t *utcb=l4_utcb()) noexcept
Attach an IRQ to this multiplexer.
Definition: irq:212
Interface that allows an object to be triggered by some source.
Definition: irq:79
l4_msgtag_t trigger(l4_utcb_t *utcb=l4_utcb()) noexcept
Trigger.
Definition: irq:93
List of RPCs typically used for kernel interfaces.
Definition: __typeinfo.h:475
Info structure for an ICU.
Definition: icu.h:160
unsigned features
Feature flags.
Definition: icu.h:166
Info to use for a specific MSI.
Definition: icu.h:181
Message tag data structure.
Definition: types.h:160
Timeout pair.
Definition: __timeout.h:59