2 * (c) 2014 Alexander Warg <alexander.warg@kernkonzept.com>
4 * This file is part of TUD:OS and distributed under the terms of the
5 * GNU General Public License 2.
6 * Please see the COPYING-GPL-2 file for details.
11 #include <l4/sys/types.h>
12 #include <l4/re/dma_space>
13 #include <l4/sys/cxx/ipc_epiface>
14 #include <l4/cxx/hlist>
15 #include <l4/cxx/avl_tree>
16 #include <l4/cxx/ref_ptr>
19 #include "server_obj.h"
30 class Mapper : public cxx::Ref_obj
33 Mapper(Mapper const &) = delete;
36 typedef L4Re::Dma_space::Attributes Attributes;
37 typedef L4Re::Dma_space::Direction Direction;
38 typedef L4Re::Dma_space::Dma_addr Dma_addr;
40 virtual Mapping *map(Dataspace *ds, Q_alloc *,
41 l4_addr_t offset, l4_size_t *size,
42 Attributes attrs, Direction dir,
43 Dma_addr *dma_addr) = 0;
45 virtual int unmap(Dma_addr dma_addr, l4_size_t size,
46 Attributes attrs, Direction dir) = 0;
48 virtual void remove(Mapping *m) = 0;
50 virtual ~Mapper() = default;
57 bool operator < (Region const &r) const
58 { return end < r.start; }
61 Region(l4_addr_t s) : start(s), end(s) {}
62 Region(l4_addr_t s, l4_addr_t e) : start(s), end(e) {}
65 struct Mapping : cxx::H_list_item_t<Mapping>, cxx::Avl_tree_node
67 typedef Region Key_type;
68 typedef cxx::Avl_tree<Mapping, Mapping, cxx::Lt_functor<Region>> Map;
69 typedef cxx::H_list_t<Dma::Mapping> List;
70 typedef L4Re::Dma_space::Direction Direction;
71 typedef L4Re::Dma_space::Attributes Attributes;
75 Attributes attrs = Attributes::None;
76 Direction dir = Direction::None;
78 static Key_type key_of(Mapping const *m) { return m->key; }
80 Mapping(Mapping const &) = delete;
89 printf("DMA: del mapping: map=%p %lx %lx\n", mapper, key.start, key.end);
96 public L4::Epiface_t<Dma_space, L4Re::Dma_space, Server_object>,
100 typedef L4Re::Dma_space::Dma_addr Dma_addr;
101 typedef L4Re::Dma_space::Direction Direction;
102 typedef L4Re::Dma_space::Attributes Attributes;
103 typedef L4Re::Dma_space::Space_attribs Space_attribs;
105 long op_map(L4Re::Dma_space::Rights rights,
106 L4::Ipc::Snd_fpage src_ds, l4_addr_t offset,
107 l4_size_t &size, Attributes attrs, Direction dir,
110 long op_unmap(L4Re::Dma_space::Rights rights,
112 l4_size_t size, Attributes attrs, Direction dir);
114 long op_associate(L4Re::Dma_space::Rights rights,
115 L4::Ipc::Snd_fpage dma_task,
118 long op_disassociate(L4Re::Dma_space::Rights rights);
120 void delete_all_mappings();
122 ~Dma_space() { delete_all_mappings(); }
125 Space_attribs _attr = Space_attribs::None;
126 cxx::Ref_ptr<Dma::Mapper> _mapper;
127 Dma::Mapping::List _mappings;