}
/**
+ * @brief Get the DSP DSPM size of the opened NPU device
+ * @param[in] dev the NPU device handle
+ * @param[out] dspm dspm size
+ * @return 0 if no error, otherwise a negative errno
+ * @note this does not support for emulated devices
+ */
+int
+HostHandler::getDspmSize (uint32_t *dspm)
+{
+ const DriverAPI * api = device_->getDriverAPI ();
+ assert (api != nullptr);
+
+ return api->getDspmSize (dspm);
+}
+/**
* @brief Set the data layout for input/output tensors
* @param[in] modelid The ID of model whose layouts are set
* @param[in] in the layout/type info for input tensors
}
void callback (output_buffers *output, uint64_t sequence) {
- if (output_ != nullptr) {
+ if (output_ != nullptr && output != nullptr) {
/** just copy internal variables of output buffers */
memcpy (output_, output, sizeof (output_buffers));
}
* @param[in] modelid The model to be inferred.
* @param[in] input The input data to be inferred.
* @param[out] output The output result.
- * @return @c 0 if no error. otherwise a negative error value
+ * @return @c positive id if no error. otherwise a negative error value
*/
int
HostHandler::runSync (uint32_t modelid, const input_buffers *input,
callbackSync sync (output);
int status = runAsync (modelid, input, callbackSync::callback,
static_cast <void*> (&sync), NPUASYNC_DROP_OLD, nullptr);
- if (status == 0) {
+ if (status > 0) {
/** sync needs to wait callback */
sync.wait ();
}
* @param[in] cb_data The data given as a parameter to the runNPU_async call.
* @param[in] mode Configures how this operation works.
* @param[out] sequence The sequence number returned with runNPU_async.
- * @return @c 0 if no error. otherwise a negative error value
+ * @return @c positive id if no error. otherwise a negative error value
*/
int
HostHandler::runAsync (uint32_t modelid, const input_buffers *input,
if (model->getMetadata()->getProgramSize() > 0) {
HWmem * hwmem_prog = new HWmem (new HWmemDevice);
hwmem_prog->setDriverAPI (api_.get());
+ hwmem_prog->setContiguous (true);
model->setProgramData (hwmem_prog);
config.dbuf_fd = hwmem_prog->getDmabuf ();
config.program_size = hwmem_prog->getSize ();
config.program_offset_addr = 0;
+ config.metadata_dbuf_fd = model->getDmabuf ();
/** for metadata extended section */
- config.metadata_dbuf_fd = model->getDmabuf ();
- config.metadata_extra_addr = NPUBIN_META_SIZE;
- config.metadata_extra_size = model->getMetadata()->getMetaExtendedSize ();
+ size_t extended_size = model->getMetadata()->getMetaExtendedSize();
+ if (extended_size > 0) {
+ HWmem * hwmem_extended = new HWmem (new HWmemDevice);
+ hwmem_extended->setDriverAPI (api_.get ());
+
+ model->setExtendedMetadata (hwmem_extended);
+
+ status = hwmem_extended->alloc (extended_size);
+ if (status != 0) {
+ logerr (TAG, "Failed to allocate extended metadata: %d\n", status);
+ goto delete_exit;
+ }
+
+ config.metadata_ext_dbuf_fd = hwmem_extended->getDmabuf ();
+ config.metadata_ext_size = extended_size;
+
+ status = comm_.extractGenericBuffer (model_buf, hwmem_extended->getData (),
+ nullptr, NPUBIN_META_SIZE, extended_size);
+ if (status != 0) {
+ logerr (TAG, "Failed to extract generic buffer: %d\n", status);
+ goto delete_exit;
+ }
+ } else {
+ config.metadata_ext_dbuf_fd = -1;
+ config.metadata_ext_size = 0;
+ }
status = api_->registerModel (&config, model->getMetadata()->getNPUVersion());
if (status != 0)
Request *req = new Request (opmode);
req->setModel (model);
- req->setSegmentTable (segt);
+ req->setInferData (segt);
req->setCallback (std::bind (&TrinityVision2::callback, this, req, cb, cb_data));
- if (sequence)
- *sequence = req->getID();
+ if (sequence && req->getID () > 0) {
+ *sequence = (uint32_t) req->getID ();
+ }
return scheduler_->submitRequest (req);
}
Request *req = new Request (opmode);
req->setModel (model);
- req->setSegmentTable (segt);
+ req->setInferData (segt);
req->setHwDevice (hw_dev);
return scheduler_->submitRequest (req);
return;
const Model *model = req->getModel ();
- SegmentTable *segt = req->getSegmentTable ();
+ SegmentTable *segt = dynamic_cast<SegmentTable *> (req->getInferData ());
+ /** internal logic error */
+ assert (segt != nullptr);
+
output_buffers output = {
.num_buffers = segt->getNumOutputSegments ()
};