28 using Device_type = DEV;
33 : _device(dev), _paddr(0), _dir(dir), _num_sectors(num_sectors)
35 auto lcap =
L4Re::chkcap(L4Re::Util::make_unique_cap<L4Re::Dataspace>(),
36 "Allocate dataspace capability for IO memory.");
39 long sz = num_sectors * _device->sector_size();
43 "Allocate pinned memory.");
52 cxx::make_unique<Block_device::Mem_region>(0, sz, 0, cxx::move(lcap));
53 L4Re::chksys(_device->dma_map(_mem_region.get(), 0, _num_sectors, dir,
55 "Lock memory region for DMA.");
65 _device = rhs._device;
66 _mem_region = cxx::move(rhs._mem_region);
67 _region = cxx::move(rhs._region);
70 _num_sectors = rhs._num_sectors;
86 L4Re::chksys(_device->dma_unmap(_paddr, _num_sectors, _dir));
94 blk.dma_addr = _paddr;
95 blk.virt_addr = _region.
get();
96 blk.num_sectors = _num_sectors;
103 T *get(
unsigned offset)
const
104 {
return reinterpret_cast<T *
>(_region.
get() + offset); }
107 Device_type *_device;
108 cxx::unique_ptr<Block_device::Mem_region> _mem_region;