[API] Add getNPUmodel_compatibleDevices
authorJiho Chu <jiho.chu@samsung.com>
Tue, 11 Apr 2023 02:44:53 +0000 (11:44 +0900)
committer추지호/SoC Architecture팀(SR)/삼성전자 <jiho.chu@samsung.com>
Tue, 11 Apr 2023 09:32:53 +0000 (18:32 +0900)
This patch adds an API for compatible device list.

Signed-off-by: Jiho Chu <jiho.chu@samsung.com>
include/host/libnpuhost.h
src/host/ne-host.cc

index 7c981b3cffaaa5ba7d602c512b4332657d1f7750..c00e1143d6955aba84576f3a856d41b8f2d402a8 100644 (file)
@@ -141,6 +141,17 @@ getNPUmodel_metasize (npubin_meta *meta) {
   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
index d7604b829920b17604b9d7f27c322f479f4f3673..625a74e24319de3074c596749f4e0c14a45e8de9 100644 (file)
@@ -691,6 +691,55 @@ exit_err:
   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