/*
 * Copyright (c) 2020-2022 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_MAILBOX_H
#define ETHOSU_MAILBOX_H

/****************************************************************************
 * Includes
 ****************************************************************************/
#include "ethosu_core_interface.h"

#include <linux/types.h>
#include <linux/mailbox_client.h>
#include <linux/workqueue.h>
#include <linux/idr.h>

/****************************************************************************
 * Types
 ****************************************************************************/

struct device;
struct ethosu_buffer;
struct ethosu_device;
struct ethosu_core_msg;
struct ethosu_core_queue;
struct ethosu_watchdog;
struct resource;

typedef void (*ethosu_mailbox_cb)(void *user_arg);

struct ethosu_mailbox {
	struct device            *dev;
	struct workqueue_struct  *wq;
	struct work_struct       work;
	struct ethosu_core_queue __iomem *in_queue;
	struct ethosu_core_queue __iomem *out_queue;
	struct mbox_client       client;
	struct mbox_chan         *rx;
	struct mbox_chan         *tx;
	ethosu_mailbox_cb        callback;
	void                     *user_arg;
	struct idr               msg_idr;
	struct ethosu_watchdog   *wdog;
	unsigned                 ping_count;
};

struct ethosu_mailbox_msg {
	int  id;
	void (*fail)(struct ethosu_mailbox_msg *msg);
	int  (*resend)(struct ethosu_mailbox_msg *msg);
};

/****************************************************************************
 * Functions
 ****************************************************************************/

/**
 * ethosu_mailbox_init() - Initialize mailbox
 *
 * Return: 0 on success, else error code.
 */
int ethosu_mailbox_init(struct ethosu_mailbox *mbox,
			struct device *dev,
			struct resource *in_queue,
			struct resource *out_queue,
			ethosu_mailbox_cb callback,
			void *user_arg,
			struct ethosu_watchdog *wdog);

/**
 * ethosu_mailbox_deinit() - Deinitialize mailbox
 */
void ethosu_mailbox_deinit(struct ethosu_mailbox *mbox);

/**
 * ethosu_mailbox_wait_prepare() - Prepare to wait on firmware
 *
 * This function must only be called when the firmware is in a
 * stopped state. It invalidates the firmware queues setting
 * size, read and write positions to illegal values.
 */
void ethosu_mailbox_wait_prepare(struct ethosu_mailbox *mbox);

/**
 * ethosu_mailbox_wait_firmware() - Waiting for firmware to initialize
 *                                  message queues
 *
 * Following a call to ethosu_mailbox_wait_prepare() this function waits for
 * the firmware to boot up and initialize the firmware queues.
 *
 * Return: 0 on success, else error code.
 */
int ethosu_mailbox_wait_firmware(struct ethosu_mailbox *mbox);

/**
 * ethosu_mailbox_read() - Read message from mailbox
 *
 * Return: 0 message read, else error code.
 */
int ethosu_mailbox_read(struct ethosu_mailbox *mbox,
			struct ethosu_core_msg *header,
			void *data,
			size_t length);

/**
 * ethosu_mailbox_register() - Register the ethosu_mailbox_msg in ethosu_mailbox
 *
 * Return: 0 on success, else error code.
 */
int ethosu_mailbox_register(struct ethosu_mailbox *mbox,
			    struct ethosu_mailbox_msg *msg);

/**
 * ethosu_mailbox_free_id() - Free the id of the ethosu_mailbox_msg
 */
void ethosu_mailbox_deregister(struct ethosu_mailbox *mbox,
			       struct ethosu_mailbox_msg *msg);

/**
 * ethosu_mailbox_find() - Find mailbox message
 *
 * Return: a valid pointer on success, otherwise an error ptr.
 */
struct ethosu_mailbox_msg *ethosu_mailbox_find(struct ethosu_mailbox *mbox,
					       int msg_id);

/**
 * ethosu_mailbox_fail() - Fail mailbox messages
 *
 * Call fail() callback on all messages in pending list.
 */
void ethosu_mailbox_fail(struct ethosu_mailbox *mbox);

/**
 * ethosu_mailbox_resend() - Resend mailbox messages
 *
 * Call resend() callback on all messages in pending list.
 */
void ethosu_mailbox_resend(struct ethosu_mailbox *mbox);

/**
 * ethosu_mailbox_reset() - Reset to end of queue
 */
void ethosu_mailbox_reset(struct ethosu_mailbox *mbox);

/**
 * ethosu_mailbox_ping() - Send ping message
 *
 * Return: 0 on success, else error code.
 */
int ethosu_mailbox_ping(struct ethosu_mailbox *mbox);

/**
 * ethosu_mailbox_pong() - Send pong response
 *
 * Return: 0 on success, else error code.
 */
int ethosu_mailbox_pong(struct ethosu_mailbox *mbox);

/**
 * ethosu_mailbox_version_response - Send version request
 *
 * Return: 0 on succes, else error code
 */
int ethosu_mailbox_version_request(struct ethosu_mailbox *mbox);

/**
 * ethosu_mailbox_capabilities_request() - Send capabilities request
 *
 * Return: 0 on success, else error code.
 */
int ethosu_mailbox_capabilities_request(struct ethosu_mailbox *mbox,
					struct ethosu_mailbox_msg *msg);

/**
 * ethosu_mailbox_inference() - Send inference
 *
 * Return: 0 on success, else error code.
 */
int ethosu_mailbox_inference(struct ethosu_mailbox *mbox,
			     struct ethosu_mailbox_msg *msg,
			     uint32_t ifm_count,
			     struct ethosu_buffer **ifm,
			     uint32_t ofm_count,
			     struct ethosu_buffer **ofm,
			     struct ethosu_buffer *network,
			     uint32_t network_index,
			     uint8_t *pmu_event_config,
			     uint8_t pmu_event_config_count,
			     uint8_t pmu_cycle_counter_enable);

/**
 * ethosu_mailbox_network_info_request() - Send network info request
 *
 * Return: 0 on success, else error code.
 */
int ethosu_mailbox_network_info_request(struct ethosu_mailbox *mbox,
					struct ethosu_mailbox_msg *msg,
					struct ethosu_buffer *network,
					uint32_t network_index);

/**
 * ethosu_mailbox_cancel_inference() - Send inference cancellation
 *
 * Return: 0 on success, else error code.
 */
int ethosu_mailbox_cancel_inference(struct ethosu_mailbox *mbox,
				    struct ethosu_mailbox_msg *msg,
				    int inference_handle);

#endif /* ETHOSU_MAILBOX_H */
