1// vi:set ft=cpp: -*- Mode: C++ -*-
2/* \file
3 * IO-MMU interface description.
4 */
5#pragma once
6
7#include <l4/sys/cxx/ipc_iface>
8
9namespace L4 {
10/**
11 * Interface for IO-MMUs used for DMA remapping.
12 *
13 * This interface allows to associate a DMA address space
14 * with a platform dependent set of devices.
15 */
16class Iommu :
17  public Kobject_x<Iommu, Proto_t<L4_PROTO_IOMMU>, Type_info::Demand_t<1> >
18{
19public:
20  /**
21   * Associate `dma_space` with the set of device(s) specified by `src_id`.
22   *
23   * \param src_id     Platform dependent source ID specifying the set of
24   *                   devices that shall use `dma_space` for DMA remapping.
25   * \param dma_space  The DMA space (L4::Task created with
26   *                   L4_PROTO_DMA_SPACE) providing the mappings that
27   *                   shall be used for the device(s).
28   */
29  L4_INLINE_RPC(
30      l4_msgtag_t, bind, (l4_uint64_t src_id, Ipc::Cap<Task> dma_space));
31
32  /**
33   * Remove the association of the given DMA address space from the
34   * device(s) specified by `src_id`.
35   *
36   * \param src_id     Platform dependent source ID specifying the set of
37   *                   devices that shall no longer use `dma_space` for
38   *                   DMA remapping.
39   * \param dma_space  The DMA space formerly associated with bind().
40   */
41  L4_INLINE_RPC(
42      l4_msgtag_t, unbind, (l4_uint64_t src_id, Ipc::Cap<Task> dma_space));
43
44  typedef Typeid::Rpcs_code<l4_umword_t>::F<bind_t, unbind_t> Rpcs;
45};
46
47}
48