/*
 * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
 *
 * 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_INFERENCE_H
#define ETHOSU_INFERENCE_H

/****************************************************************************
 * Includes
 ****************************************************************************/

#include "uapi/ethosu.h"

#include <linux/kref.h>
#include <linux/types.h>
#include <linux/wait.h>

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

struct ethosu_buffer;
struct ethosu_core_inference_rsp;
struct ethosu_device;
struct ethosu_network;
struct ethosu_uapi_inference_create;
struct file;

/**
 * struct ethosu_inference - Inference struct
 * @edev:			Arm Ethos-U device
 * @file:			File handle
 * @kref:			Reference counter
 * @waitq:			Wait queue
 * @ifm:			Pointer to IFM buffer
 * @ofm:			Pointer to OFM buffer
 * @net:			Pointer to network
 * @pending:			Pending response from the firmware
 * @status:			Inference status
 * @pmu_event_config:		PMU event configuration
 * @pmu_event_count:		PMU event count after inference
 * @pmu_cycle_counter_enable:	PMU cycle counter config
 * @pmu_cycle_counter_count:	PMU cycle counter count after inference
 */
struct ethosu_inference {
	struct ethosu_device    *edev;
	struct file             *file;
	struct kref             kref;
	wait_queue_head_t       waitq;
	uint32_t                ifm_count;
	struct ethosu_buffer    *ifm[ETHOSU_FD_MAX];
	uint32_t                ofm_count;
	struct ethosu_buffer    *ofm[ETHOSU_FD_MAX];
	struct ethosu_network   *net;
	bool                    pending;
	enum ethosu_uapi_status status;
	uint8_t                 pmu_event_config[ETHOSU_PMU_EVENT_MAX];
	uint32_t                pmu_event_count[ETHOSU_PMU_EVENT_MAX];
	uint32_t                pmu_cycle_counter_enable;
	uint64_t                pmu_cycle_counter_count;
	struct list_head        list;
};

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

/**
 * ethosu_inference_create() - Create inference
 *
 * This function must be called in the context of a user space process.
 *
 * Return: fd on success, else error code.
 */
int ethosu_inference_create(struct ethosu_device *edev,
			    struct ethosu_network *net,
			    struct ethosu_uapi_inference_create *uapi);

/**
 * ethosu_inference_get_from_fd() - Get inference handle from fd
 *
 * This function must be called from a user space context.
 *
 * Return: Pointer on success, else ERR_PTR.
 */
struct ethosu_inference *ethosu_inference_get_from_fd(int fd);

/**
 * ethosu_inference_get() - Get inference
 */
void ethosu_inference_get(struct ethosu_inference *inf);

/**
 * ethosu_inference_put() - Put inference
 */
void ethosu_inference_put(struct ethosu_inference *inf);

/**
 * ethosu_inference_rsp() - Handle inference response
 */
void ethosu_inference_rsp(struct ethosu_device *edev,
			  struct ethosu_core_inference_rsp *rsp);

#endif /* ETHOSU_INFERENCE_H */
