]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/l4re-core/moe/server/src/dma_space.h
Update
[l4.git] / l4 / pkg / l4re-core / moe / server / src / dma_space.h
1 /*
2  * (c) 2014 Alexander Warg <alexander.warg@kernkonzept.com>
3  *
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.
7  */
8 #pragma once
9
10 #include <cstddef>
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>
17
18 #include "quota.h"
19 #include "server_obj.h"
20 #include "globals.h"
21
22 namespace Moe {
23
24 class Dma_space;
25
26 namespace Dma {
27
28 struct Mapping;
29
30 class Mapper : public cxx::Ref_obj
31 {
32 public:
33   Mapper(Mapper const &) = delete;
34   Mapper() = default;
35
36   typedef L4Re::Dma_space::Attributes Attributes;
37   typedef L4Re::Dma_space::Direction Direction;
38   typedef L4Re::Dma_space::Dma_addr Dma_addr;
39
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;
44
45   virtual int unmap(Dma_addr dma_addr, l4_size_t size,
46                     Attributes attrs, Direction dir) = 0;
47
48   virtual void remove(Mapping *m) = 0;
49
50   virtual ~Mapper() = default;
51 };
52
53 struct Region
54 {
55   l4_addr_t start;
56   l4_addr_t end;
57   bool operator < (Region const &r) const
58   { return end < r.start; }
59
60   Region() = default;
61   Region(l4_addr_t s) : start(s), end(s) {}
62   Region(l4_addr_t s, l4_addr_t e) : start(s), end(e) {}
63 };
64
65 struct Mapping : cxx::H_list_item_t<Mapping>, cxx::Avl_tree_node
66 {
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;
72
73   Region key;
74   Mapper *mapper = 0;
75   Attributes attrs = Attributes::None;
76   Direction dir = Direction::None;
77
78   static Key_type key_of(Mapping const *m) { return m->key; }
79
80   Mapping(Mapping const &) = delete;
81   Mapping() = default;
82
83   ~Mapping()
84   {
85     if (mapper)
86       mapper->remove(this);
87
88     if (0)
89       printf("DMA: del mapping: map=%p %lx %lx\n", mapper, key.start, key.end);
90   }
91 };
92
93 }
94
95 class Dma_space :
96   public L4::Epiface_t<Dma_space, L4Re::Dma_space, Server_object>,
97   public Q_object
98 {
99 public:
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;
104
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,
108               Dma_addr &dma_addr);
109
110   long op_unmap(L4Re::Dma_space::Rights rights,
111                 Dma_addr dma_addr,
112                 l4_size_t size, Attributes attrs, Direction dir);
113
114   long op_associate(L4Re::Dma_space::Rights rights,
115                     L4::Ipc::Snd_fpage dma_task,
116                     Space_attribs attr);
117
118   long op_disassociate(L4Re::Dma_space::Rights rights);
119
120   void delete_all_mappings();
121
122   ~Dma_space() { delete_all_mappings(); }
123
124 private:
125   Space_attribs _attr = Space_attribs::None;
126   cxx::Ref_ptr<Dma::Mapper> _mapper;
127   Dma::Mapping::List _mappings;
128 };
129
130 }