This patch adds libnpuhost APIs to get driver API levle.
Signed-off-by: Dongju Chae <dongju.chae@samsung.com>
typedef void *npudev_h;
/**
+ * @brief Get npu-engine libraray version
+ * @param[out] major major version
+ * @param[out] minor minor version
+ * @param[out] extra extra version
+ */
+void getVersion (uint32_t *major, uint32_t *minor, uint32_t *extra);
+
+/**
* @brief Returns the number of available NPU devices.
* @return @c The number of available NPU devices.
* @note this number indicates the range of device IDs in getNPUdeviceByType ().
void putNPUdevice (npudev_h dev);
/**
+ * @brief Get the driver API level that npu-engine library assumes
+ * @param[out] level driver API level
+ * @note when this API level is lower than actual driver's one,
+ * some operations might be not working.
+ */
+void getDriverAPILevel (uint32_t *level);
+
+/**
+ * @brief Get the driver API level of opened NPU device
+ * @param[in] dev the NPU device handle
+ * @param[out] level driver API level
+ * @return 0 if no error, otherwise a negative errno
+ */
+int getNPU_driverAPILevel (npudev_h dev, uint32_t *level);
+
+/**
* @brief Get metadata for NPU model
* @param[in] model The path of model binary file
* @param[in] need_extra whether you want to extract the extra data in metadata
/** implement libnpuhost APIs */
/**
+ * @brief Get npu-engine libraray version
+ * @param[out] major major version
+ * @param[out] minor minor version
+ * @param[out] extra extra version
+ */
+void getVersion (uint32_t *major, uint32_t *minor, uint32_t *extra)
+{
+ if (major != nullptr)
+ *major = VER_NE_MAJOR;
+ if (minor != nullptr)
+ *minor = VER_NE_MINOR;
+ if (extra != nullptr)
+ *extra = VER_NE_EXTRA;
+}
+
+/**
* @brief Returns the number of available NPU devices.
* @return @c The number of NPU devices.
* @retval 0 if no NPU devices available. if positive (number of NPUs) if NPU devices available. otherwise, a negative error value.
}
/**
+ * @brief Get the driver API level that npu-engine library assumes (compiled)
+ * @param[out] level driver API level
+ * @note when this API level is lower than actual driver's one,
+ * some operations might be not working.
+ */
+void getDriverAPILevel (uint32_t *level)
+{
+ if (level != nullptr)
+ *level = DriverAPI::getCompiledAPILevel ();
+}
+
+/**
+ * @brief Get the driver API level of opened NPU device
+ * @param[in] dev the NPU device handle
+ * @param[out] level driver API level
+ * @return 0 if no error, otherwise a negative errno
+ */
+int getNPU_driverAPILevel (npudev_h dev, uint32_t *level)
+{
+ INIT_HOST_HANDLER (host_handler, dev);
+
+ if (level == nullptr)
+ return -EINVAL;
+
+ return host_handler->getAPILevel (level);
+}
+
+/**
* @brief Get the profile information from NPU
* @param[in] dev The NPU device handle
* @param[in] task_id The identifier for each inference
}
/**
+ * @brief Get the driver API level of opened NPU device
+ * @param[out] level driver API level
+ * @return 0 if no error, otherwise a negative errno
+ */
+int
+HostHandler::getAPILevel (uint32_t *level)
+{
+ const DriverAPI * api = device_->getDriverAPI ();
+ assert (api != nullptr);
+
+ return api->getAPILevel (level);
+}
+
+/**
* @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
int unregisterModels ();
int getProfile (int run_id, npu_profile *profile);
+ int getAPILevel (uint32_t *level);
int setDataInfo (uint32_t modelid, tensors_data_info *in, tensors_data_info *out);
int setConstraint (uint32_t modelid, npuConstraint constraint);
#include "NPUdrvAPI.h"
#include <assert.h>
+uint32_t DriverAPI::api_level_ = TRINITY_API_LEVEL;
+
/**
* @brief DriverAPI constructor
*/
static int getNumDevices (dev_type type);
static std::unique_ptr<DriverAPI> createDriverAPI (dev_type type, int device_id);
-
+ static uint32_t getCompiledAPILevel () { return api_level_; }
int getDeviceID () const { return dev_id_; }
int getDeviceFD () const { return dev_fd_; }
bool initialized () const { return initialized_; }
/** @brief open the device and set device fd */
virtual int open () { return -ENODEV; }
+ virtual int getAPILevel (uint32_t *level) const { return -EPERM; }
virtual int checkSanity () { return 0; }
/** @brief initialize device API. open the device here */
int init ();
bool initialized_;
+
+ static uint32_t api_level_; /**< Trinity API level */
};
/** @brief Driver APIs for TRIV */
int open ();
int checkSanity ();
+ int getAPILevel (uint32_t *level) const;
device_state_t isReady () const;
uint32_t numRequests () const;
int open ();
int checkSanity ();
+ int getAPILevel (uint32_t *level) const;
device_state_t isReady () const;
uint32_t numRequests () const;
return ver;
}
+
+int
+TrinityVisionAPI::getAPILevel (uint32_t *level) const
+{
+ int err;
+
+ if (!this->initialized())
+ return -EPERM;
+
+ err = ioctl (this->getDeviceFD (), TRINITY_IOCTL_GET_API_LEVEL, level);
+ if (err != 0)
+ return -errno;
+
+ return 0;
+}
free (profile.buf);
return -errno;
}
+
+int
+TrinityVision2API::getAPILevel (uint32_t *level) const
+{
+ int err;
+
+ if (!this->initialized())
+ return -EPERM;
+
+ err = ioctl (this->getDeviceFD (), TRINITY_IOCTL_GET_API_LEVEL, level);
+ if (err != 0)
+ return -errno;
+
+ return 0;
+}