/* SPDX-License-Identifier: BSD-2-Clause */
/*
 * Copyright 2018-2019 NXP
 *
 * Brief   CAAM Job Rings Hardware Abstration Layer header.
 */
#ifndef __CAAM_HAL_JR_H__
#define __CAAM_HAL_JR_H__

#include <caam_common.h>

/*
 * Configures the Job Ring Owner and lock it.
 * If the configuration is already locked, checks the configuration
 * set and returns an error if value is not corresponding to the
 * expected value.
 *
 * @ctrl_base  Base address of the controller
 * @jr_offset  Job Ring offset to configure
 * @owner      Onwer ID to configure
 */
enum caam_status caam_hal_jr_setowner(vaddr_t ctrl_base, paddr_t jr_offset,
				      enum caam_jr_owner owner);

/*
 * Resets the Job Ring to ensure that all pending jobs are completed
 * and no other will be executed
 *
 * @baseaddr   Job Ring Base address
 */
enum caam_status caam_hal_jr_reset(vaddr_t baseaddr);

/*
 * Configures the Job Ring HW queues.
 *
 * @baseaddr   Job Ring Base Address
 * @nbjobs     Number of job rings supported
 * @inrings    physical address of the JR input queue
 * @outrings   physical address of the JR output queue
 */
void caam_hal_jr_config(vaddr_t baseaddr, uint8_t nbjobs, uint64_t inrings,
			uint64_t outrings);

/*
 * Returns the number of slots available in the input job ring
 *
 * @baseaddr   Job Ring Base address
 */
uint32_t caam_hal_jr_read_nbslot_available(vaddr_t baseaddr);

/*
 * Indicates to HW that a new job is available
 *
 * @baseaddr   Job Ring Base Address
 */
void caam_hal_jr_add_newjob(vaddr_t baseaddr);

/*
 * Returns the number of job completed and present in the output ring slots
 *
 * @baseaddr   Job Ring Base Address
 */
uint32_t caam_hal_jr_get_nbjob_done(vaddr_t baseaddr);

/*
 * Removes a job from the job ring output queue
 *
 * @baseaddr   Job Ring Base Address
 */
void caam_hal_jr_del_job(vaddr_t baseaddr);

/*
 * Disable and acknwoledge the Job Ring interrupt
 *
 * @baseaddr   Job Ring Base Address
 */
void caam_hal_jr_disable_itr(vaddr_t baseaddr);

/*
 * Enable the Job Ring interrupt
 *
 * @baseaddr   Job Ring Base Address
 */
void caam_hal_jr_enable_itr(vaddr_t baseaddr);

/*
 * If an interrupt is pending, acknowledges it and returns true.
 *
 * @baseaddr   Job Ring Base Address
 */
bool caam_hal_jr_check_ack_itr(vaddr_t baseaddr);

/*
 * Halt the Job Ring processing. Stop fetching input queue and wait
 * all running jobs normal completion.
 *
 * @baseaddr   Job Ring Base Address
 */
enum caam_status caam_hal_jr_halt(vaddr_t baseaddr);

/*
 * Wait all Input queue Job Ring processing.
 *
 * @baseaddr   Job Ring Base Address
 */
enum caam_status caam_hal_jr_flush(vaddr_t baseaddr);

/*
 * Resume the Job Ring processing.
 *
 * @baseaddr   Job Ring Base Address
 */
void caam_hal_jr_resume(vaddr_t baseaddr);

/*
 * Returns the next entry free in the JR input queue.
 * The HW increments register by 4. Convert it to a software index number
 *
 * @baseaddr   CAAM JR Base Address
 */
uint8_t caam_hal_jr_input_index(vaddr_t baseaddr);

/*
 * Returns the next entry to read from the JR output queue.
 * The HW increments register by 8. Convert it to a software index number
 *
 * @baseaddr   CAAM JR Base Address
 */
uint8_t caam_hal_jr_output_index(vaddr_t baseaddr);

/*
 * Let the JR prepare data that need backup
 *
 * @ctrl_base   CAAM JR Base Address
 * @jr_offset   Job Ring offset to prepare backup for
 */
void caam_hal_jr_prepare_backup(vaddr_t ctrl_base, paddr_t jr_offset);

#endif /* __CAAM_HAL_JR_H__ */
