return NPUBIN_META_SIZE + extended_metasize;
}
+/**
+ * @brief Get the list of model compatible devices
+ * @param[in] meta the extracted metadata
+ * @param[out] dev_list the list of compatible devices
+ * @param[out] num_dev the number of compatible devices
+ *
+ * @return 0 if no error, otherwise a negative errno
+ * @note the caller needs to free the dev_list.
+ */
+int getNPUmodel_compatibleDevices(npubin_meta *meta, dev_type **dev_list, size_t *num_dev);
+
/**
* @brief Send the NN model to NPU.
* @param[in] dev The NPU device handle
return nullptr;
}
+int getNPUmodel_compatibleDevices(npubin_meta *meta, dev_type **dev_list, size_t *num_dev) {
+ dev_type *devs;
+ size_t devs_len;
+ uint64_t npu_version;
+
+ if (!meta || !dev_list || !num_dev)
+ return -EINVAL;
+
+ if (!CHECK_NPUBIN (meta->magiccode)) {
+ logerr (TAG, "Invalid metadata provided\n");
+ return -EINVAL;
+ }
+
+ /* get the number of devices */
+ npu_version = meta->npu_version;
+ if (NPU_VERSION_MAJOR(npu_version) == 2 &&
+ (NPU_VERSION_MINOR(npu_version) == 3 || NPU_VERSION_MINOR(npu_version) == 4)) {
+ devs_len = 2;
+ } else {
+ devs_len = 0;
+ }
+
+ if (devs_len <= 0) {
+ logerr (TAG, "There is no compatible devices\n");
+ return -ENOENT;
+ }
+
+ devs = (dev_type *) calloc (devs_len, sizeof (dev_type));
+ if (!devs) {
+ logerr (TAG, "Failed to allocate device list");
+ return -ENOMEM;
+ }
+
+ if (NPU_VERSION_MAJOR(npu_version) == 2) {
+ if (NPU_VERSION_MINOR(npu_version) == 3) {
+ devs[0] = NPUCOND_TRIV23_CONN_UNKNOWN;
+ devs[1] = NPUCOND_TRIV23_CONN_SOCIP;
+ } else if (NPU_VERSION_MINOR(npu_version) == 4) {
+ devs[0] = NPUCOND_TRIV24_CONN_UNKNOWN;
+ devs[1] = NPUCOND_TRIV24_CONN_SOCIP;
+ }
+ }
+
+ *dev_list = devs;
+ *num_dev = devs_len;
+
+ return 0;
+}
+
/**
* @brief Write logs
* @param[in] level log severity level