/*
 * 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 <linux/types.h>
#else
#include <stdint.h>
#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];
	uint64_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 */
