From 964c0ac54ef268826fc9dd49bc0d106e217a74f0 Mon Sep 17 00:00:00 2001 From: Kristofer Jonsson Date: Wed, 11 Jan 2023 15:59:34 +0100 Subject: Add rpmsg interface Change-Id: Id70e249448cea13cb9273d68c91080342d5c5973 --- kernel/ethosu_core_rpmsg.h | 249 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 249 insertions(+) create mode 100644 kernel/ethosu_core_rpmsg.h diff --git a/kernel/ethosu_core_rpmsg.h b/kernel/ethosu_core_rpmsg.h new file mode 100644 index 0000000..8d2c51d --- /dev/null +++ b/kernel/ethosu_core_rpmsg.h @@ -0,0 +1,249 @@ +/* + * Copyright (c) 2020-2023 Arm Limited. + * + * This program is free software and is provided to you under the terms of the + * GNU General Public License version 2 as published by the Free Software + * Foundation, and any use by you of this program is subject to the terms + * of such GNU licence. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * SPDX-License-Identifier: GPL-2.0-only + */ + +#ifndef ETHOSU_CORE_RPMSG_H +#define ETHOSU_CORE_RPMSG_H + +#ifdef __KERNEL__ +#include +#else +#include +#endif + +#ifdef __cplusplus +namespace EthosU { +#endif + +/** Maximum number of IFM/OFM buffers per inference */ +#define ETHOSU_CORE_BUFFER_MAX 16 + +/** Maximum number of PMU counters to be returned for inference */ +#define ETHOSU_CORE_PMU_MAX 8 + +#define ETHOSU_CORE_MSG_MAGIC 0x41457631 +#define ETHOSU_CORE_MSG_VERSION_MAJOR 0 +#define ETHOSU_CORE_MSG_VERSION_MINOR 2 +#define ETHOSU_CORE_MSG_VERSION_PATCH 0 + +/** + * enum ethosu_core_msg_type - Message types + * + * Types for the messages sent between the host and the core subsystem. + */ +enum ethosu_core_msg_type { + ETHOSU_CORE_MSG_ERR = 1, + ETHOSU_CORE_MSG_PING, + ETHOSU_CORE_MSG_PONG, + ETHOSU_CORE_MSG_INFERENCE_REQ, + ETHOSU_CORE_MSG_INFERENCE_RSP, + ETHOSU_CORE_MSG_VERSION_REQ, + ETHOSU_CORE_MSG_VERSION_RSP, + ETHOSU_CORE_MSG_CAPABILITIES_REQ, + ETHOSU_CORE_MSG_CAPABILITIES_RSP, + ETHOSU_CORE_MSG_NETWORK_INFO_REQ, + ETHOSU_CORE_MSG_NETWORK_INFO_RSP, + ETHOSU_CORE_MSG_CANCEL_INFERENCE_REQ, + ETHOSU_CORE_MSG_CANCEL_INFERENCE_RSP, + ETHOSU_CORE_MSG_MAX +}; + +/** + * struct ethosu_core_msg_header - Message header + */ +struct ethosu_core_msg_header { + uint32_t magic; + uint32_t type; + uint64_t msg_id; +}; + +/** + * enum ethosu_core_status - Status + */ +enum ethosu_core_status { + ETHOSU_CORE_STATUS_OK, + ETHOSU_CORE_STATUS_ERROR, + ETHOSU_CORE_STATUS_RUNNING, + ETHOSU_CORE_STATUS_REJECTED, + ETHOSU_CORE_STATUS_ABORTED, + ETHOSU_CORE_STATUS_ABORTING, +}; + +/** + * struct ethosu_core_buffer - Buffer descriptor + * + * Pointer and size to a buffer within the Ethos-U address space. + */ +struct ethosu_core_buffer { + uint32_t ptr; + uint32_t size; +}; + +/** + * enum ethosu_core_network_type - Network buffer type + */ +enum ethosu_core_network_type { + ETHOSU_CORE_NETWORK_BUFFER = 1, + ETHOSU_CORE_NETWORK_INDEX +}; + +/** + * struct ethosu_core_network_buffer - Network buffer + */ +struct ethosu_core_network_buffer { + uint32_t type; + union { + struct ethosu_core_buffer buffer; + uint32_t index; + }; +}; + +/** + * struct ethosu_core_msg_inference_req - Inference request + */ +struct ethosu_core_msg_inference_req { + uint32_t ifm_count; + struct ethosu_core_buffer ifm[ETHOSU_CORE_BUFFER_MAX]; + uint32_t ofm_count; + struct ethosu_core_buffer ofm[ETHOSU_CORE_BUFFER_MAX]; + struct ethosu_core_network_buffer network; + uint8_t pmu_event_config[ETHOSU_CORE_PMU_MAX]; + uint32_t pmu_cycle_counter_enable; +}; + +/** + * struct ethosu_core_msg_inference_rsp - Inference response + */ +struct ethosu_core_msg_inference_rsp { + uint32_t ofm_count; + uint32_t ofm_size[ETHOSU_CORE_BUFFER_MAX]; + uint32_t status; + uint8_t pmu_event_config[ETHOSU_CORE_PMU_MAX]; + uint32_t pmu_event_count[ETHOSU_CORE_PMU_MAX]; + uint32_t pmu_cycle_counter_enable; + uint64_t pmu_cycle_counter_count; +}; + +/** + * struct ethosu_core_msg_network_info_req - Network information request + */ +struct ethosu_core_msg_network_info_req { + struct ethosu_core_network_buffer network; +}; + +/** + * struct ethosu_core_msg_network_info_rsp - Network information response + */ +struct ethosu_core_msg_network_info_rsp { + char desc[32]; + uint32_t ifm_count; + uint32_t ifm_size[ETHOSU_CORE_BUFFER_MAX]; + uint32_t ofm_count; + uint32_t ofm_size[ETHOSU_CORE_BUFFER_MAX]; + uint32_t status; +}; + +/** + * struct ethosu_core_msg_version_rsp - Message protocol version + */ +struct ethosu_core_msg_version_rsp { + uint8_t major; + uint8_t minor; + uint8_t patch; + uint8_t _reserved; +}; + +/** + * struct ethosu_core_msg_capabilities_rsp - Message capabilities response + */ +struct ethosu_core_msg_capabilities_rsp { + uint32_t version_status; + uint32_t version_minor; + uint32_t version_major; + uint32_t product_major; + uint32_t arch_patch_rev; + uint32_t arch_minor_rev; + uint32_t arch_major_rev; + uint32_t driver_patch_rev; + uint32_t driver_minor_rev; + uint32_t driver_major_rev; + uint32_t macs_per_cc; + uint32_t cmd_stream_version; + uint32_t custom_dma; +}; + +/** + * struct ethosu_core_msg_cancel_inference_req - Message cancel inference + * request + */ +struct ethosu_core_msg_cancel_inference_req { + uint64_t inference_handle; +}; + +/** + * struct ethosu_core_msg_cancel_inference_rsp - Message cancel inference + * response + */ +struct ethosu_core_msg_cancel_inference_rsp { + uint32_t status; +}; + +/** + * enum ethosu_core_err_type - Error types + */ +enum ethosu_core_err_type { + ETHOSU_CORE_MSG_ERR_GENERIC = 0, + ETHOSU_CORE_MSG_ERR_UNSUPPORTED_TYPE, + ETHOSU_CORE_MSG_ERR_INVALID_PAYLOAD, + ETHOSU_CORE_MSG_ERR_INVALID_SIZE, + ETHOSU_CORE_MSG_ERR_INVALID_MAGIC, + ETHOSU_CORE_MSG_ERR_MAX +}; + +/** + * struct ethosu_core_msg_err - Error message struct + */ +struct ethosu_core_msg_err { + uint32_t type; /* optional use of extra error code */ + char msg[128]; +}; + +/** + * struct ethosu_core_rpmsg - Rpmsg message + */ +struct ethosu_core_rpmsg { + struct ethosu_core_msg_header header; + union { + struct ethosu_core_msg_inference_req inf_req; + struct ethosu_core_msg_inference_rsp inf_rsp; + struct ethosu_core_msg_network_info_req net_info_req; + struct ethosu_core_msg_network_info_rsp net_info_rsp; + struct ethosu_core_msg_capabilities_rsp cap_rsp; + struct ethosu_core_msg_cancel_inference_req cancel_req; + struct ethosu_core_msg_cancel_inference_rsp cancel_rsp; + struct ethosu_core_msg_version_rsp version_rsp; + struct ethosu_core_msg_err error; + }; +}; + +#ifdef __cplusplus +} /*namespace EthosU */ +#endif + +#endif /* ETHOSU_CORE_RPMSG_H */ -- cgit v1.2.1