aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKristofer Jonsson <kristofer.jonsson@arm.com>2021-06-18 17:00:32 +0200
committeryulgar01 <yulgar01@arm.com>2021-08-31 13:11:21 +0000
commit431d70c73fb0aa6ff3cade3337f01337dc8ce49e (patch)
tree8928ce48dc01f081f8bd8b1ee7178ab9f66b3442
parent6eab40b2051882833dd446cd56ba7c17a5f7082c (diff)
downloadethos-u-core-driver-431d70c73fb0aa6ff3cade3337f01337dc8ce49e.tar.gz
Zephyr module files:
1. Update init.c: - Create a new flow using DT_INST_FOREACH_STATUS_OKAY() macro. This macro will: - parse each node in dtb file for each npu - run "init" function with dts params - run ethosu_init() - enable irq Change-Id: Iaf370d258e0521a133ae38f2df66f93c249754f9
-rw-r--r--zephyr/CMakeLists.txt31
-rw-r--r--zephyr/Kconfig8
-rw-r--r--zephyr/init.c167
-rw-r--r--zephyr/module.yml5
4 files changed, 211 insertions, 0 deletions
diff --git a/zephyr/CMakeLists.txt b/zephyr/CMakeLists.txt
new file mode 100644
index 0000000..e1242b3
--- /dev/null
+++ b/zephyr/CMakeLists.txt
@@ -0,0 +1,31 @@
+#
+# Copyright (c) 2021 Arm Limited. All rights reserved.
+#
+# SPDX-License-Identifier: Apache-2.0
+#
+# Licensed under the Apache License, Version 2.0 (the License); you may
+# not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an AS IS BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+cmake_policy(SET CMP0079 NEW)
+
+# Include Ethos-U core driver
+add_subdirectory(.. core_driver)
+
+# Append Zephyr build environment to core driver target
+
+target_link_libraries(ethosu_core_driver PUBLIC
+ zephyr_interface)
+
+# Add init files
+zephyr_sources(
+ init.c)
diff --git a/zephyr/Kconfig b/zephyr/Kconfig
new file mode 100644
index 0000000..a318bb9
--- /dev/null
+++ b/zephyr/Kconfig
@@ -0,0 +1,8 @@
+# Copyright (c) 2021 Arm Limited. All rights reserved.
+# SPDX-License-Identifier: Apache-2.0
+
+config ARM_ETHOS_U
+ bool "Ethos-U core driver"
+ default y
+ help
+ This option enables the Arm Ethos-U core driver.
diff --git a/zephyr/init.c b/zephyr/init.c
new file mode 100644
index 0000000..4dacc03
--- /dev/null
+++ b/zephyr/init.c
@@ -0,0 +1,167 @@
+/*
+ * Copyright (c) 2021 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "ethosu_driver.h"
+#include <device.h>
+#include <devicetree.h>
+#include <init.h>
+#include <kernel.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/printk.h>
+#include <sys/util.h>
+
+#define DT_DRV_COMPAT arm_ethos_u
+
+/*******************************************************************************
+ * Re-implementation/Overrides __((weak)) symbol functions from ethosu_driver.c
+ * To handle mutex and semaphores
+ *******************************************************************************/
+void *ethosu_mutex_create(void)
+{
+ int status = 0;
+ struct k_mutex *mutex = k_malloc(sizeof(*mutex));
+ status = k_mutex_init(mutex);
+ if (status != 0)
+ {
+ printk("Failed to create mutex with error - %d\n", status);
+ }
+ return (void *)mutex;
+}
+
+void ethosu_mutex_lock(void *mutex)
+{
+ int status = 0;
+ status = k_mutex_lock((struct k_mutex *)mutex, K_FOREVER);
+ if (status != 0)
+ {
+ printk("Failed to lock mutex with error - %d\n", status);
+ }
+}
+
+void ethosu_mutex_unlock(void *mutex)
+{
+ k_mutex_unlock((struct k_mutex *)mutex);
+}
+
+void *ethosu_semaphore_create(void)
+{
+ int status = 0;
+ struct k_sem *sem = k_malloc(sizeof(*sem));
+ status = k_sem_init(sem, 1, 100);
+ if (status != 0)
+ {
+ printk("Failed to create semaphore with error - %d\n", status);
+ }
+ return (void *)sem;
+}
+
+void ethosu_semaphore_take(void *sem)
+{
+ int status = 0;
+ status = k_sem_take((struct k_sem *)sem, K_FOREVER);
+ if (status != 0)
+ {
+ printk("Failed to take semaphore with error - %d\n", status);
+ }
+}
+
+void ethosu_semaphore_give(void *sem)
+{
+ k_sem_give((struct k_sem *)sem);
+}
+
+struct ethosu_dts_info
+{
+ uint32_t base_addr;
+ uint32_t secure_enable;
+ uint32_t privilege_enable;
+ uint32_t irq;
+ uint32_t irq_priority;
+ uint32_t inst;
+};
+
+struct ethosu_data
+{
+ struct ethosu_driver drv;
+ void (*irq_config)(void);
+};
+
+static int ethosu_zephyr_init(const struct device *dev)
+{
+ const struct ethosu_dts_info *config = dev->config;
+ const struct ethosu_data *data = dev->data;
+ struct ethosu_driver *drv = (struct ethosu_driver *)&data->drv;
+ struct ethosu_driver_version version;
+ printk("Ethos-U DTS info. base_address=0x%x, inst=%u, secure_enable=%u, privilege_enable=%u, irq=%u, "
+ "irq_priority=%u\n",
+ config->base_addr,
+ config->inst,
+ config->secure_enable,
+ config->privilege_enable,
+ config->irq,
+ config->irq_priority);
+
+ ethosu_get_driver_version(&version);
+ printk("Version. major=%u, minor=%u, patch=%u\n", version.major, version.minor, version.patch);
+ if (ethosu_init(drv, (void *)(config->base_addr), NULL, 0, config->secure_enable, config->privilege_enable))
+ {
+ printk("Failed to initialize NPU with ethosu_init().\n");
+ return -EINVAL;
+ }
+
+ data->irq_config();
+
+ return 0;
+}
+
+#define ETHOSU_DEVICE_INIT(n) \
+ static void ethosu_zephyr_irq_config_##n(void); \
+ \
+ static struct ethosu_data ethosu_data_##n = {.irq_config = &ethosu_zephyr_irq_config_##n}; \
+ \
+ static void ethosu_zephyr_irq_handler_##n(void) \
+ { \
+ struct ethosu_driver *drv = &ethosu_data_##n.drv; \
+ ethosu_irq_handler(drv); \
+ } \
+ \
+ static void ethosu_zephyr_irq_config_##n(void) \
+ { \
+ IRQ_DIRECT_CONNECT(DT_INST_IRQN(n), DT_INST_IRQ(n, priority), ethosu_zephyr_irq_handler_##n, 0); \
+ irq_enable(DT_INST_IRQN(n)); \
+ } \
+ \
+ static const struct ethosu_dts_info ethosu_dts_info_##n = { \
+ .base_addr = DT_INST_REG_ADDR(n), \
+ .secure_enable = DT_INST_PROP(n, secure_enable), \
+ .privilege_enable = DT_INST_PROP(n, privilege_enable), \
+ .irq = DT_INST_IRQN(n), \
+ .irq_priority = DT_INST_IRQ(n, priority), \
+ .inst = n, \
+ }; \
+ \
+ DEVICE_DT_INST_DEFINE(n, \
+ ethosu_zephyr_init, \
+ NULL, \
+ &ethosu_data_##n, \
+ &ethosu_dts_info_##n, \
+ POST_KERNEL, \
+ CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, \
+ NULL);
+
+DT_INST_FOREACH_STATUS_OKAY(ETHOSU_DEVICE_INIT);
diff --git a/zephyr/module.yml b/zephyr/module.yml
new file mode 100644
index 0000000..225f12b
--- /dev/null
+++ b/zephyr/module.yml
@@ -0,0 +1,5 @@
+# Copyright (c) 2021 Arm Limited. All rights reserved.
+# SPDX-License-Identifier: Apache-2.0
+build:
+ cmake: zephyr
+ kconfig: zephyr/Kconfig