This patch adds driver-assisted memcpy for workaround solution.
In the current FPGA env, memcpy() between FPGAs makes bit-flip
for a certain memory regions. This workaround codes can avoid
this issue by driver-assisted codes.
Signed-off-by: Dongju Chae <dongju.chae@samsung.com>
endif
endif
+if get_option('enable_fpga_workaround')
+ add_project_arguments('-DENABLE_FPGA_WORKAROUND', language: ['c', 'cpp'])
+endif
+
if sysroot.startswith('/')
sysroot_inc_cflags_template = '-I@0@/usr/include@1@'
sysroot_inc = sysroot_inc_cflags_template.format(sysroot, '')
option('enable_npu_emul', type : 'boolean', value : false)
option('enable_data_manip', type : 'boolean', value : false)
option('enable_buffering', type : 'boolean', value : false)
+option('enable_fpga_workaround', type : 'boolean', value : false)
option('kernel_hdr_dir', type : 'string', value : '')
/** user needs to free this */
output.bufs[idx].addr = calloc (1, output_tensor_size);
+#if defined(ENABLE_FPGA_WORKAROUND)
+ api_->fpga_memcpy (
+ segt->getOutputSegment(idx)->getDmabuf(),
+ segt->getOutputSegmentOffset(idx),
+ output.bufs[idx].addr,
+ output.bufs[idx].size);
+#else
auto func = std::bind (TrinityVision2::manipulateData, model, idx, false,
std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
int status = comm_.insertGenericBuffer (
if (status != 0) {
logerr (TAG, "Failed to return output buffer: %d\n", status);
}
+#endif
}
cb (&output, req->getID(), cb_data);
virtual int registerModel (model_config_t *model) const { return -EPERM; }
virtual int deregisterModel (unsigned long long id) const { return -EPERM; }
+#if defined(ENABLE_FPGA_WORKAROUND)
+ virtual int fpga_memcpy (int dmabuf, uint32_t offset,
+ void *addr, size_t size) const { return -EPERM; }
+#endif
+
protected:
int dev_id_; /**< device id. assume that 0 <= id < getNUmDevices() */
int dev_fd_; /**< devide fd. opened in constructor and closed in destructor */
int registerModel (model_config_t *model) const;
int deregisterModel (unsigned long long id) const;
+#if defined(ENABLE_FPGA_WORKAROUND)
+ int fpga_memcpy (int dmabuf, uint32_t offset,
+ void *addr, size_t size) const;
+#endif
+
private:
int getDrvVersion () const;
static const std::string dev_node_base;
return ver;
}
+
+#if defined(ENABLE_FPGA_WORKAROUND)
+int
+TrinityVision2API::fpga_memcpy (int dmabuf, uint32_t offset, void *addr, size_t size) const
+{
+ struct trinity_fpga_memcpy fpga;
+ int ret;
+
+ if (!this->initialized())
+ return -EPERM;
+
+ fpga.dbuf_fd = dmabuf;
+ fpga.dbuf_off = offset;
+ fpga.user_addr = addr;
+ fpga.user_size = size;
+
+ ret = ioctl (this->getDeviceFD (), TRINITY_IOCTL_FPGA_MEMCPY, &fpga);
+ if (ret != 0)
+ return -errno;
+
+ return 0;
+}
+#endif