11
11
12
12
#pragma once
13
13
14
+ #include < cstddef>
14
15
#include < filesystem>
15
16
#include < fstream>
16
17
#include < iostream>
@@ -117,7 +118,7 @@ class HwAccessor : public Logger, private boost::noncopyable {
117
118
template <typename max_access_width_t >
118
119
class HwAccessorMmap : public HwAccessor {
119
120
public:
120
- HwAccessorMmap (std::string dev_path, UioRegion region, uintptr_t mmap_offs)
121
+ HwAccessorMmap (std::string dev_path, UioRegion region, uintptr_t mmap_offs, size_t access_offs )
121
122
: HwAccessor(), _region{region} {
122
123
BOOST_LOG_SEV (HwAccessor::_lg, bls::debug) << " dev name = " << dev_path;
123
124
@@ -128,28 +129,34 @@ class HwAccessorMmap : public HwAccessor {
128
129
BOOST_LOG_SEV (HwAccessor::_lg, bls::trace) << " fd = " << _fd << " , size = " << _region.size ;
129
130
130
131
// create memory mapping
131
- _mem = mmap (NULL , _region.size , PROT_READ | PROT_WRITE, MAP_SHARED, _fd, mmap_offs);
132
+ _mmap_mem = mmap (NULL , _region.size , PROT_READ | PROT_WRITE, MAP_SHARED, _fd, mmap_offs);
133
+ _access_mem = static_cast <void *>(static_cast <char *>(_mmap_mem) + access_offs);
134
+
132
135
BOOST_LOG_SEV (HwAccessor::_lg, bls::trace)
133
- << " mmap = 0x" << std::hex << mmap_offs << " -> 0x" << _mem << std::dec;
136
+ << " mmap = 0x" << std::hex << mmap_offs << " -> 0x" << _mmap_mem << std::dec;
134
137
135
- if (_mem == MAP_FAILED) {
136
- throw std::runtime_error (" mmap failed for uio " + dev_path);
138
+ if (_mmap_mem == MAP_FAILED) {
139
+ throw std::runtime_error (" mmap failed for uio " + dev_path + " : " + strerror (errno) );
137
140
}
141
+
142
+ BOOST_LOG_SEV (HwAccessor::_lg, bls::trace)
143
+ << " access offs = 0x" << std::hex << access_offs << " -> 0x" << _access_mem << std::dec;
138
144
}
139
145
140
146
virtual ~HwAccessorMmap () {
141
- munmap (_mem , _region.size );
147
+ munmap (_mmap_mem , _region.size );
142
148
::close (_fd);
143
149
}
144
150
145
151
protected:
146
152
int _fd;
147
- void * _mem;
153
+ void * _mmap_mem;
154
+ void * _access_mem;
148
155
const UioRegion _region;
149
156
150
157
template <typename access_width_t >
151
158
inline volatile access_width_t * _mem_ptr (uint32_t offs) const {
152
- return reinterpret_cast <access_width_t *>(static_cast <uint8_t *>(_mem ) +
159
+ return reinterpret_cast <access_width_t *>(static_cast <uint8_t *>(_access_mem ) +
153
160
static_cast <ptrdiff_t >(offs));
154
161
}
155
162
@@ -217,8 +224,12 @@ class HwAccessorMmap : public HwAccessor {
217
224
}
218
225
219
226
public:
220
- UioRegion get_phys_region () const final override { return _region; }
221
- void * get_virt_mem () const final override { return _mem; }
227
+ UioRegion get_phys_region () const final override {
228
+ const size_t access_offs =
229
+ static_cast <uint8_t *>(_access_mem) - static_cast <uint8_t *>(_mmap_mem);
230
+ return {_region.addr + access_offs, _region.size - access_offs};
231
+ }
232
+ void * get_virt_mem () const final override { return _access_mem; }
222
233
};
223
234
224
235
// Hardware accessor for XDMA. Can support either 32 or 64 bit access
@@ -227,13 +238,15 @@ class HwAccessorXdma : public HwAccessorMmap<max_access_width_t> {
227
238
int _fd_int;
228
239
229
240
public:
241
+ // TODO: if we ever have to deal w/ unaligned mappings over XDMA (like on UIO), we'll have to pass an access_offs to HwAccessorMmap
230
242
HwAccessorXdma (std::string xdma_path,
231
243
std::string evt_dev,
232
244
UioRegion region,
233
245
uintptr_t pcie_offs)
234
246
: HwAccessorMmap<max_access_width_t >(xdma_path + " /user" ,
235
247
{region.addr | pcie_offs, region.size },
236
- region.addr) {
248
+ region.addr,
249
+ 0 ) {
237
250
if (!evt_dev.empty ()) {
238
251
const auto evt_path = xdma_path + " /" + evt_dev;
239
252
_fd_int = ::open (evt_path.c_str (), O_RDWR);
@@ -259,7 +272,7 @@ class HwAccessorXdma : public HwAccessorMmap<max_access_width_t> {
259
272
// Hardware accessor for AXI. Always supports 64 bit access
260
273
class HwAccessorAxi : public HwAccessorMmap <uint64_t > {
261
274
public:
262
- HwAccessorAxi (std::string dev_path, UioRegion region, uintptr_t mmap_offs);
275
+ HwAccessorAxi (std::string dev_path, UioRegion region, uintptr_t mmap_offs, size_t access_offs );
263
276
virtual ~HwAccessorAxi ();
264
277
265
278
int get_fd_int () const final override { return _fd; }
0 commit comments