/* SPDX-License-Identifier: GPL-2.0 */
/*
 * Support for Intel Camera Imaging ISP subsystem.
 * Copyright (c) 2015, Intel Corporation.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms and conditions of the GNU General Public License,
 * version 2, as published by the Free Software Foundation.
 *
 * This program is distributed in the hope 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.
 */

#ifndef __EVENT_FIFO_PRIVATE_H
#define __EVENT_FIFO_PRIVATE_H

#include "event_fifo_public.h"

#include "device_access.h"

#include "assert_support.h"

#include <bits.h>			/* _hrt_get_bits() */

STORAGE_CLASS_EVENT_C void event_wait_for(const event_ID_t ID)
{
	assert(ID < N_EVENT_ID);
	assert(event_source_addr[ID] != ((hrt_address) - 1));
	(void)ia_css_device_load_uint32(event_source_addr[ID]);
	return;
}

STORAGE_CLASS_EVENT_C void cnd_event_wait_for(const event_ID_t ID,
	const bool cnd)
{
	if (cnd) {
		event_wait_for(ID);
	}
}

STORAGE_CLASS_EVENT_C hrt_data event_receive_token(const event_ID_t ID)
{
	assert(ID < N_EVENT_ID);
	assert(event_source_addr[ID] != ((hrt_address) - 1));
	return ia_css_device_load_uint32(event_source_addr[ID]);
}

STORAGE_CLASS_EVENT_C void event_send_token(const event_ID_t ID,
	const hrt_data token)
{
	assert(ID < N_EVENT_ID);
	assert(event_sink_addr[ID] != ((hrt_address) - 1));
	ia_css_device_store_uint32(event_sink_addr[ID], token);
}

STORAGE_CLASS_EVENT_C bool is_event_pending(const event_ID_t ID)
{
	hrt_data	value;

	assert(ID < N_EVENT_ID);
	assert(event_source_query_addr[ID] != ((hrt_address) - 1));
	value = ia_css_device_load_uint32(event_source_query_addr[ID]);
	return !_hrt_get_bit(value, EVENT_QUERY_BIT);
}

STORAGE_CLASS_EVENT_C bool can_event_send_token(const event_ID_t ID)
{
	hrt_data	value;

	assert(ID < N_EVENT_ID);
	assert(event_sink_query_addr[ID] != ((hrt_address) - 1));
	value = ia_css_device_load_uint32(event_sink_query_addr[ID]);
	return !_hrt_get_bit(value, EVENT_QUERY_BIT);
}

#endif /* __EVENT_FIFO_PRIVATE_H */
