[IDU] check idu version when register model
authorYelin Jeong <yelini.jeong@samsung.com>
Wed, 14 Jun 2023 11:50:14 +0000 (20:50 +0900)
committer추지호/SoC Architecture팀(SR)/삼성전자 <jiho.chu@samsung.com>
Wed, 5 Jul 2023 05:21:33 +0000 (14:21 +0900)
This patch adds idu version check logic,
when register model

Signed-off-by: Yelin Jeong <yelini.jeong@samsung.com>
include/uapi/misc/trinity.h
src/core/ne-handler.cc
src/core/npu/NPUdrvAPI.h
src/core/npu/NPUdrvAPI_emul.cc
src/core/npu/NPUdrvAPI_triv2.cc
tests/unittests/ne_core_npu_test.cc
tests/utils/ne_test_utils.cc

index 79cf036fe19ff6b9f9b75c9d4ebd77505da49cf3..8dc2e8e6adaa0c6034d4fc4f92bb9c5c7f37d320 100644 (file)
@@ -261,6 +261,7 @@ struct trinity_ioctl_model {
        __u64 program_offset_addr;
        __u64 program_size;
        __u32 version;
+       __u64 npu_version;
        union {
                __u8 endp_trnt_model_common[0];
                struct {
index 7c0af1aa1ab3863c65c6eaa7d299cddf32cf7821..e2bf0bf4d0a4e84b25b173b01df6516585f2f35d 100644 (file)
@@ -1009,6 +1009,7 @@ TrinityVision2::setModel (const generic_buffer *model_buf, Model **model_ptr) {
     config.program_size = hwmem_prog->getSize ();
     config.program_offset_addr = 0;
     config.metadata_dbuf_fd = model->getDmabuf ();
+    config.npu_version = model->getMetadata ()->getNPUVersion ();
 
     /** for metadata extended section */
     size_t extended_size = model->getMetadata ()->getMetaExtendedSize ();
@@ -1040,7 +1041,7 @@ TrinityVision2::setModel (const generic_buffer *model_buf, Model **model_ptr) {
 
     config.num_visa_insts = model->getNumInsts ();
 
-    status = api_->registerModel (&config, model->getMetadata ()->getNPUVersion ());
+    status = api_->registerModel (&config);
     if (status != 0)
       goto delete_exit;
 
index eb936c7d477e94dee338fe02f0648bee8b60824e..cf5f6e664a870c01b7db440dbfff983619733566 100644 (file)
@@ -87,9 +87,7 @@ class DriverAPI {
   virtual int stop_target (int id) const { return -EPERM; }
 
   /** @brief register model config to the driver */
-  virtual int registerModel (model_config_t *model, uint64_t npu_version = 0) const {
-    return -EPERM;
-  }
+  virtual int registerModel (model_config_t *model) const { return -EPERM; }
   virtual int deregisterModel (unsigned long long id) const { return -EPERM; }
 
 #ifdef __FPGA__
@@ -149,7 +147,7 @@ class TrinityVision2API : public DriverAPI {
   int stop () const;
   int stop_target (int id) const;
 
-  int registerModel (model_config_t *model, uint64_t npu_version) const;
+  int registerModel (model_config_t *model) const;
   int deregisterModel (unsigned long long id) const;
 
 #ifdef __FPGA__
@@ -206,7 +204,7 @@ class TrinityEmulAPI : public DriverAPI {
   int stop () const;
   int stop_target (int id) const;
 
-  int registerModel (model_config_t *model, uint64_t npu_version) const;
+  int registerModel (model_config_t *model) const;
   int deregisterModel (unsigned long long id) const;
 
   int getProfile (int req_id, npu_profile *profile, const std::string path = "") const;
index 7077f788ad04b1ab49ec2a9d7bec271d89637c57..8ef8f19a1db838e803dcd363b476de88216495ad 100644 (file)
@@ -666,7 +666,7 @@ TrinityEmulAPI::checkVersion (uint64_t npu_version) const {
  * @return 0 if no error. otherwise a negative errno
  */
 int
-TrinityEmulAPI::registerModel (model_config_t *model_config, uint64_t npu_version) const {
+TrinityEmulAPI::registerModel (model_config_t *model_config) const {
   static std::atomic<uint64_t> global_internal_id (0);
 
   if (!initialized ())
@@ -675,7 +675,7 @@ TrinityEmulAPI::registerModel (model_config_t *model_config, uint64_t npu_versio
   if (model_config == nullptr || model_config->dbuf_fd < 0)
     return -EINVAL;
 
-  if (checkVersion (npu_version)) {
+  if (checkVersion (model_config->npu_version)) {
     logerr (TAG, "model npu version is not matched to device");
     return -EINVAL;
   }
@@ -699,7 +699,7 @@ TrinityEmulAPI::registerModel (model_config_t *model_config, uint64_t npu_versio
   memcpy (config, model_config, sizeof (model_config_t));
 
   elem->setModelConfig (config);
-  elem->setNpuVersion (npu_version);
+  elem->setNpuVersion (model_config->npu_version);
 
   return 0;
 }
index 11aa1cc26a0d11b8083626cf1f1182198f57379f..7227a3681e22223d2e40630ddc8e85677fd8cf32 100644 (file)
@@ -421,7 +421,7 @@ TrinityVision2API::munmap (void *addr, size_t size) const {
  * @return 0 if no error. otherwise a negative errno
  */
 int
-TrinityVision2API::registerModel (model_config_t *model_config, uint64_t npu_version) const {
+TrinityVision2API::registerModel (model_config_t *model_config) const {
   uint32_t model_tops;
   uint32_t device_tops;
   int ret;
@@ -431,12 +431,17 @@ TrinityVision2API::registerModel (model_config_t *model_config, uint64_t npu_ver
     return -EPERM;
   }
 
-  if (NPU_VERSION_MAJOR (npu_version) != 2) {
+  if (model_config == nullptr) {
+    logerr (TAG, "Invalid argument\n");
+    return -EINVAL;
+  }
+
+  if (NPU_VERSION_MAJOR (model_config->npu_version) != 2) {
     logerr (TAG, "Invalid driver version\n");
     return -EINVAL;
   }
 
-  model_tops = NPU_VERSION_TOPS (npu_version);
+  model_tops = NPU_VERSION_TOPS (model_config->npu_version);
   if (model_tops != 0) {
     ret = getTops (&device_tops);
     if (ret != 0)
index 00e121772e705f76f928219afc95791ff0f1f6a0..9ea262ecd2c881abcb5f519dc6a144009654e898 100644 (file)
@@ -369,8 +369,9 @@ TEST (ne_core_npu_test, run_inference_triv2) {
   model.program_offset_addr = 0;
   model.program_size = 0;
   model.metadata_dbuf_fd = model_dmabuf; /* dummy */
+  model.npu_version = testenv.get_version ();
 
-  EXPECT_EQ (api->registerModel (&model, testenv.get_version ()), 0);
+  EXPECT_EQ (api->registerModel (&model), 0);
 
   /** allocate input data */
   buffer_dmabuf = api->alloc (size);
@@ -428,8 +429,9 @@ TEST (ne_core_npu_test, run_inference_async0_triv2) {
   model.program_offset_addr = 0;
   model.program_size = 0;
   model.metadata_dbuf_fd = model_dmabuf; /* dummy */
+  model.npu_version = testenv.get_version ();
 
-  EXPECT_EQ (api->registerModel (&model, testenv.get_version ()), 0);
+  EXPECT_EQ (api->registerModel (&model), 0);
 
   int *buf = nullptr;
   int buffer_dmabuf = -1;
@@ -502,8 +504,9 @@ TEST (ne_core_npu_test, run_inference_async1_triv2) {
     model.program_offset_addr = 0;
     model.program_size = 0;
     model.metadata_dbuf_fd = ret; /* dummy */
+    model.npu_version = testenv.get_version ();
 
-    ret = api->registerModel (&model, testenv.get_version ());
+    ret = api->registerModel (&model);
     if (ret < 0) {
       model.dbuf_fd = -1;
     }
@@ -569,8 +572,9 @@ TEST (ne_core_npu_test, run_inference_triv2_n) {
   model.program_offset_addr = 0;
   model.program_size = 4096;
   model.metadata_dbuf_fd = model_dmabuf; /* dummy */
+  model.npu_version = testenv.get_version ();
 
-  EXPECT_EQ (api->registerModel (&model, testenv.get_version ()), 0);
+  EXPECT_EQ (api->registerModel (&model), 0);
 
   /** allocate input data */
   buffer_dmabuf = api->alloc (size);
index de686fde25dfbcd84ecb591a104522adcefad1f1..257073947e482a3d0eaef2a68699f4181f2a3d1c 100644 (file)
@@ -903,11 +903,11 @@ UtilTestEnv::set_info () {
     return -ENOMEM;
   }
 
-  /* default NPU version for testing is 2.4 */
+  /* default NPU version for testing is 2.4.2 */
   if (npu_ver == NULL || strcmp (npu_ver, "2.4") == 0) {
     devices_[0] = NPUCOND_TRIV24_CONN_UNKNOWN;
     devices_[1] = NPUCOND_TRIV24_CONN_SOCIP;
-    version_ = 0x04000402;
+    version_ = 0x04020402;
     model_ = "/testdata/TRIV242/CONV_2D_000";
     tops_ = 4;
   } else if (strcmp (npu_ver, "2.3") == 0) {