Inference begin and end user argument

Adding user argument parameter to invoke() which is passed on to
the inference_begin() and inference_end() callbacks.

Change-Id: I1372767c3a0dbd963aa395911bda7625bc6d6ee4
diff --git a/include/ethosu_driver.h b/include/ethosu_driver.h
index a7b2bdb..ff8d1eb 100644
--- a/include/ethosu_driver.h
+++ b/include/ethosu_driver.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019-2021 Arm Limited. All rights reserved.
+ * Copyright (c) 2019-2022 Arm Limited. All rights reserved.
  *
  * SPDX-License-Identifier: Apache-2.0
  *
@@ -109,11 +109,11 @@
 void ethosu_semaphore_give(void *sem);
 
 /*
- * Callbacks for begin/end of inference. inference_data pointer is set in the
- * ethosu_invoke() call, referenced as custom_data_ptr.
+ * Callbacks for begin/end of inference. user_data pointer is passed to the
+ * ethosu_invoke() call and forwarded to the callback functions.
  */
-void ethosu_inference_begin(struct ethosu_driver *drv, const void *inference_data);
-void ethosu_inference_end(struct ethosu_driver *drv, const void *inference_data);
+void ethosu_inference_begin(struct ethosu_driver *drv, void *user_arg);
+void ethosu_inference_end(struct ethosu_driver *drv, void *user_arg);
 
 /******************************************************************************
  * Prototypes
@@ -147,12 +147,16 @@
 /**
  * Invoke Vela command stream.
  */
-int ethosu_invoke(struct ethosu_driver *drv,
-                  const void *custom_data_ptr,
-                  const int custom_data_size,
-                  const uint64_t *base_addr,
-                  const size_t *base_addr_size,
-                  const int num_base_addr);
+int ethosu_invoke_v3(struct ethosu_driver *drv,
+                     const void *custom_data_ptr,
+                     const int custom_data_size,
+                     const uint64_t *base_addr,
+                     const size_t *base_addr_size,
+                     const int num_base_addr,
+                     void *user_arg);
+
+#define ethosu_invoke(drv, custom_data_ptr, custom_data_size, base_addr, base_addr_size, num_base_addr)                \
+    ethosu_invoke_v3(drv, custom_data_ptr, custom_data_size, base_addr, base_addr_size, num_base_addr, 0)
 
 /**
  * Set Ethos-U power mode.
@@ -187,7 +191,7 @@
                                    const int num_base_addr)
 {
     struct ethosu_driver *drv = ethosu_reserve_driver();
-    int result = ethosu_invoke(drv, custom_data_ptr, custom_data_size, base_addr, base_addr_size, num_base_addr);
+    int result = ethosu_invoke_v3(drv, custom_data_ptr, custom_data_size, base_addr, base_addr_size, num_base_addr, 0);
     ethosu_release_driver(drv);
     return result;
 }
diff --git a/src/ethosu_device_u55_u65.c b/src/ethosu_device_u55_u65.c
index 7fd31eb..9a92f63 100644
--- a/src/ethosu_device_u55_u65.c
+++ b/src/ethosu_device_u55_u65.c
@@ -185,7 +185,7 @@
     if (dev->reg->STATUS.bus_status || dev->reg->STATUS.cmd_parse_error || dev->reg->STATUS.wd_fault ||
         dev->reg->STATUS.ecc_fault || !dev->reg->STATUS.cmd_end_reached)
     {
-        LOG_ERR("NPU fault. status=0x%08x, qread=%" PRIu32 ", cmd_end_reached=%" PRIu32,
+        LOG_ERR("NPU fault. status=0x%08" PRIx32 ", qread=%" PRIu32 ", cmd_end_reached=%d",
                 dev->reg->STATUS.word,
                 dev->reg->QREAD.word,
                 dev->reg->STATUS.cmd_end_reached);
diff --git a/src/ethosu_driver.c b/src/ethosu_driver.c
index fedb2a1..3383ef3 100644
--- a/src/ethosu_driver.c
+++ b/src/ethosu_driver.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019-2021 Arm Limited. All rights reserved.
+ * Copyright (c) 2019-2022 Arm Limited. All rights reserved.
  *
  * SPDX-License-Identifier: Apache-2.0
  *
@@ -209,15 +209,15 @@
  * Weak functions - Inference begin/end callbacks
  ******************************************************************************/
 
-void __attribute__((weak)) ethosu_inference_begin(struct ethosu_driver *drv, const void *inference_data)
+void __attribute__((weak)) ethosu_inference_begin(struct ethosu_driver *drv, void *user_arg)
 {
-    UNUSED(inference_data);
+    UNUSED(user_arg);
     UNUSED(drv);
 }
 
-void __attribute__((weak)) ethosu_inference_end(struct ethosu_driver *drv, const void *inference_data)
+void __attribute__((weak)) ethosu_inference_end(struct ethosu_driver *drv, void *user_arg)
 {
-    UNUSED(inference_data);
+    UNUSED(user_arg);
     UNUSED(drv);
 }
 
@@ -476,12 +476,13 @@
     ethosu_dev_get_hw_info(drv->dev, hw);
 }
 
-int ethosu_invoke(struct ethosu_driver *drv,
-                  const void *custom_data_ptr,
-                  const int custom_data_size,
-                  const uint64_t *base_addr,
-                  const size_t *base_addr_size,
-                  const int num_base_addr)
+int ethosu_invoke_v3(struct ethosu_driver *drv,
+                     const void *custom_data_ptr,
+                     const int custom_data_size,
+                     const uint64_t *base_addr,
+                     const size_t *base_addr_size,
+                     const int num_base_addr,
+                     void *user_arg)
 {
     const struct cop_data_s *data_ptr = custom_data_ptr;
     const struct cop_data_s *data_end = custom_data_ptr + custom_data_size;
@@ -532,7 +533,8 @@
 
     drv->status_error = false;
 
-    ethosu_inference_begin(drv, custom_data_ptr);
+    ethosu_inference_begin(drv, user_arg);
+
     while (data_ptr < data_end)
     {
         int ret = 0;
@@ -577,7 +579,7 @@
         }
     }
 
-    ethosu_inference_end(drv, custom_data_ptr);
+    ethosu_inference_end(drv, user_arg);
 
     if (!drv->status_error && !drv->dev_power_always_on)
     {