#ifndef ISP2401
/*
 * 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.
 */
#else
/**
Support for Intel Camera Imaging ISP subsystem.
Copyright (c) 2010 - 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.
*/
#endif

#ifndef _IA_CSS_ISP_PARAM_H_
#define _IA_CSS_ISP_PARAM_H_

#include <ia_css_err.h>
#include "ia_css_isp_param_types.h"

/* Set functions for parameter memory descriptors */
void
ia_css_isp_param_set_mem_init(
	struct ia_css_isp_param_host_segments *mem_init,
	enum ia_css_param_class pclass,
	enum ia_css_isp_memories mem,
	char *address, size_t size);

void
ia_css_isp_param_set_css_mem_init(
	struct ia_css_isp_param_css_segments *mem_init,
	enum ia_css_param_class pclass,
	enum ia_css_isp_memories mem,
	hrt_vaddress address, size_t size);

void
ia_css_isp_param_set_isp_mem_init(
	struct ia_css_isp_param_isp_segments *mem_init,
	enum ia_css_param_class pclass,
	enum ia_css_isp_memories mem,
	uint32_t address, size_t size);

/* Get functions for parameter memory descriptors */
const struct ia_css_host_data*
ia_css_isp_param_get_mem_init(
	const struct ia_css_isp_param_host_segments *mem_init,
	enum ia_css_param_class pclass,
	enum ia_css_isp_memories mem);

const struct ia_css_data*
ia_css_isp_param_get_css_mem_init(
	const struct ia_css_isp_param_css_segments *mem_init,
	enum ia_css_param_class pclass,
	enum ia_css_isp_memories mem);

const struct ia_css_isp_data*
ia_css_isp_param_get_isp_mem_init(
	const struct ia_css_isp_param_isp_segments *mem_init,
	enum ia_css_param_class pclass,
	enum ia_css_isp_memories mem);

/* Initialize the memory interface sizes and addresses */
void
ia_css_init_memory_interface(
	struct ia_css_isp_param_css_segments *isp_mem_if,
	const struct ia_css_isp_param_host_segments *mem_params,
	const struct ia_css_isp_param_css_segments *css_params);

/* Allocate memory parameters */
enum ia_css_err
ia_css_isp_param_allocate_isp_parameters(
	struct ia_css_isp_param_host_segments *mem_params,
	struct ia_css_isp_param_css_segments *css_params,
	const struct ia_css_isp_param_isp_segments *mem_initializers);

/* Destroy memory parameters */
void
ia_css_isp_param_destroy_isp_parameters(
	struct ia_css_isp_param_host_segments *mem_params,
	struct ia_css_isp_param_css_segments *css_params);

/* Load fw parameters */
void
ia_css_isp_param_load_fw_params(
	const char *fw,
	union ia_css_all_memory_offsets *mem_offsets,
	const struct ia_css_isp_param_memory_offsets *memory_offsets,
	bool init);

/* Copy host parameter images to ddr */
enum ia_css_err
ia_css_isp_param_copy_isp_mem_if_to_ddr(
	struct ia_css_isp_param_css_segments *ddr,
	const struct ia_css_isp_param_host_segments *host,
	enum ia_css_param_class pclass);

/* Enable a pipeline by setting the control field in the isp dmem parameters */
void
ia_css_isp_param_enable_pipeline(
	const struct ia_css_isp_param_host_segments *mem_params);

#endif /* _IA_CSS_ISP_PARAM_H_ */
