/*
 * 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.
 */

#define IA_CSS_INCLUDE_PARAMETERS
#include "sh_css_params.h"
#include "isp/kernels/aa/aa_2/ia_css_aa2.host.h"
#include "isp/kernels/anr/anr_1.0/ia_css_anr.host.h"
#include "isp/kernels/anr/anr_2/ia_css_anr2.host.h"
#include "isp/kernels/bh/bh_2/ia_css_bh.host.h"
#include "isp/kernels/bnr/bnr_1.0/ia_css_bnr.host.h"
#include "isp/kernels/bnr/bnr2_2/ia_css_bnr2_2.host.h"
#include "isp/kernels/cnr/cnr_2/ia_css_cnr2.host.h"
#include "isp/kernels/crop/crop_1.0/ia_css_crop.host.h"
#include "isp/kernels/csc/csc_1.0/ia_css_csc.host.h"
#include "isp/kernels/ctc/ctc_1.0/ia_css_ctc.host.h"
#include "isp/kernels/ctc/ctc1_5/ia_css_ctc1_5.host.h"
#include "isp/kernels/ctc/ctc2/ia_css_ctc2.host.h"
#include "isp/kernels/de/de_1.0/ia_css_de.host.h"
#include "isp/kernels/de/de_2/ia_css_de2.host.h"
#include "isp/kernels/dp/dp_1.0/ia_css_dp.host.h"
#include "isp/kernels/fixedbds/fixedbds_1.0/ia_css_fixedbds_param.h"
#include "isp/kernels/fpn/fpn_1.0/ia_css_fpn.host.h"
#include "isp/kernels/gc/gc_1.0/ia_css_gc.host.h"
#include "isp/kernels/gc/gc_2/ia_css_gc2.host.h"
#include "isp/kernels/macc/macc_1.0/ia_css_macc.host.h"
#include "isp/kernels/macc/macc1_5/ia_css_macc1_5.host.h"
#include "isp/kernels/ob/ob_1.0/ia_css_ob.host.h"
#include "isp/kernels/ob/ob2/ia_css_ob2.host.h"
#include "isp/kernels/output/output_1.0/ia_css_output.host.h"
#include "isp/kernels/raw_aa_binning/raw_aa_binning_1.0/ia_css_raa.host.h"
#include "isp/kernels/s3a/s3a_1.0/ia_css_s3a.host.h"
#include "isp/kernels/sc/sc_1.0/ia_css_sc.host.h"
#include "isp/kernels/sdis/sdis_1.0/ia_css_sdis.host.h"
#include "isp/kernels/sdis/sdis_2/ia_css_sdis2.host.h"
#include "isp/kernels/tnr/tnr_1.0/ia_css_tnr.host.h"
#include "isp/kernels/uds/uds_1.0/ia_css_uds_param.h"
#include "isp/kernels/wb/wb_1.0/ia_css_wb.host.h"
#include "isp/kernels/xnr/xnr_1.0/ia_css_xnr.host.h"
#include "isp/kernels/xnr/xnr_3.0/ia_css_xnr3.host.h"
#include "isp/kernels/ynr/ynr_1.0/ia_css_ynr.host.h"
#include "isp/kernels/ynr/ynr_2/ia_css_ynr2.host.h"
#include "isp/kernels/fc/fc_1.0/ia_css_formats.host.h"
#include "isp/kernels/tdf/tdf_1.0/ia_css_tdf.host.h"
#include "isp/kernels/dpc2/ia_css_dpc2.host.h"
#include "isp/kernels/eed1_8/ia_css_eed1_8.host.h"
#include "isp/kernels/bnlm/ia_css_bnlm.host.h"
#include "isp/kernels/conversion/conversion_1.0/ia_css_conversion.host.h"
/* Generated code: do not edit or commmit. */

#include "ia_css_pipeline.h"
#include "ia_css_isp_params.h"
#include "ia_css_debug.h"
#include "assert_support.h"

/* Code generated by genparam/gencode.c:gen_process_function() */

static void
ia_css_process_aa(
	unsigned pipe_id,
	const struct ia_css_pipeline_stage *stage,
	struct ia_css_isp_parameters *params)
{
	unsigned size   = stage->binary->info->mem_offsets.offsets.param->dmem.aa.size;
	unsigned offset = stage->binary->info->mem_offsets.offsets.param->dmem.aa.offset;

	if (size) {
		struct sh_css_isp_aa_params *t =  (struct sh_css_isp_aa_params *)
			&stage->binary->mem_params.params[IA_CSS_PARAM_CLASS_PARAM][IA_CSS_ISP_DMEM].address[offset];
		t->strength = params->aa_config.strength;
	}
}

/* Code generated by genparam/gencode.c:gen_process_function() */

static void
ia_css_process_anr(
	unsigned pipe_id,
	const struct ia_css_pipeline_stage *stage,
	struct ia_css_isp_parameters *params)
{
	assert(params != NULL);

	{
		unsigned size   = stage->binary->info->mem_offsets.offsets.param->dmem.anr.size;

		unsigned offset = stage->binary->info->mem_offsets.offsets.param->dmem.anr.offset;

		if (size) {
			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_anr() enter:\n");

			ia_css_anr_encode((struct sh_css_isp_anr_params *)
					&stage->binary->mem_params.params[IA_CSS_PARAM_CLASS_PARAM][IA_CSS_ISP_DMEM].address[offset],
					&params->anr_config,
size);
			params->isp_params_changed = true;
			params->isp_mem_params_changed[pipe_id][stage->stage_num][IA_CSS_ISP_DMEM] = true;

			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_anr() leave:\n");
		}

	}
}

/* Code generated by genparam/gencode.c:gen_process_function() */

static void
ia_css_process_anr2(
	unsigned pipe_id,
	const struct ia_css_pipeline_stage *stage,
	struct ia_css_isp_parameters *params)
{
	assert(params != NULL);

	{
		unsigned size   = stage->binary->info->mem_offsets.offsets.param->vmem.anr2.size;

		unsigned offset = stage->binary->info->mem_offsets.offsets.param->vmem.anr2.offset;

		if (size) {
			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_anr2() enter:\n");

			ia_css_anr2_vmem_encode((struct ia_css_isp_anr2_params *)
					&stage->binary->mem_params.params[IA_CSS_PARAM_CLASS_PARAM][IA_CSS_ISP_VMEM].address[offset],
					&params->anr_thres,
size);
			params->isp_params_changed = true;
			params->isp_mem_params_changed[pipe_id][stage->stage_num][IA_CSS_ISP_VMEM] = true;

			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_anr2() leave:\n");
		}

	}
}

/* Code generated by genparam/gencode.c:gen_process_function() */

static void
ia_css_process_bh(
	unsigned pipe_id,
	const struct ia_css_pipeline_stage *stage,
	struct ia_css_isp_parameters *params)
{
	assert(params != NULL);

	{
		unsigned size   = stage->binary->info->mem_offsets.offsets.param->dmem.bh.size;

		unsigned offset = stage->binary->info->mem_offsets.offsets.param->dmem.bh.offset;

		if (size) {
			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_bh() enter:\n");

			ia_css_bh_encode((struct sh_css_isp_bh_params *)
					&stage->binary->mem_params.params[IA_CSS_PARAM_CLASS_PARAM][IA_CSS_ISP_DMEM].address[offset],
					&params->s3a_config,
size);
			params->isp_params_changed = true;
			params->isp_mem_params_changed[pipe_id][stage->stage_num][IA_CSS_ISP_DMEM] = true;

			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_bh() leave:\n");
		}

	}
	{
		unsigned size   = stage->binary->info->mem_offsets.offsets.param->hmem0.bh.size;

		if (size) {
			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_bh() enter:\n");

			params->isp_params_changed = true;
			params->isp_mem_params_changed[pipe_id][stage->stage_num][IA_CSS_ISP_HMEM0] = true;

			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_bh() leave:\n");
		}

	}
}

/* Code generated by genparam/gencode.c:gen_process_function() */

static void
ia_css_process_cnr(
	unsigned pipe_id,
	const struct ia_css_pipeline_stage *stage,
	struct ia_css_isp_parameters *params)
{
	assert(params != NULL);

	{
		unsigned size   = stage->binary->info->mem_offsets.offsets.param->dmem.cnr.size;

		unsigned offset = stage->binary->info->mem_offsets.offsets.param->dmem.cnr.offset;

		if (size) {
			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_cnr() enter:\n");

			ia_css_cnr_encode((struct sh_css_isp_cnr_params *)
					&stage->binary->mem_params.params[IA_CSS_PARAM_CLASS_PARAM][IA_CSS_ISP_DMEM].address[offset],
					&params->cnr_config,
size);
			params->isp_params_changed = true;
			params->isp_mem_params_changed[pipe_id][stage->stage_num][IA_CSS_ISP_DMEM] = true;

			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_cnr() leave:\n");
		}

	}
}

/* Code generated by genparam/gencode.c:gen_process_function() */

static void
ia_css_process_crop(
	unsigned pipe_id,
	const struct ia_css_pipeline_stage *stage,
	struct ia_css_isp_parameters *params)
{
	assert(params != NULL);

	{
		unsigned size   = stage->binary->info->mem_offsets.offsets.param->dmem.crop.size;

		unsigned offset = stage->binary->info->mem_offsets.offsets.param->dmem.crop.offset;

		if (size) {
			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_crop() enter:\n");

			ia_css_crop_encode((struct sh_css_isp_crop_isp_params *)
					&stage->binary->mem_params.params[IA_CSS_PARAM_CLASS_PARAM][IA_CSS_ISP_DMEM].address[offset],
					&params->crop_config,
size);
			params->isp_params_changed = true;
			params->isp_mem_params_changed[pipe_id][stage->stage_num][IA_CSS_ISP_DMEM] = true;

			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_crop() leave:\n");
		}

	}
}

/* Code generated by genparam/gencode.c:gen_process_function() */

static void
ia_css_process_csc(
	unsigned pipe_id,
	const struct ia_css_pipeline_stage *stage,
	struct ia_css_isp_parameters *params)
{
	assert(params != NULL);

	{
		unsigned size   = stage->binary->info->mem_offsets.offsets.param->dmem.csc.size;

		unsigned offset = stage->binary->info->mem_offsets.offsets.param->dmem.csc.offset;

		if (size) {
			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_csc() enter:\n");

			ia_css_csc_encode((struct sh_css_isp_csc_params *)
					&stage->binary->mem_params.params[IA_CSS_PARAM_CLASS_PARAM][IA_CSS_ISP_DMEM].address[offset],
					&params->cc_config,
size);
			params->isp_params_changed = true;
			params->isp_mem_params_changed[pipe_id][stage->stage_num][IA_CSS_ISP_DMEM] = true;

			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_csc() leave:\n");
		}

	}
}

/* Code generated by genparam/gencode.c:gen_process_function() */

static void
ia_css_process_dp(
	unsigned pipe_id,
	const struct ia_css_pipeline_stage *stage,
	struct ia_css_isp_parameters *params)
{
	assert(params != NULL);

	{
		unsigned size   = stage->binary->info->mem_offsets.offsets.param->dmem.dp.size;

		unsigned offset = stage->binary->info->mem_offsets.offsets.param->dmem.dp.offset;

		if (size) {
			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_dp() enter:\n");

			ia_css_dp_encode((struct sh_css_isp_dp_params *)
					&stage->binary->mem_params.params[IA_CSS_PARAM_CLASS_PARAM][IA_CSS_ISP_DMEM].address[offset],
					&params->dp_config,
size);
			params->isp_params_changed = true;
			params->isp_mem_params_changed[pipe_id][stage->stage_num][IA_CSS_ISP_DMEM] = true;

			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_dp() leave:\n");
		}

	}
}

/* Code generated by genparam/gencode.c:gen_process_function() */

static void
ia_css_process_bnr(
	unsigned pipe_id,
	const struct ia_css_pipeline_stage *stage,
	struct ia_css_isp_parameters *params)
{
	assert(params != NULL);

	{
		unsigned size   = stage->binary->info->mem_offsets.offsets.param->dmem.bnr.size;

		unsigned offset = stage->binary->info->mem_offsets.offsets.param->dmem.bnr.offset;

		if (size) {
			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_bnr() enter:\n");

			ia_css_bnr_encode((struct sh_css_isp_bnr_params *)
					&stage->binary->mem_params.params[IA_CSS_PARAM_CLASS_PARAM][IA_CSS_ISP_DMEM].address[offset],
					&params->nr_config,
size);
			params->isp_params_changed = true;
			params->isp_mem_params_changed[pipe_id][stage->stage_num][IA_CSS_ISP_DMEM] = true;

			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_bnr() leave:\n");
		}

	}
}

/* Code generated by genparam/gencode.c:gen_process_function() */

static void
ia_css_process_de(
	unsigned pipe_id,
	const struct ia_css_pipeline_stage *stage,
	struct ia_css_isp_parameters *params)
{
	assert(params != NULL);

	{
		unsigned size   = stage->binary->info->mem_offsets.offsets.param->dmem.de.size;

		unsigned offset = stage->binary->info->mem_offsets.offsets.param->dmem.de.offset;

		if (size) {
			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_de() enter:\n");

			ia_css_de_encode((struct sh_css_isp_de_params *)
					&stage->binary->mem_params.params[IA_CSS_PARAM_CLASS_PARAM][IA_CSS_ISP_DMEM].address[offset],
					&params->de_config,
size);
			params->isp_params_changed = true;
			params->isp_mem_params_changed[pipe_id][stage->stage_num][IA_CSS_ISP_DMEM] = true;

			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_de() leave:\n");
		}

	}
}

/* Code generated by genparam/gencode.c:gen_process_function() */

static void
ia_css_process_ecd(
	unsigned pipe_id,
	const struct ia_css_pipeline_stage *stage,
	struct ia_css_isp_parameters *params)
{
	assert(params != NULL);

	{
		unsigned size   = stage->binary->info->mem_offsets.offsets.param->dmem.ecd.size;

		unsigned offset = stage->binary->info->mem_offsets.offsets.param->dmem.ecd.offset;

		if (size) {
			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_ecd() enter:\n");

			ia_css_ecd_encode((struct sh_css_isp_ecd_params *)
					&stage->binary->mem_params.params[IA_CSS_PARAM_CLASS_PARAM][IA_CSS_ISP_DMEM].address[offset],
					&params->ecd_config,
size);
			params->isp_params_changed = true;
			params->isp_mem_params_changed[pipe_id][stage->stage_num][IA_CSS_ISP_DMEM] = true;

			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_ecd() leave:\n");
		}

	}
}

/* Code generated by genparam/gencode.c:gen_process_function() */

static void
ia_css_process_formats(
	unsigned pipe_id,
	const struct ia_css_pipeline_stage *stage,
	struct ia_css_isp_parameters *params)
{
	assert(params != NULL);

	{
		unsigned size   = stage->binary->info->mem_offsets.offsets.param->dmem.formats.size;

		unsigned offset = stage->binary->info->mem_offsets.offsets.param->dmem.formats.offset;

		if (size) {
			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_formats() enter:\n");

			ia_css_formats_encode((struct sh_css_isp_formats_params *)
					&stage->binary->mem_params.params[IA_CSS_PARAM_CLASS_PARAM][IA_CSS_ISP_DMEM].address[offset],
					&params->formats_config,
size);
			params->isp_params_changed = true;
			params->isp_mem_params_changed[pipe_id][stage->stage_num][IA_CSS_ISP_DMEM] = true;

			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_formats() leave:\n");
		}

	}
}

/* Code generated by genparam/gencode.c:gen_process_function() */

static void
ia_css_process_fpn(
	unsigned pipe_id,
	const struct ia_css_pipeline_stage *stage,
	struct ia_css_isp_parameters *params)
{
	assert(params != NULL);

	{
		unsigned size   = stage->binary->info->mem_offsets.offsets.param->dmem.fpn.size;

		unsigned offset = stage->binary->info->mem_offsets.offsets.param->dmem.fpn.offset;

		if (size) {
			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_fpn() enter:\n");

			ia_css_fpn_encode((struct sh_css_isp_fpn_params *)
					&stage->binary->mem_params.params[IA_CSS_PARAM_CLASS_PARAM][IA_CSS_ISP_DMEM].address[offset],
					&params->fpn_config,
size);
			params->isp_params_changed = true;
			params->isp_mem_params_changed[pipe_id][stage->stage_num][IA_CSS_ISP_DMEM] = true;

			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_fpn() leave:\n");
		}

	}
}

/* Code generated by genparam/gencode.c:gen_process_function() */

static void
ia_css_process_gc(
	unsigned pipe_id,
	const struct ia_css_pipeline_stage *stage,
	struct ia_css_isp_parameters *params)
{
	assert(params != NULL);

	{
		unsigned size   = stage->binary->info->mem_offsets.offsets.param->dmem.gc.size;

		unsigned offset = stage->binary->info->mem_offsets.offsets.param->dmem.gc.offset;

		if (size) {
			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_gc() enter:\n");

			ia_css_gc_encode((struct sh_css_isp_gc_params *)
					&stage->binary->mem_params.params[IA_CSS_PARAM_CLASS_PARAM][IA_CSS_ISP_DMEM].address[offset],
					&params->gc_config,
size);
			params->isp_params_changed = true;
			params->isp_mem_params_changed[pipe_id][stage->stage_num][IA_CSS_ISP_DMEM] = true;

			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_gc() leave:\n");
		}

	}
	{
		unsigned size   = stage->binary->info->mem_offsets.offsets.param->vamem1.gc.size;

		unsigned offset = stage->binary->info->mem_offsets.offsets.param->vamem1.gc.offset;

		if (size) {
			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_gc() enter:\n");

			ia_css_gc_vamem_encode((struct sh_css_isp_gc_vamem_params *)
					&stage->binary->mem_params.params[IA_CSS_PARAM_CLASS_PARAM][IA_CSS_ISP_VAMEM1].address[offset],
					&params->gc_table,
size);
			params->isp_params_changed = true;
			params->isp_mem_params_changed[pipe_id][stage->stage_num][IA_CSS_ISP_VAMEM1] = true;

			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_gc() leave:\n");
		}

	}
}

/* Code generated by genparam/gencode.c:gen_process_function() */

static void
ia_css_process_ce(
	unsigned pipe_id,
	const struct ia_css_pipeline_stage *stage,
	struct ia_css_isp_parameters *params)
{
	assert(params != NULL);

	{
		unsigned size   = stage->binary->info->mem_offsets.offsets.param->dmem.ce.size;

		unsigned offset = stage->binary->info->mem_offsets.offsets.param->dmem.ce.offset;

		if (size) {
			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_ce() enter:\n");

			ia_css_ce_encode((struct sh_css_isp_ce_params *)
					&stage->binary->mem_params.params[IA_CSS_PARAM_CLASS_PARAM][IA_CSS_ISP_DMEM].address[offset],
					&params->ce_config,
size);
			params->isp_params_changed = true;
			params->isp_mem_params_changed[pipe_id][stage->stage_num][IA_CSS_ISP_DMEM] = true;

			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_ce() leave:\n");
		}

	}
}

/* Code generated by genparam/gencode.c:gen_process_function() */

static void
ia_css_process_yuv2rgb(
	unsigned pipe_id,
	const struct ia_css_pipeline_stage *stage,
	struct ia_css_isp_parameters *params)
{
	assert(params != NULL);

	{
		unsigned size   = stage->binary->info->mem_offsets.offsets.param->dmem.yuv2rgb.size;

		unsigned offset = stage->binary->info->mem_offsets.offsets.param->dmem.yuv2rgb.offset;

		if (size) {
			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_yuv2rgb() enter:\n");

			ia_css_yuv2rgb_encode((struct sh_css_isp_csc_params *)
					&stage->binary->mem_params.params[IA_CSS_PARAM_CLASS_PARAM][IA_CSS_ISP_DMEM].address[offset],
					&params->yuv2rgb_cc_config,
size);
			params->isp_params_changed = true;
			params->isp_mem_params_changed[pipe_id][stage->stage_num][IA_CSS_ISP_DMEM] = true;

			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_yuv2rgb() leave:\n");
		}

	}
}

/* Code generated by genparam/gencode.c:gen_process_function() */

static void
ia_css_process_rgb2yuv(
	unsigned pipe_id,
	const struct ia_css_pipeline_stage *stage,
	struct ia_css_isp_parameters *params)
{
	assert(params != NULL);

	{
		unsigned size   = stage->binary->info->mem_offsets.offsets.param->dmem.rgb2yuv.size;

		unsigned offset = stage->binary->info->mem_offsets.offsets.param->dmem.rgb2yuv.offset;

		if (size) {
			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_rgb2yuv() enter:\n");

			ia_css_rgb2yuv_encode((struct sh_css_isp_csc_params *)
					&stage->binary->mem_params.params[IA_CSS_PARAM_CLASS_PARAM][IA_CSS_ISP_DMEM].address[offset],
					&params->rgb2yuv_cc_config,
size);
			params->isp_params_changed = true;
			params->isp_mem_params_changed[pipe_id][stage->stage_num][IA_CSS_ISP_DMEM] = true;

			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_rgb2yuv() leave:\n");
		}

	}
}

/* Code generated by genparam/gencode.c:gen_process_function() */

static void
ia_css_process_r_gamma(
	unsigned pipe_id,
	const struct ia_css_pipeline_stage *stage,
	struct ia_css_isp_parameters *params)
{
	assert(params != NULL);

	{
		unsigned size   = stage->binary->info->mem_offsets.offsets.param->vamem0.r_gamma.size;

		unsigned offset = stage->binary->info->mem_offsets.offsets.param->vamem0.r_gamma.offset;

		if (size) {
			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_r_gamma() enter:\n");

			ia_css_r_gamma_vamem_encode((struct sh_css_isp_rgb_gamma_vamem_params *)
					&stage->binary->mem_params.params[IA_CSS_PARAM_CLASS_PARAM][IA_CSS_ISP_VAMEM0].address[offset],
					&params->r_gamma_table,
size);
			params->isp_params_changed = true;
			params->isp_mem_params_changed[pipe_id][stage->stage_num][IA_CSS_ISP_VAMEM0] = true;

			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_r_gamma() leave:\n");
		}

	}
}

/* Code generated by genparam/gencode.c:gen_process_function() */

static void
ia_css_process_g_gamma(
	unsigned pipe_id,
	const struct ia_css_pipeline_stage *stage,
	struct ia_css_isp_parameters *params)
{
	assert(params != NULL);

	{
		unsigned size   = stage->binary->info->mem_offsets.offsets.param->vamem1.g_gamma.size;

		unsigned offset = stage->binary->info->mem_offsets.offsets.param->vamem1.g_gamma.offset;

		if (size) {
			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_g_gamma() enter:\n");

			ia_css_g_gamma_vamem_encode((struct sh_css_isp_rgb_gamma_vamem_params *)
					&stage->binary->mem_params.params[IA_CSS_PARAM_CLASS_PARAM][IA_CSS_ISP_VAMEM1].address[offset],
					&params->g_gamma_table,
size);
			params->isp_params_changed = true;
			params->isp_mem_params_changed[pipe_id][stage->stage_num][IA_CSS_ISP_VAMEM1] = true;

			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_g_gamma() leave:\n");
		}

	}
}

/* Code generated by genparam/gencode.c:gen_process_function() */

static void
ia_css_process_b_gamma(
	unsigned pipe_id,
	const struct ia_css_pipeline_stage *stage,
	struct ia_css_isp_parameters *params)
{
	assert(params != NULL);

	{
		unsigned size   = stage->binary->info->mem_offsets.offsets.param->vamem2.b_gamma.size;

		unsigned offset = stage->binary->info->mem_offsets.offsets.param->vamem2.b_gamma.offset;

		if (size) {
			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_b_gamma() enter:\n");

			ia_css_b_gamma_vamem_encode((struct sh_css_isp_rgb_gamma_vamem_params *)
					&stage->binary->mem_params.params[IA_CSS_PARAM_CLASS_PARAM][IA_CSS_ISP_VAMEM2].address[offset],
					&params->b_gamma_table,
size);
			params->isp_params_changed = true;
			params->isp_mem_params_changed[pipe_id][stage->stage_num][IA_CSS_ISP_VAMEM2] = true;

			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_b_gamma() leave:\n");
		}

	}
}

/* Code generated by genparam/gencode.c:gen_process_function() */

static void
ia_css_process_uds(
	unsigned pipe_id,
	const struct ia_css_pipeline_stage *stage,
	struct ia_css_isp_parameters *params)
{
	assert(params != NULL);

	{
		unsigned size   = stage->binary->info->mem_offsets.offsets.param->dmem.uds.size;

		unsigned offset = stage->binary->info->mem_offsets.offsets.param->dmem.uds.offset;

		if (size) {
			struct sh_css_sp_uds_params *p;
			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_uds() enter:\n");

			p = (struct sh_css_sp_uds_params *)
				&stage->binary->mem_params.params[IA_CSS_PARAM_CLASS_PARAM][IA_CSS_ISP_DMEM].address[offset];
			p->crop_pos = params->uds_config.crop_pos;
			p->uds = params->uds_config.uds;

			params->isp_params_changed = true;
			params->isp_mem_params_changed[pipe_id][stage->stage_num][IA_CSS_ISP_DMEM] = true;

			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_uds() leave:\n");
		}

	}
}

/* Code generated by genparam/gencode.c:gen_process_function() */

static void
ia_css_process_raa(
	unsigned pipe_id,
	const struct ia_css_pipeline_stage *stage,
	struct ia_css_isp_parameters *params)
{
	assert(params != NULL);

	{
		unsigned size   = stage->binary->info->mem_offsets.offsets.param->dmem.raa.size;

		unsigned offset = stage->binary->info->mem_offsets.offsets.param->dmem.raa.offset;

		if (size) {
			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_raa() enter:\n");

			ia_css_raa_encode((struct sh_css_isp_aa_params *)
					&stage->binary->mem_params.params[IA_CSS_PARAM_CLASS_PARAM][IA_CSS_ISP_DMEM].address[offset],
					&params->raa_config,
size);
			params->isp_params_changed = true;
			params->isp_mem_params_changed[pipe_id][stage->stage_num][IA_CSS_ISP_DMEM] = true;

			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_raa() leave:\n");
		}

	}
}

/* Code generated by genparam/gencode.c:gen_process_function() */

static void
ia_css_process_s3a(
	unsigned pipe_id,
	const struct ia_css_pipeline_stage *stage,
	struct ia_css_isp_parameters *params)
{
	assert(params != NULL);

	{
		unsigned size   = stage->binary->info->mem_offsets.offsets.param->dmem.s3a.size;

		unsigned offset = stage->binary->info->mem_offsets.offsets.param->dmem.s3a.offset;

		if (size) {
			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_s3a() enter:\n");

			ia_css_s3a_encode((struct sh_css_isp_s3a_params *)
					&stage->binary->mem_params.params[IA_CSS_PARAM_CLASS_PARAM][IA_CSS_ISP_DMEM].address[offset],
					&params->s3a_config,
size);
			params->isp_params_changed = true;
			params->isp_mem_params_changed[pipe_id][stage->stage_num][IA_CSS_ISP_DMEM] = true;

			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_s3a() leave:\n");
		}

	}
}

/* Code generated by genparam/gencode.c:gen_process_function() */

static void
ia_css_process_ob(
	unsigned pipe_id,
	const struct ia_css_pipeline_stage *stage,
	struct ia_css_isp_parameters *params)
{
	assert(params != NULL);

	{
		unsigned size   = stage->binary->info->mem_offsets.offsets.param->dmem.ob.size;

		unsigned offset = stage->binary->info->mem_offsets.offsets.param->dmem.ob.offset;

		if (size) {
			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_ob() enter:\n");

			ia_css_ob_encode((struct sh_css_isp_ob_params *)
					&stage->binary->mem_params.params[IA_CSS_PARAM_CLASS_PARAM][IA_CSS_ISP_DMEM].address[offset],
					&params->ob_config,
&params->stream_configs.ob, size);
			params->isp_params_changed = true;
			params->isp_mem_params_changed[pipe_id][stage->stage_num][IA_CSS_ISP_DMEM] = true;

			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_ob() leave:\n");
		}

	}
	{
		unsigned size   = stage->binary->info->mem_offsets.offsets.param->vmem.ob.size;

		unsigned offset = stage->binary->info->mem_offsets.offsets.param->vmem.ob.offset;

		if (size) {
			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_ob() enter:\n");

			ia_css_ob_vmem_encode((struct sh_css_isp_ob_vmem_params *)
					&stage->binary->mem_params.params[IA_CSS_PARAM_CLASS_PARAM][IA_CSS_ISP_VMEM].address[offset],
					&params->ob_config,
&params->stream_configs.ob, size);
			params->isp_params_changed = true;
			params->isp_mem_params_changed[pipe_id][stage->stage_num][IA_CSS_ISP_VMEM] = true;

			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_ob() leave:\n");
		}

	}
}

/* Code generated by genparam/gencode.c:gen_process_function() */

static void
ia_css_process_output(
	unsigned pipe_id,
	const struct ia_css_pipeline_stage *stage,
	struct ia_css_isp_parameters *params)
{
	assert(params != NULL);

	{
		unsigned size   = stage->binary->info->mem_offsets.offsets.param->dmem.output.size;

		unsigned offset = stage->binary->info->mem_offsets.offsets.param->dmem.output.offset;

		if (size) {
			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_output() enter:\n");

			ia_css_output_encode((struct sh_css_isp_output_params *)
					&stage->binary->mem_params.params[IA_CSS_PARAM_CLASS_PARAM][IA_CSS_ISP_DMEM].address[offset],
					&params->output_config,
size);
			params->isp_params_changed = true;
			params->isp_mem_params_changed[pipe_id][stage->stage_num][IA_CSS_ISP_DMEM] = true;

			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_output() leave:\n");
		}

	}
}

/* Code generated by genparam/gencode.c:gen_process_function() */

static void
ia_css_process_sc(
	unsigned pipe_id,
	const struct ia_css_pipeline_stage *stage,
	struct ia_css_isp_parameters *params)
{
	assert(params != NULL);

	{
		unsigned size   = stage->binary->info->mem_offsets.offsets.param->dmem.sc.size;

		unsigned offset = stage->binary->info->mem_offsets.offsets.param->dmem.sc.offset;

		if (size) {
			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_sc() enter:\n");

			ia_css_sc_encode((struct sh_css_isp_sc_params *)
					&stage->binary->mem_params.params[IA_CSS_PARAM_CLASS_PARAM][IA_CSS_ISP_DMEM].address[offset],
					&params->sc_config,
size);
			params->isp_params_changed = true;
			params->isp_mem_params_changed[pipe_id][stage->stage_num][IA_CSS_ISP_DMEM] = true;

			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_sc() leave:\n");
		}

	}
}

/* Code generated by genparam/gencode.c:gen_process_function() */

static void
ia_css_process_bds(
	unsigned pipe_id,
	const struct ia_css_pipeline_stage *stage,
	struct ia_css_isp_parameters *params)
{
	assert(params != NULL);

	{
		unsigned size   = stage->binary->info->mem_offsets.offsets.param->dmem.bds.size;

		unsigned offset = stage->binary->info->mem_offsets.offsets.param->dmem.bds.offset;

		if (size) {
			struct sh_css_isp_bds_params *p;
			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_bds() enter:\n");

			p = (struct sh_css_isp_bds_params *)
				&stage->binary->mem_params.params[IA_CSS_PARAM_CLASS_PARAM][IA_CSS_ISP_DMEM].address[offset];
			p->baf_strength = params->bds_config.strength;

			params->isp_params_changed = true;
			params->isp_mem_params_changed[pipe_id][stage->stage_num][IA_CSS_ISP_DMEM] = true;

			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_bds() leave:\n");
		}

	}
}

/* Code generated by genparam/gencode.c:gen_process_function() */

static void
ia_css_process_tnr(
	unsigned pipe_id,
	const struct ia_css_pipeline_stage *stage,
	struct ia_css_isp_parameters *params)
{
	assert(params != NULL);

	{
		unsigned size   = stage->binary->info->mem_offsets.offsets.param->dmem.tnr.size;

		unsigned offset = stage->binary->info->mem_offsets.offsets.param->dmem.tnr.offset;

		if (size) {
			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_tnr() enter:\n");

			ia_css_tnr_encode((struct sh_css_isp_tnr_params *)
					&stage->binary->mem_params.params[IA_CSS_PARAM_CLASS_PARAM][IA_CSS_ISP_DMEM].address[offset],
					&params->tnr_config,
size);
			params->isp_params_changed = true;
			params->isp_mem_params_changed[pipe_id][stage->stage_num][IA_CSS_ISP_DMEM] = true;

			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_tnr() leave:\n");
		}

	}
}

/* Code generated by genparam/gencode.c:gen_process_function() */

static void
ia_css_process_macc(
	unsigned pipe_id,
	const struct ia_css_pipeline_stage *stage,
	struct ia_css_isp_parameters *params)
{
	assert(params != NULL);

	{
		unsigned size   = stage->binary->info->mem_offsets.offsets.param->dmem.macc.size;

		unsigned offset = stage->binary->info->mem_offsets.offsets.param->dmem.macc.offset;

		if (size) {
			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_macc() enter:\n");

			ia_css_macc_encode((struct sh_css_isp_macc_params *)
					&stage->binary->mem_params.params[IA_CSS_PARAM_CLASS_PARAM][IA_CSS_ISP_DMEM].address[offset],
					&params->macc_config,
size);
			params->isp_params_changed = true;
			params->isp_mem_params_changed[pipe_id][stage->stage_num][IA_CSS_ISP_DMEM] = true;

			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_macc() leave:\n");
		}

	}
}

/* Code generated by genparam/gencode.c:gen_process_function() */

static void
ia_css_process_sdis_horicoef(
	unsigned pipe_id,
	const struct ia_css_pipeline_stage *stage,
	struct ia_css_isp_parameters *params)
{
	assert(params != NULL);

	{
		unsigned size   = stage->binary->info->mem_offsets.offsets.param->vmem.sdis_horicoef.size;

		unsigned offset = stage->binary->info->mem_offsets.offsets.param->vmem.sdis_horicoef.offset;

		if (size) {
			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_sdis_horicoef() enter:\n");

			ia_css_sdis_horicoef_vmem_encode((struct sh_css_isp_sdis_hori_coef_tbl *)
					&stage->binary->mem_params.params[IA_CSS_PARAM_CLASS_PARAM][IA_CSS_ISP_VMEM].address[offset],
					&params->dvs_coefs,
size);
			params->isp_params_changed = true;
			params->isp_mem_params_changed[pipe_id][stage->stage_num][IA_CSS_ISP_VMEM] = true;

			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_sdis_horicoef() leave:\n");
		}

	}
}

/* Code generated by genparam/gencode.c:gen_process_function() */

static void
ia_css_process_sdis_vertcoef(
	unsigned pipe_id,
	const struct ia_css_pipeline_stage *stage,
	struct ia_css_isp_parameters *params)
{
	assert(params != NULL);

	{
		unsigned size   = stage->binary->info->mem_offsets.offsets.param->vmem.sdis_vertcoef.size;

		unsigned offset = stage->binary->info->mem_offsets.offsets.param->vmem.sdis_vertcoef.offset;

		if (size) {
			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_sdis_vertcoef() enter:\n");

			ia_css_sdis_vertcoef_vmem_encode((struct sh_css_isp_sdis_vert_coef_tbl *)
					&stage->binary->mem_params.params[IA_CSS_PARAM_CLASS_PARAM][IA_CSS_ISP_VMEM].address[offset],
					&params->dvs_coefs,
size);
			params->isp_params_changed = true;
			params->isp_mem_params_changed[pipe_id][stage->stage_num][IA_CSS_ISP_VMEM] = true;

			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_sdis_vertcoef() leave:\n");
		}

	}
}

/* Code generated by genparam/gencode.c:gen_process_function() */

static void
ia_css_process_sdis_horiproj(
	unsigned pipe_id,
	const struct ia_css_pipeline_stage *stage,
	struct ia_css_isp_parameters *params)
{
	assert(params != NULL);

	{
		unsigned size   = stage->binary->info->mem_offsets.offsets.param->dmem.sdis_horiproj.size;

		unsigned offset = stage->binary->info->mem_offsets.offsets.param->dmem.sdis_horiproj.offset;

		if (size) {
			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_sdis_horiproj() enter:\n");

			ia_css_sdis_horiproj_encode((struct sh_css_isp_sdis_hori_proj_tbl *)
					&stage->binary->mem_params.params[IA_CSS_PARAM_CLASS_PARAM][IA_CSS_ISP_DMEM].address[offset],
					&params->dvs_coefs,
size);
			params->isp_params_changed = true;
			params->isp_mem_params_changed[pipe_id][stage->stage_num][IA_CSS_ISP_DMEM] = true;

			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_sdis_horiproj() leave:\n");
		}

	}
}

/* Code generated by genparam/gencode.c:gen_process_function() */

static void
ia_css_process_sdis_vertproj(
	unsigned pipe_id,
	const struct ia_css_pipeline_stage *stage,
	struct ia_css_isp_parameters *params)
{
	assert(params != NULL);

	{
		unsigned size   = stage->binary->info->mem_offsets.offsets.param->dmem.sdis_vertproj.size;

		unsigned offset = stage->binary->info->mem_offsets.offsets.param->dmem.sdis_vertproj.offset;

		if (size) {
			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_sdis_vertproj() enter:\n");

			ia_css_sdis_vertproj_encode((struct sh_css_isp_sdis_vert_proj_tbl *)
					&stage->binary->mem_params.params[IA_CSS_PARAM_CLASS_PARAM][IA_CSS_ISP_DMEM].address[offset],
					&params->dvs_coefs,
size);
			params->isp_params_changed = true;
			params->isp_mem_params_changed[pipe_id][stage->stage_num][IA_CSS_ISP_DMEM] = true;

			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_sdis_vertproj() leave:\n");
		}

	}
}

/* Code generated by genparam/gencode.c:gen_process_function() */

static void
ia_css_process_sdis2_horicoef(
	unsigned pipe_id,
	const struct ia_css_pipeline_stage *stage,
	struct ia_css_isp_parameters *params)
{
	assert(params != NULL);

	{
		unsigned size   = stage->binary->info->mem_offsets.offsets.param->vmem.sdis2_horicoef.size;

		unsigned offset = stage->binary->info->mem_offsets.offsets.param->vmem.sdis2_horicoef.offset;

		if (size) {
			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_sdis2_horicoef() enter:\n");

			ia_css_sdis2_horicoef_vmem_encode((struct sh_css_isp_sdis_hori_coef_tbl *)
					&stage->binary->mem_params.params[IA_CSS_PARAM_CLASS_PARAM][IA_CSS_ISP_VMEM].address[offset],
					&params->dvs2_coefs,
size);
			params->isp_params_changed = true;
			params->isp_mem_params_changed[pipe_id][stage->stage_num][IA_CSS_ISP_VMEM] = true;

			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_sdis2_horicoef() leave:\n");
		}

	}
}

/* Code generated by genparam/gencode.c:gen_process_function() */

static void
ia_css_process_sdis2_vertcoef(
	unsigned pipe_id,
	const struct ia_css_pipeline_stage *stage,
	struct ia_css_isp_parameters *params)
{
	assert(params != NULL);

	{
		unsigned size   = stage->binary->info->mem_offsets.offsets.param->vmem.sdis2_vertcoef.size;

		unsigned offset = stage->binary->info->mem_offsets.offsets.param->vmem.sdis2_vertcoef.offset;

		if (size) {
			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_sdis2_vertcoef() enter:\n");

			ia_css_sdis2_vertcoef_vmem_encode((struct sh_css_isp_sdis_vert_coef_tbl *)
					&stage->binary->mem_params.params[IA_CSS_PARAM_CLASS_PARAM][IA_CSS_ISP_VMEM].address[offset],
					&params->dvs2_coefs,
size);
			params->isp_params_changed = true;
			params->isp_mem_params_changed[pipe_id][stage->stage_num][IA_CSS_ISP_VMEM] = true;

			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_sdis2_vertcoef() leave:\n");
		}

	}
}

/* Code generated by genparam/gencode.c:gen_process_function() */

static void
ia_css_process_sdis2_horiproj(
	unsigned pipe_id,
	const struct ia_css_pipeline_stage *stage,
	struct ia_css_isp_parameters *params)
{
	assert(params != NULL);

	{
		unsigned size   = stage->binary->info->mem_offsets.offsets.param->dmem.sdis2_horiproj.size;

		unsigned offset = stage->binary->info->mem_offsets.offsets.param->dmem.sdis2_horiproj.offset;

		if (size) {
			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_sdis2_horiproj() enter:\n");

			ia_css_sdis2_horiproj_encode((struct sh_css_isp_sdis_hori_proj_tbl *)
					&stage->binary->mem_params.params[IA_CSS_PARAM_CLASS_PARAM][IA_CSS_ISP_DMEM].address[offset],
					&params->dvs2_coefs,
size);
			params->isp_params_changed = true;
			params->isp_mem_params_changed[pipe_id][stage->stage_num][IA_CSS_ISP_DMEM] = true;

			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_sdis2_horiproj() leave:\n");
		}

	}
}

/* Code generated by genparam/gencode.c:gen_process_function() */

static void
ia_css_process_sdis2_vertproj(
	unsigned pipe_id,
	const struct ia_css_pipeline_stage *stage,
	struct ia_css_isp_parameters *params)
{
	assert(params != NULL);

	{
		unsigned size   = stage->binary->info->mem_offsets.offsets.param->dmem.sdis2_vertproj.size;

		unsigned offset = stage->binary->info->mem_offsets.offsets.param->dmem.sdis2_vertproj.offset;

		if (size) {
			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_sdis2_vertproj() enter:\n");

			ia_css_sdis2_vertproj_encode((struct sh_css_isp_sdis_vert_proj_tbl *)
					&stage->binary->mem_params.params[IA_CSS_PARAM_CLASS_PARAM][IA_CSS_ISP_DMEM].address[offset],
					&params->dvs2_coefs,
size);
			params->isp_params_changed = true;
			params->isp_mem_params_changed[pipe_id][stage->stage_num][IA_CSS_ISP_DMEM] = true;

			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_sdis2_vertproj() leave:\n");
		}

	}
}

/* Code generated by genparam/gencode.c:gen_process_function() */

static void
ia_css_process_wb(
	unsigned pipe_id,
	const struct ia_css_pipeline_stage *stage,
	struct ia_css_isp_parameters *params)
{
	assert(params != NULL);

	{
		unsigned size   = stage->binary->info->mem_offsets.offsets.param->dmem.wb.size;

		unsigned offset = stage->binary->info->mem_offsets.offsets.param->dmem.wb.offset;

		if (size) {
			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_wb() enter:\n");

			ia_css_wb_encode((struct sh_css_isp_wb_params *)
					&stage->binary->mem_params.params[IA_CSS_PARAM_CLASS_PARAM][IA_CSS_ISP_DMEM].address[offset],
					&params->wb_config,
size);
			params->isp_params_changed = true;
			params->isp_mem_params_changed[pipe_id][stage->stage_num][IA_CSS_ISP_DMEM] = true;

			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_wb() leave:\n");
		}

	}
}

/* Code generated by genparam/gencode.c:gen_process_function() */

static void
ia_css_process_nr(
	unsigned pipe_id,
	const struct ia_css_pipeline_stage *stage,
	struct ia_css_isp_parameters *params)
{
	assert(params != NULL);

	{
		unsigned size   = stage->binary->info->mem_offsets.offsets.param->dmem.nr.size;

		unsigned offset = stage->binary->info->mem_offsets.offsets.param->dmem.nr.offset;

		if (size) {
			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_nr() enter:\n");

			ia_css_nr_encode((struct sh_css_isp_ynr_params *)
					&stage->binary->mem_params.params[IA_CSS_PARAM_CLASS_PARAM][IA_CSS_ISP_DMEM].address[offset],
					&params->nr_config,
size);
			params->isp_params_changed = true;
			params->isp_mem_params_changed[pipe_id][stage->stage_num][IA_CSS_ISP_DMEM] = true;

			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_nr() leave:\n");
		}

	}
}

/* Code generated by genparam/gencode.c:gen_process_function() */

static void
ia_css_process_yee(
	unsigned pipe_id,
	const struct ia_css_pipeline_stage *stage,
	struct ia_css_isp_parameters *params)
{
	assert(params != NULL);

	{
		unsigned size   = stage->binary->info->mem_offsets.offsets.param->dmem.yee.size;

		unsigned offset = stage->binary->info->mem_offsets.offsets.param->dmem.yee.offset;

		if (size) {
			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_yee() enter:\n");

			ia_css_yee_encode((struct sh_css_isp_yee_params *)
					&stage->binary->mem_params.params[IA_CSS_PARAM_CLASS_PARAM][IA_CSS_ISP_DMEM].address[offset],
					&params->yee_config,
size);
			params->isp_params_changed = true;
			params->isp_mem_params_changed[pipe_id][stage->stage_num][IA_CSS_ISP_DMEM] = true;

			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_yee() leave:\n");
		}

	}
}

/* Code generated by genparam/gencode.c:gen_process_function() */

static void
ia_css_process_ynr(
	unsigned pipe_id,
	const struct ia_css_pipeline_stage *stage,
	struct ia_css_isp_parameters *params)
{
	assert(params != NULL);

	{
		unsigned size   = stage->binary->info->mem_offsets.offsets.param->dmem.ynr.size;

		unsigned offset = stage->binary->info->mem_offsets.offsets.param->dmem.ynr.offset;

		if (size) {
			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_ynr() enter:\n");

			ia_css_ynr_encode((struct sh_css_isp_yee2_params *)
					&stage->binary->mem_params.params[IA_CSS_PARAM_CLASS_PARAM][IA_CSS_ISP_DMEM].address[offset],
					&params->ynr_config,
size);
			params->isp_params_changed = true;
			params->isp_mem_params_changed[pipe_id][stage->stage_num][IA_CSS_ISP_DMEM] = true;

			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_ynr() leave:\n");
		}

	}
}

/* Code generated by genparam/gencode.c:gen_process_function() */

static void
ia_css_process_fc(
	unsigned pipe_id,
	const struct ia_css_pipeline_stage *stage,
	struct ia_css_isp_parameters *params)
{
	assert(params != NULL);

	{
		unsigned size   = stage->binary->info->mem_offsets.offsets.param->dmem.fc.size;

		unsigned offset = stage->binary->info->mem_offsets.offsets.param->dmem.fc.offset;

		if (size) {
			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_fc() enter:\n");

			ia_css_fc_encode((struct sh_css_isp_fc_params *)
					&stage->binary->mem_params.params[IA_CSS_PARAM_CLASS_PARAM][IA_CSS_ISP_DMEM].address[offset],
					&params->fc_config,
size);
			params->isp_params_changed = true;
			params->isp_mem_params_changed[pipe_id][stage->stage_num][IA_CSS_ISP_DMEM] = true;

			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_fc() leave:\n");
		}

	}
}

/* Code generated by genparam/gencode.c:gen_process_function() */

static void
ia_css_process_ctc(
	unsigned pipe_id,
	const struct ia_css_pipeline_stage *stage,
	struct ia_css_isp_parameters *params)
{
	assert(params != NULL);

	{
		unsigned size   = stage->binary->info->mem_offsets.offsets.param->dmem.ctc.size;

		unsigned offset = stage->binary->info->mem_offsets.offsets.param->dmem.ctc.offset;

		if (size) {
			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_ctc() enter:\n");

			ia_css_ctc_encode((struct sh_css_isp_ctc_params *)
					&stage->binary->mem_params.params[IA_CSS_PARAM_CLASS_PARAM][IA_CSS_ISP_DMEM].address[offset],
					&params->ctc_config,
size);
			params->isp_params_changed = true;
			params->isp_mem_params_changed[pipe_id][stage->stage_num][IA_CSS_ISP_DMEM] = true;

			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_ctc() leave:\n");
		}

	}
	{
		unsigned size   = stage->binary->info->mem_offsets.offsets.param->vamem0.ctc.size;

		unsigned offset = stage->binary->info->mem_offsets.offsets.param->vamem0.ctc.offset;

		if (size) {
			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_ctc() enter:\n");

			ia_css_ctc_vamem_encode((struct sh_css_isp_ctc_vamem_params *)
					&stage->binary->mem_params.params[IA_CSS_PARAM_CLASS_PARAM][IA_CSS_ISP_VAMEM0].address[offset],
					&params->ctc_table,
size);
			params->isp_params_changed = true;
			params->isp_mem_params_changed[pipe_id][stage->stage_num][IA_CSS_ISP_VAMEM0] = true;

			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_ctc() leave:\n");
		}

	}
}

/* Code generated by genparam/gencode.c:gen_process_function() */

static void
ia_css_process_xnr_table(
	unsigned pipe_id,
	const struct ia_css_pipeline_stage *stage,
	struct ia_css_isp_parameters *params)
{
	assert(params != NULL);

	{
		unsigned size   = stage->binary->info->mem_offsets.offsets.param->vamem1.xnr_table.size;

		unsigned offset = stage->binary->info->mem_offsets.offsets.param->vamem1.xnr_table.offset;

		if (size) {
			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_xnr_table() enter:\n");

			ia_css_xnr_table_vamem_encode((struct sh_css_isp_xnr_vamem_params *)
					&stage->binary->mem_params.params[IA_CSS_PARAM_CLASS_PARAM][IA_CSS_ISP_VAMEM1].address[offset],
					&params->xnr_table,
size);
			params->isp_params_changed = true;
			params->isp_mem_params_changed[pipe_id][stage->stage_num][IA_CSS_ISP_VAMEM1] = true;

			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_xnr_table() leave:\n");
		}

	}
}

/* Code generated by genparam/gencode.c:gen_process_function() */

static void
ia_css_process_xnr(
	unsigned pipe_id,
	const struct ia_css_pipeline_stage *stage,
	struct ia_css_isp_parameters *params)
{
	assert(params != NULL);

	{
		unsigned size   = stage->binary->info->mem_offsets.offsets.param->dmem.xnr.size;

		unsigned offset = stage->binary->info->mem_offsets.offsets.param->dmem.xnr.offset;

		if (size) {
			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_xnr() enter:\n");

			ia_css_xnr_encode((struct sh_css_isp_xnr_params *)
					&stage->binary->mem_params.params[IA_CSS_PARAM_CLASS_PARAM][IA_CSS_ISP_DMEM].address[offset],
					&params->xnr_config,
size);
			params->isp_params_changed = true;
			params->isp_mem_params_changed[pipe_id][stage->stage_num][IA_CSS_ISP_DMEM] = true;

			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_xnr() leave:\n");
		}

	}
}

/* Code generated by genparam/gencode.c:gen_process_function() */

static void
ia_css_process_xnr3(
	unsigned pipe_id,
	const struct ia_css_pipeline_stage *stage,
	struct ia_css_isp_parameters *params)
{
	assert(params != NULL);

	{
		unsigned size   = stage->binary->info->mem_offsets.offsets.param->dmem.xnr3.size;

		unsigned offset = stage->binary->info->mem_offsets.offsets.param->dmem.xnr3.offset;

		if (size) {
			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_xnr3() enter:\n");

			ia_css_xnr3_encode((struct sh_css_isp_xnr3_params *)
					&stage->binary->mem_params.params[IA_CSS_PARAM_CLASS_PARAM][IA_CSS_ISP_DMEM].address[offset],
					&params->xnr3_config,
size);
			params->isp_params_changed = true;
			params->isp_mem_params_changed[pipe_id][stage->stage_num][IA_CSS_ISP_DMEM] = true;

			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_xnr3() leave:\n");
		}

	}
#ifdef ISP2401
	{
		unsigned size   = stage->binary->info->mem_offsets.offsets.param->vmem.xnr3.size;

		unsigned offset = stage->binary->info->mem_offsets.offsets.param->vmem.xnr3.offset;

		if (size) {
			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_xnr3() enter:\n");

			ia_css_xnr3_vmem_encode((struct sh_css_isp_xnr3_vmem_params *)
					&stage->binary->mem_params.params[IA_CSS_PARAM_CLASS_PARAM][IA_CSS_ISP_VMEM].address[offset],
					&params->xnr3_config,
size);
			params->isp_params_changed = true;
			params->isp_mem_params_changed[pipe_id][stage->stage_num][IA_CSS_ISP_VMEM] = true;

			ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_process_xnr3() leave:\n");
		}

	}
#endif
}

/* Code generated by genparam/gencode.c:gen_param_process_table() */

void (* ia_css_kernel_process_param[IA_CSS_NUM_PARAMETER_IDS])(
			unsigned pipe_id,
			const struct ia_css_pipeline_stage *stage,
			struct ia_css_isp_parameters *params) = {
	ia_css_process_aa,
	ia_css_process_anr,
	ia_css_process_anr2,
	ia_css_process_bh,
	ia_css_process_cnr,
	ia_css_process_crop,
	ia_css_process_csc,
	ia_css_process_dp,
	ia_css_process_bnr,
	ia_css_process_de,
	ia_css_process_ecd,
	ia_css_process_formats,
	ia_css_process_fpn,
	ia_css_process_gc,
	ia_css_process_ce,
	ia_css_process_yuv2rgb,
	ia_css_process_rgb2yuv,
	ia_css_process_r_gamma,
	ia_css_process_g_gamma,
	ia_css_process_b_gamma,
	ia_css_process_uds,
	ia_css_process_raa,
	ia_css_process_s3a,
	ia_css_process_ob,
	ia_css_process_output,
	ia_css_process_sc,
	ia_css_process_bds,
	ia_css_process_tnr,
	ia_css_process_macc,
	ia_css_process_sdis_horicoef,
	ia_css_process_sdis_vertcoef,
	ia_css_process_sdis_horiproj,
	ia_css_process_sdis_vertproj,
	ia_css_process_sdis2_horicoef,
	ia_css_process_sdis2_vertcoef,
	ia_css_process_sdis2_horiproj,
	ia_css_process_sdis2_vertproj,
	ia_css_process_wb,
	ia_css_process_nr,
	ia_css_process_yee,
	ia_css_process_ynr,
	ia_css_process_fc,
	ia_css_process_ctc,
	ia_css_process_xnr_table,
	ia_css_process_xnr,
	ia_css_process_xnr3,
};

/* Code generated by genparam/gencode.c:gen_get_function() */

static void
ia_css_get_dp_config(const struct ia_css_isp_parameters *params,
			struct ia_css_dp_config *config){
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_dp_config() enter: "
		"config=%p\n",config);

	*config = params->dp_config;

	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_dp_config() leave\n");
	ia_css_dp_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
}

/* Code generated by genparam/gencode.c:gen_set_function() */

void
ia_css_set_dp_config(struct ia_css_isp_parameters *params,
			const struct ia_css_dp_config *config)
{
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "ia_css_set_dp_config() enter:\n");
	ia_css_dp_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
	params->dp_config = *config;
	params->config_changed[IA_CSS_DP_ID] = true;
#ifndef ISP2401
	params->config_changed[IA_CSS_DP_ID] = true;

#endif
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_set_dp_config() leave: "
		"return_void\n");
}

/* Code generated by genparam/gencode.c:gen_get_function() */

static void
ia_css_get_wb_config(const struct ia_css_isp_parameters *params,
			struct ia_css_wb_config *config){
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_wb_config() enter: "
		"config=%p\n",config);

	*config = params->wb_config;

	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_wb_config() leave\n");
	ia_css_wb_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
}

/* Code generated by genparam/gencode.c:gen_set_function() */

void
ia_css_set_wb_config(struct ia_css_isp_parameters *params,
			const struct ia_css_wb_config *config)
{
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "ia_css_set_wb_config() enter:\n");
	ia_css_wb_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
	params->wb_config = *config;
	params->config_changed[IA_CSS_WB_ID] = true;
#ifndef ISP2401
	params->config_changed[IA_CSS_WB_ID] = true;

#endif
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_set_wb_config() leave: "
		"return_void\n");
}

/* Code generated by genparam/gencode.c:gen_get_function() */

static void
ia_css_get_tnr_config(const struct ia_css_isp_parameters *params,
			struct ia_css_tnr_config *config){
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_tnr_config() enter: "
		"config=%p\n",config);

	*config = params->tnr_config;

	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_tnr_config() leave\n");
	ia_css_tnr_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
}

/* Code generated by genparam/gencode.c:gen_set_function() */

void
ia_css_set_tnr_config(struct ia_css_isp_parameters *params,
			const struct ia_css_tnr_config *config)
{
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "ia_css_set_tnr_config() enter:\n");
	ia_css_tnr_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
	params->tnr_config = *config;
	params->config_changed[IA_CSS_TNR_ID] = true;
#ifndef ISP2401
	params->config_changed[IA_CSS_TNR_ID] = true;

#endif
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_set_tnr_config() leave: "
		"return_void\n");
}

/* Code generated by genparam/gencode.c:gen_get_function() */

static void
ia_css_get_ob_config(const struct ia_css_isp_parameters *params,
			struct ia_css_ob_config *config){
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_ob_config() enter: "
		"config=%p\n",config);

	*config = params->ob_config;

	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_ob_config() leave\n");
	ia_css_ob_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
}

/* Code generated by genparam/gencode.c:gen_set_function() */

void
ia_css_set_ob_config(struct ia_css_isp_parameters *params,
			const struct ia_css_ob_config *config)
{
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "ia_css_set_ob_config() enter:\n");
	ia_css_ob_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
	params->ob_config = *config;
	params->config_changed[IA_CSS_OB_ID] = true;
#ifndef ISP2401
	params->config_changed[IA_CSS_OB_ID] = true;

#endif
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_set_ob_config() leave: "
		"return_void\n");
}

/* Code generated by genparam/gencode.c:gen_get_function() */

static void
ia_css_get_de_config(const struct ia_css_isp_parameters *params,
			struct ia_css_de_config *config){
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_de_config() enter: "
		"config=%p\n",config);

	*config = params->de_config;

	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_de_config() leave\n");
	ia_css_de_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
}

/* Code generated by genparam/gencode.c:gen_set_function() */

void
ia_css_set_de_config(struct ia_css_isp_parameters *params,
			const struct ia_css_de_config *config)
{
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "ia_css_set_de_config() enter:\n");
	ia_css_de_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
	params->de_config = *config;
	params->config_changed[IA_CSS_DE_ID] = true;
#ifndef ISP2401
	params->config_changed[IA_CSS_DE_ID] = true;

#endif
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_set_de_config() leave: "
		"return_void\n");
}

/* Code generated by genparam/gencode.c:gen_get_function() */

static void
ia_css_get_anr_config(const struct ia_css_isp_parameters *params,
			struct ia_css_anr_config *config){
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_anr_config() enter: "
		"config=%p\n",config);

	*config = params->anr_config;

	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_anr_config() leave\n");
	ia_css_anr_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
}

/* Code generated by genparam/gencode.c:gen_set_function() */

void
ia_css_set_anr_config(struct ia_css_isp_parameters *params,
			const struct ia_css_anr_config *config)
{
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "ia_css_set_anr_config() enter:\n");
	ia_css_anr_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
	params->anr_config = *config;
	params->config_changed[IA_CSS_ANR_ID] = true;
#ifndef ISP2401
	params->config_changed[IA_CSS_ANR_ID] = true;

#endif
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_set_anr_config() leave: "
		"return_void\n");
}

/* Code generated by genparam/gencode.c:gen_get_function() */

static void
ia_css_get_anr2_config(const struct ia_css_isp_parameters *params,
			struct ia_css_anr_thres *config){
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_anr2_config() enter: "
		"config=%p\n",config);

	*config = params->anr_thres;

	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_anr2_config() leave\n");
	ia_css_anr2_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
}

/* Code generated by genparam/gencode.c:gen_set_function() */

void
ia_css_set_anr2_config(struct ia_css_isp_parameters *params,
			const struct ia_css_anr_thres *config)
{
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "ia_css_set_anr2_config() enter:\n");
	ia_css_anr2_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
	params->anr_thres = *config;
	params->config_changed[IA_CSS_ANR2_ID] = true;
#ifndef ISP2401
	params->config_changed[IA_CSS_ANR2_ID] = true;

#endif
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_set_anr2_config() leave: "
		"return_void\n");
}

/* Code generated by genparam/gencode.c:gen_get_function() */

static void
ia_css_get_ce_config(const struct ia_css_isp_parameters *params,
			struct ia_css_ce_config *config){
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_ce_config() enter: "
		"config=%p\n",config);

	*config = params->ce_config;

	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_ce_config() leave\n");
	ia_css_ce_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
}

/* Code generated by genparam/gencode.c:gen_set_function() */

void
ia_css_set_ce_config(struct ia_css_isp_parameters *params,
			const struct ia_css_ce_config *config)
{
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "ia_css_set_ce_config() enter:\n");
	ia_css_ce_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
	params->ce_config = *config;
	params->config_changed[IA_CSS_CE_ID] = true;
#ifndef ISP2401
	params->config_changed[IA_CSS_CE_ID] = true;

#endif
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_set_ce_config() leave: "
		"return_void\n");
}

/* Code generated by genparam/gencode.c:gen_get_function() */

static void
ia_css_get_ecd_config(const struct ia_css_isp_parameters *params,
			struct ia_css_ecd_config *config){
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_ecd_config() enter: "
		"config=%p\n",config);

	*config = params->ecd_config;

	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_ecd_config() leave\n");
	ia_css_ecd_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
}

/* Code generated by genparam/gencode.c:gen_set_function() */

void
ia_css_set_ecd_config(struct ia_css_isp_parameters *params,
			const struct ia_css_ecd_config *config)
{
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "ia_css_set_ecd_config() enter:\n");
	ia_css_ecd_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
	params->ecd_config = *config;
	params->config_changed[IA_CSS_ECD_ID] = true;
#ifndef ISP2401
	params->config_changed[IA_CSS_ECD_ID] = true;

#endif
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_set_ecd_config() leave: "
		"return_void\n");
}

/* Code generated by genparam/gencode.c:gen_get_function() */

static void
ia_css_get_ynr_config(const struct ia_css_isp_parameters *params,
			struct ia_css_ynr_config *config){
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_ynr_config() enter: "
		"config=%p\n",config);

	*config = params->ynr_config;

	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_ynr_config() leave\n");
	ia_css_ynr_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
}

/* Code generated by genparam/gencode.c:gen_set_function() */

void
ia_css_set_ynr_config(struct ia_css_isp_parameters *params,
			const struct ia_css_ynr_config *config)
{
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "ia_css_set_ynr_config() enter:\n");
	ia_css_ynr_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
	params->ynr_config = *config;
	params->config_changed[IA_CSS_YNR_ID] = true;
#ifndef ISP2401
	params->config_changed[IA_CSS_YNR_ID] = true;

#endif
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_set_ynr_config() leave: "
		"return_void\n");
}

/* Code generated by genparam/gencode.c:gen_get_function() */

static void
ia_css_get_fc_config(const struct ia_css_isp_parameters *params,
			struct ia_css_fc_config *config){
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_fc_config() enter: "
		"config=%p\n",config);

	*config = params->fc_config;

	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_fc_config() leave\n");
	ia_css_fc_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
}

/* Code generated by genparam/gencode.c:gen_set_function() */

void
ia_css_set_fc_config(struct ia_css_isp_parameters *params,
			const struct ia_css_fc_config *config)
{
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "ia_css_set_fc_config() enter:\n");
	ia_css_fc_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
	params->fc_config = *config;
	params->config_changed[IA_CSS_FC_ID] = true;
#ifndef ISP2401
	params->config_changed[IA_CSS_FC_ID] = true;

#endif
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_set_fc_config() leave: "
		"return_void\n");
}

/* Code generated by genparam/gencode.c:gen_get_function() */

static void
ia_css_get_cnr_config(const struct ia_css_isp_parameters *params,
			struct ia_css_cnr_config *config){
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_cnr_config() enter: "
		"config=%p\n",config);

	*config = params->cnr_config;

	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_cnr_config() leave\n");
	ia_css_cnr_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
}

/* Code generated by genparam/gencode.c:gen_set_function() */

void
ia_css_set_cnr_config(struct ia_css_isp_parameters *params,
			const struct ia_css_cnr_config *config)
{
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "ia_css_set_cnr_config() enter:\n");
	ia_css_cnr_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
	params->cnr_config = *config;
	params->config_changed[IA_CSS_CNR_ID] = true;
#ifndef ISP2401
	params->config_changed[IA_CSS_CNR_ID] = true;

#endif
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_set_cnr_config() leave: "
		"return_void\n");
}

/* Code generated by genparam/gencode.c:gen_get_function() */

static void
ia_css_get_macc_config(const struct ia_css_isp_parameters *params,
			struct ia_css_macc_config *config){
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_macc_config() enter: "
		"config=%p\n",config);

	*config = params->macc_config;

	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_macc_config() leave\n");
	ia_css_macc_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
}

/* Code generated by genparam/gencode.c:gen_set_function() */

void
ia_css_set_macc_config(struct ia_css_isp_parameters *params,
			const struct ia_css_macc_config *config)
{
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "ia_css_set_macc_config() enter:\n");
	ia_css_macc_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
	params->macc_config = *config;
	params->config_changed[IA_CSS_MACC_ID] = true;
#ifndef ISP2401
	params->config_changed[IA_CSS_MACC_ID] = true;

#endif
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_set_macc_config() leave: "
		"return_void\n");
}

/* Code generated by genparam/gencode.c:gen_get_function() */

static void
ia_css_get_ctc_config(const struct ia_css_isp_parameters *params,
			struct ia_css_ctc_config *config){
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_ctc_config() enter: "
		"config=%p\n",config);

	*config = params->ctc_config;

	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_ctc_config() leave\n");
	ia_css_ctc_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
}

/* Code generated by genparam/gencode.c:gen_set_function() */

void
ia_css_set_ctc_config(struct ia_css_isp_parameters *params,
			const struct ia_css_ctc_config *config)
{
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "ia_css_set_ctc_config() enter:\n");
	ia_css_ctc_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
	params->ctc_config = *config;
	params->config_changed[IA_CSS_CTC_ID] = true;
#ifndef ISP2401
	params->config_changed[IA_CSS_CTC_ID] = true;

#endif
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_set_ctc_config() leave: "
		"return_void\n");
}

/* Code generated by genparam/gencode.c:gen_get_function() */

static void
ia_css_get_aa_config(const struct ia_css_isp_parameters *params,
			struct ia_css_aa_config *config){
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_aa_config() enter: "
		"config=%p\n",config);

	*config = params->aa_config;

	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_aa_config() leave\n");
}

/* Code generated by genparam/gencode.c:gen_set_function() */

void
ia_css_set_aa_config(struct ia_css_isp_parameters *params,
			const struct ia_css_aa_config *config)
{
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "ia_css_set_aa_config() enter:\n");
	params->aa_config = *config;
	params->config_changed[IA_CSS_AA_ID] = true;
#ifndef ISP2401
	params->config_changed[IA_CSS_AA_ID] = true;

#endif
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_set_aa_config() leave: "
		"return_void\n");
}

/* Code generated by genparam/gencode.c:gen_get_function() */

static void
ia_css_get_yuv2rgb_config(const struct ia_css_isp_parameters *params,
			struct ia_css_cc_config *config){
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_yuv2rgb_config() enter: "
		"config=%p\n",config);

	*config = params->yuv2rgb_cc_config;

	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_yuv2rgb_config() leave\n");
	ia_css_yuv2rgb_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
}

/* Code generated by genparam/gencode.c:gen_set_function() */

void
ia_css_set_yuv2rgb_config(struct ia_css_isp_parameters *params,
			const struct ia_css_cc_config *config)
{
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "ia_css_set_yuv2rgb_config() enter:\n");
	ia_css_yuv2rgb_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
	params->yuv2rgb_cc_config = *config;
	params->config_changed[IA_CSS_YUV2RGB_ID] = true;
#ifndef ISP2401
	params->config_changed[IA_CSS_YUV2RGB_ID] = true;

#endif
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_set_yuv2rgb_config() leave: "
		"return_void\n");
}

/* Code generated by genparam/gencode.c:gen_get_function() */

static void
ia_css_get_rgb2yuv_config(const struct ia_css_isp_parameters *params,
			struct ia_css_cc_config *config){
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_rgb2yuv_config() enter: "
		"config=%p\n",config);

	*config = params->rgb2yuv_cc_config;

	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_rgb2yuv_config() leave\n");
	ia_css_rgb2yuv_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
}

/* Code generated by genparam/gencode.c:gen_set_function() */

void
ia_css_set_rgb2yuv_config(struct ia_css_isp_parameters *params,
			const struct ia_css_cc_config *config)
{
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "ia_css_set_rgb2yuv_config() enter:\n");
	ia_css_rgb2yuv_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
	params->rgb2yuv_cc_config = *config;
	params->config_changed[IA_CSS_RGB2YUV_ID] = true;
#ifndef ISP2401
	params->config_changed[IA_CSS_RGB2YUV_ID] = true;

#endif
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_set_rgb2yuv_config() leave: "
		"return_void\n");
}

/* Code generated by genparam/gencode.c:gen_get_function() */

static void
ia_css_get_csc_config(const struct ia_css_isp_parameters *params,
			struct ia_css_cc_config *config){
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_csc_config() enter: "
		"config=%p\n",config);

	*config = params->cc_config;

	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_csc_config() leave\n");
	ia_css_csc_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
}

/* Code generated by genparam/gencode.c:gen_set_function() */

void
ia_css_set_csc_config(struct ia_css_isp_parameters *params,
			const struct ia_css_cc_config *config)
{
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "ia_css_set_csc_config() enter:\n");
	ia_css_csc_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
	params->cc_config = *config;
	params->config_changed[IA_CSS_CSC_ID] = true;
#ifndef ISP2401
	params->config_changed[IA_CSS_CSC_ID] = true;

#endif
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_set_csc_config() leave: "
		"return_void\n");
}

/* Code generated by genparam/gencode.c:gen_get_function() */

static void
ia_css_get_nr_config(const struct ia_css_isp_parameters *params,
			struct ia_css_nr_config *config){
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_nr_config() enter: "
		"config=%p\n",config);

	*config = params->nr_config;

	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_nr_config() leave\n");
	ia_css_nr_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
}

/* Code generated by genparam/gencode.c:gen_set_function() */

void
ia_css_set_nr_config(struct ia_css_isp_parameters *params,
			const struct ia_css_nr_config *config)
{
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "ia_css_set_nr_config() enter:\n");
	ia_css_nr_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
	params->nr_config = *config;
	params->config_changed[IA_CSS_BNR_ID] = true;
	params->config_changed[IA_CSS_NR_ID] = true;
#ifndef ISP2401
	params->config_changed[IA_CSS_NR_ID] = true;

#endif
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_set_nr_config() leave: "
		"return_void\n");
}

/* Code generated by genparam/gencode.c:gen_get_function() */

static void
ia_css_get_gc_config(const struct ia_css_isp_parameters *params,
			struct ia_css_gc_config *config){
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_gc_config() enter: "
		"config=%p\n",config);

	*config = params->gc_config;

	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_gc_config() leave\n");
	ia_css_gc_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
}

/* Code generated by genparam/gencode.c:gen_set_function() */

void
ia_css_set_gc_config(struct ia_css_isp_parameters *params,
			const struct ia_css_gc_config *config)
{
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "ia_css_set_gc_config() enter:\n");
	ia_css_gc_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
	params->gc_config = *config;
	params->config_changed[IA_CSS_GC_ID] = true;
#ifndef ISP2401
	params->config_changed[IA_CSS_GC_ID] = true;

#endif
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_set_gc_config() leave: "
		"return_void\n");
}

/* Code generated by genparam/gencode.c:gen_get_function() */

static void
ia_css_get_sdis_horicoef_config(const struct ia_css_isp_parameters *params,
			struct ia_css_dvs_coefficients *config){
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_sdis_horicoef_config() enter: "
		"config=%p\n",config);

	*config = params->dvs_coefs;

	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_sdis_horicoef_config() leave\n");
	ia_css_sdis_horicoef_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
}

/* Code generated by genparam/gencode.c:gen_set_function() */

void
ia_css_set_sdis_horicoef_config(struct ia_css_isp_parameters *params,
			const struct ia_css_dvs_coefficients *config)
{
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "ia_css_set_sdis_horicoef_config() enter:\n");
	ia_css_sdis_horicoef_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
	params->dvs_coefs = *config;
	params->config_changed[IA_CSS_SDIS_HORICOEF_ID] = true;
	params->config_changed[IA_CSS_SDIS_VERTCOEF_ID] = true;
	params->config_changed[IA_CSS_SDIS_HORIPROJ_ID] = true;
	params->config_changed[IA_CSS_SDIS_VERTPROJ_ID] = true;
#ifndef ISP2401
	params->config_changed[IA_CSS_SDIS_HORICOEF_ID] = true;

#endif
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_set_sdis_horicoef_config() leave: "
		"return_void\n");
}

/* Code generated by genparam/gencode.c:gen_get_function() */

static void
ia_css_get_sdis_vertcoef_config(const struct ia_css_isp_parameters *params,
			struct ia_css_dvs_coefficients *config){
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_sdis_vertcoef_config() enter: "
		"config=%p\n",config);

	*config = params->dvs_coefs;

	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_sdis_vertcoef_config() leave\n");
	ia_css_sdis_vertcoef_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
}

/* Code generated by genparam/gencode.c:gen_set_function() */

void
ia_css_set_sdis_vertcoef_config(struct ia_css_isp_parameters *params,
			const struct ia_css_dvs_coefficients *config)
{
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "ia_css_set_sdis_vertcoef_config() enter:\n");
	ia_css_sdis_vertcoef_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
	params->dvs_coefs = *config;
	params->config_changed[IA_CSS_SDIS_HORICOEF_ID] = true;
	params->config_changed[IA_CSS_SDIS_VERTCOEF_ID] = true;
	params->config_changed[IA_CSS_SDIS_HORIPROJ_ID] = true;
	params->config_changed[IA_CSS_SDIS_VERTPROJ_ID] = true;
#ifndef ISP2401
	params->config_changed[IA_CSS_SDIS_VERTCOEF_ID] = true;

#endif
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_set_sdis_vertcoef_config() leave: "
		"return_void\n");
}

/* Code generated by genparam/gencode.c:gen_get_function() */

static void
ia_css_get_sdis_horiproj_config(const struct ia_css_isp_parameters *params,
			struct ia_css_dvs_coefficients *config){
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_sdis_horiproj_config() enter: "
		"config=%p\n",config);

	*config = params->dvs_coefs;

	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_sdis_horiproj_config() leave\n");
	ia_css_sdis_horiproj_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
}

/* Code generated by genparam/gencode.c:gen_set_function() */

void
ia_css_set_sdis_horiproj_config(struct ia_css_isp_parameters *params,
			const struct ia_css_dvs_coefficients *config)
{
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "ia_css_set_sdis_horiproj_config() enter:\n");
	ia_css_sdis_horiproj_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
	params->dvs_coefs = *config;
	params->config_changed[IA_CSS_SDIS_HORICOEF_ID] = true;
	params->config_changed[IA_CSS_SDIS_VERTCOEF_ID] = true;
	params->config_changed[IA_CSS_SDIS_HORIPROJ_ID] = true;
	params->config_changed[IA_CSS_SDIS_VERTPROJ_ID] = true;
#ifndef ISP2401
	params->config_changed[IA_CSS_SDIS_HORIPROJ_ID] = true;

#endif
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_set_sdis_horiproj_config() leave: "
		"return_void\n");
}

/* Code generated by genparam/gencode.c:gen_get_function() */

static void
ia_css_get_sdis_vertproj_config(const struct ia_css_isp_parameters *params,
			struct ia_css_dvs_coefficients *config){
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_sdis_vertproj_config() enter: "
		"config=%p\n",config);

	*config = params->dvs_coefs;

	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_sdis_vertproj_config() leave\n");
	ia_css_sdis_vertproj_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
}

/* Code generated by genparam/gencode.c:gen_set_function() */

void
ia_css_set_sdis_vertproj_config(struct ia_css_isp_parameters *params,
			const struct ia_css_dvs_coefficients *config)
{
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "ia_css_set_sdis_vertproj_config() enter:\n");
	ia_css_sdis_vertproj_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
	params->dvs_coefs = *config;
	params->config_changed[IA_CSS_SDIS_HORICOEF_ID] = true;
	params->config_changed[IA_CSS_SDIS_VERTCOEF_ID] = true;
	params->config_changed[IA_CSS_SDIS_HORIPROJ_ID] = true;
	params->config_changed[IA_CSS_SDIS_VERTPROJ_ID] = true;
#ifndef ISP2401
	params->config_changed[IA_CSS_SDIS_VERTPROJ_ID] = true;

#endif
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_set_sdis_vertproj_config() leave: "
		"return_void\n");
}

/* Code generated by genparam/gencode.c:gen_get_function() */

static void
ia_css_get_sdis2_horicoef_config(const struct ia_css_isp_parameters *params,
			struct ia_css_dvs2_coefficients *config){
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_sdis2_horicoef_config() enter: "
		"config=%p\n",config);

	*config = params->dvs2_coefs;

	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_sdis2_horicoef_config() leave\n");
	ia_css_sdis2_horicoef_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
}

/* Code generated by genparam/gencode.c:gen_set_function() */

void
ia_css_set_sdis2_horicoef_config(struct ia_css_isp_parameters *params,
			const struct ia_css_dvs2_coefficients *config)
{
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "ia_css_set_sdis2_horicoef_config() enter:\n");
	ia_css_sdis2_horicoef_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
	params->dvs2_coefs = *config;
	params->config_changed[IA_CSS_SDIS2_HORICOEF_ID] = true;
	params->config_changed[IA_CSS_SDIS2_VERTCOEF_ID] = true;
	params->config_changed[IA_CSS_SDIS2_HORIPROJ_ID] = true;
	params->config_changed[IA_CSS_SDIS2_VERTPROJ_ID] = true;
#ifndef ISP2401
	params->config_changed[IA_CSS_SDIS2_HORICOEF_ID] = true;

#endif
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_set_sdis2_horicoef_config() leave: "
		"return_void\n");
}

/* Code generated by genparam/gencode.c:gen_get_function() */

static void
ia_css_get_sdis2_vertcoef_config(const struct ia_css_isp_parameters *params,
			struct ia_css_dvs2_coefficients *config){
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_sdis2_vertcoef_config() enter: "
		"config=%p\n",config);

	*config = params->dvs2_coefs;

	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_sdis2_vertcoef_config() leave\n");
	ia_css_sdis2_vertcoef_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
}

/* Code generated by genparam/gencode.c:gen_set_function() */

void
ia_css_set_sdis2_vertcoef_config(struct ia_css_isp_parameters *params,
			const struct ia_css_dvs2_coefficients *config)
{
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "ia_css_set_sdis2_vertcoef_config() enter:\n");
	ia_css_sdis2_vertcoef_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
	params->dvs2_coefs = *config;
	params->config_changed[IA_CSS_SDIS2_HORICOEF_ID] = true;
	params->config_changed[IA_CSS_SDIS2_VERTCOEF_ID] = true;
	params->config_changed[IA_CSS_SDIS2_HORIPROJ_ID] = true;
	params->config_changed[IA_CSS_SDIS2_VERTPROJ_ID] = true;
#ifndef ISP2401
	params->config_changed[IA_CSS_SDIS2_VERTCOEF_ID] = true;

#endif
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_set_sdis2_vertcoef_config() leave: "
		"return_void\n");
}

/* Code generated by genparam/gencode.c:gen_get_function() */

static void
ia_css_get_sdis2_horiproj_config(const struct ia_css_isp_parameters *params,
			struct ia_css_dvs2_coefficients *config){
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_sdis2_horiproj_config() enter: "
		"config=%p\n",config);

	*config = params->dvs2_coefs;

	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_sdis2_horiproj_config() leave\n");
	ia_css_sdis2_horiproj_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
}

/* Code generated by genparam/gencode.c:gen_set_function() */

void
ia_css_set_sdis2_horiproj_config(struct ia_css_isp_parameters *params,
			const struct ia_css_dvs2_coefficients *config)
{
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "ia_css_set_sdis2_horiproj_config() enter:\n");
	ia_css_sdis2_horiproj_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
	params->dvs2_coefs = *config;
	params->config_changed[IA_CSS_SDIS2_HORICOEF_ID] = true;
	params->config_changed[IA_CSS_SDIS2_VERTCOEF_ID] = true;
	params->config_changed[IA_CSS_SDIS2_HORIPROJ_ID] = true;
	params->config_changed[IA_CSS_SDIS2_VERTPROJ_ID] = true;
#ifndef ISP2401
	params->config_changed[IA_CSS_SDIS2_HORIPROJ_ID] = true;

#endif
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_set_sdis2_horiproj_config() leave: "
		"return_void\n");
}

/* Code generated by genparam/gencode.c:gen_get_function() */

static void
ia_css_get_sdis2_vertproj_config(const struct ia_css_isp_parameters *params,
			struct ia_css_dvs2_coefficients *config){
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_sdis2_vertproj_config() enter: "
		"config=%p\n",config);

	*config = params->dvs2_coefs;

	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_sdis2_vertproj_config() leave\n");
	ia_css_sdis2_vertproj_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
}

/* Code generated by genparam/gencode.c:gen_set_function() */

void
ia_css_set_sdis2_vertproj_config(struct ia_css_isp_parameters *params,
			const struct ia_css_dvs2_coefficients *config)
{
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "ia_css_set_sdis2_vertproj_config() enter:\n");
	ia_css_sdis2_vertproj_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
	params->dvs2_coefs = *config;
	params->config_changed[IA_CSS_SDIS2_HORICOEF_ID] = true;
	params->config_changed[IA_CSS_SDIS2_VERTCOEF_ID] = true;
	params->config_changed[IA_CSS_SDIS2_HORIPROJ_ID] = true;
	params->config_changed[IA_CSS_SDIS2_VERTPROJ_ID] = true;
#ifndef ISP2401
	params->config_changed[IA_CSS_SDIS2_VERTPROJ_ID] = true;

#endif
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_set_sdis2_vertproj_config() leave: "
		"return_void\n");
}

/* Code generated by genparam/gencode.c:gen_get_function() */

static void
ia_css_get_r_gamma_config(const struct ia_css_isp_parameters *params,
			struct ia_css_rgb_gamma_table *config){
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_r_gamma_config() enter: "
		"config=%p\n",config);

	*config = params->r_gamma_table;

	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_r_gamma_config() leave\n");
	ia_css_r_gamma_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
}

/* Code generated by genparam/gencode.c:gen_set_function() */

void
ia_css_set_r_gamma_config(struct ia_css_isp_parameters *params,
			const struct ia_css_rgb_gamma_table *config)
{
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "ia_css_set_r_gamma_config() enter:\n");
	ia_css_r_gamma_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
	params->r_gamma_table = *config;
	params->config_changed[IA_CSS_R_GAMMA_ID] = true;
#ifndef ISP2401
	params->config_changed[IA_CSS_R_GAMMA_ID] = true;

#endif
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_set_r_gamma_config() leave: "
		"return_void\n");
}

/* Code generated by genparam/gencode.c:gen_get_function() */

static void
ia_css_get_g_gamma_config(const struct ia_css_isp_parameters *params,
			struct ia_css_rgb_gamma_table *config){
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_g_gamma_config() enter: "
		"config=%p\n",config);

	*config = params->g_gamma_table;

	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_g_gamma_config() leave\n");
	ia_css_g_gamma_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
}

/* Code generated by genparam/gencode.c:gen_set_function() */

void
ia_css_set_g_gamma_config(struct ia_css_isp_parameters *params,
			const struct ia_css_rgb_gamma_table *config)
{
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "ia_css_set_g_gamma_config() enter:\n");
	ia_css_g_gamma_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
	params->g_gamma_table = *config;
	params->config_changed[IA_CSS_G_GAMMA_ID] = true;
#ifndef ISP2401
	params->config_changed[IA_CSS_G_GAMMA_ID] = true;

#endif
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_set_g_gamma_config() leave: "
		"return_void\n");
}

/* Code generated by genparam/gencode.c:gen_get_function() */

static void
ia_css_get_b_gamma_config(const struct ia_css_isp_parameters *params,
			struct ia_css_rgb_gamma_table *config){
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_b_gamma_config() enter: "
		"config=%p\n",config);

	*config = params->b_gamma_table;

	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_b_gamma_config() leave\n");
	ia_css_b_gamma_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
}

/* Code generated by genparam/gencode.c:gen_set_function() */

void
ia_css_set_b_gamma_config(struct ia_css_isp_parameters *params,
			const struct ia_css_rgb_gamma_table *config)
{
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "ia_css_set_b_gamma_config() enter:\n");
	ia_css_b_gamma_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
	params->b_gamma_table = *config;
	params->config_changed[IA_CSS_B_GAMMA_ID] = true;
#ifndef ISP2401
	params->config_changed[IA_CSS_B_GAMMA_ID] = true;

#endif
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_set_b_gamma_config() leave: "
		"return_void\n");
}

/* Code generated by genparam/gencode.c:gen_get_function() */

static void
ia_css_get_xnr_table_config(const struct ia_css_isp_parameters *params,
			struct ia_css_xnr_table *config){
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_xnr_table_config() enter: "
		"config=%p\n",config);

	*config = params->xnr_table;

	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_xnr_table_config() leave\n");
	ia_css_xnr_table_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
}

/* Code generated by genparam/gencode.c:gen_set_function() */

void
ia_css_set_xnr_table_config(struct ia_css_isp_parameters *params,
			const struct ia_css_xnr_table *config)
{
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "ia_css_set_xnr_table_config() enter:\n");
	ia_css_xnr_table_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
	params->xnr_table = *config;
	params->config_changed[IA_CSS_XNR_TABLE_ID] = true;
#ifndef ISP2401
	params->config_changed[IA_CSS_XNR_TABLE_ID] = true;

#endif
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_set_xnr_table_config() leave: "
		"return_void\n");
}

/* Code generated by genparam/gencode.c:gen_get_function() */

static void
ia_css_get_formats_config(const struct ia_css_isp_parameters *params,
			struct ia_css_formats_config *config){
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_formats_config() enter: "
		"config=%p\n",config);

	*config = params->formats_config;

	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_formats_config() leave\n");
	ia_css_formats_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
}

/* Code generated by genparam/gencode.c:gen_set_function() */

void
ia_css_set_formats_config(struct ia_css_isp_parameters *params,
			const struct ia_css_formats_config *config)
{
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "ia_css_set_formats_config() enter:\n");
	ia_css_formats_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
	params->formats_config = *config;
	params->config_changed[IA_CSS_FORMATS_ID] = true;
#ifndef ISP2401
	params->config_changed[IA_CSS_FORMATS_ID] = true;

#endif
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_set_formats_config() leave: "
		"return_void\n");
}

/* Code generated by genparam/gencode.c:gen_get_function() */

static void
ia_css_get_xnr_config(const struct ia_css_isp_parameters *params,
			struct ia_css_xnr_config *config){
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_xnr_config() enter: "
		"config=%p\n",config);

	*config = params->xnr_config;

	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_xnr_config() leave\n");
	ia_css_xnr_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
}

/* Code generated by genparam/gencode.c:gen_set_function() */

void
ia_css_set_xnr_config(struct ia_css_isp_parameters *params,
			const struct ia_css_xnr_config *config)
{
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "ia_css_set_xnr_config() enter:\n");
	ia_css_xnr_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
	params->xnr_config = *config;
	params->config_changed[IA_CSS_XNR_ID] = true;
#ifndef ISP2401
	params->config_changed[IA_CSS_XNR_ID] = true;

#endif
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_set_xnr_config() leave: "
		"return_void\n");
}

/* Code generated by genparam/gencode.c:gen_get_function() */

static void
ia_css_get_xnr3_config(const struct ia_css_isp_parameters *params,
			struct ia_css_xnr3_config *config){
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_xnr3_config() enter: "
		"config=%p\n",config);

	*config = params->xnr3_config;

	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_xnr3_config() leave\n");
	ia_css_xnr3_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
}

/* Code generated by genparam/gencode.c:gen_set_function() */

void
ia_css_set_xnr3_config(struct ia_css_isp_parameters *params,
			const struct ia_css_xnr3_config *config)
{
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "ia_css_set_xnr3_config() enter:\n");
	ia_css_xnr3_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
	params->xnr3_config = *config;
	params->config_changed[IA_CSS_XNR3_ID] = true;
#ifndef ISP2401
	params->config_changed[IA_CSS_XNR3_ID] = true;

#endif
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_set_xnr3_config() leave: "
		"return_void\n");
}

/* Code generated by genparam/gencode.c:gen_get_function() */

static void
ia_css_get_s3a_config(const struct ia_css_isp_parameters *params,
			struct ia_css_3a_config *config){
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_s3a_config() enter: "
		"config=%p\n",config);

	*config = params->s3a_config;

	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_s3a_config() leave\n");
	ia_css_s3a_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
}

/* Code generated by genparam/gencode.c:gen_set_function() */

void
ia_css_set_s3a_config(struct ia_css_isp_parameters *params,
			const struct ia_css_3a_config *config)
{
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "ia_css_set_s3a_config() enter:\n");
	ia_css_s3a_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
	params->s3a_config = *config;
	params->config_changed[IA_CSS_BH_ID] = true;
	params->config_changed[IA_CSS_S3A_ID] = true;
#ifndef ISP2401
	params->config_changed[IA_CSS_S3A_ID] = true;

#endif
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_set_s3a_config() leave: "
		"return_void\n");
}

/* Code generated by genparam/gencode.c:gen_get_function() */

static void
ia_css_get_output_config(const struct ia_css_isp_parameters *params,
			struct ia_css_output_config *config){
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_output_config() enter: "
		"config=%p\n",config);

	*config = params->output_config;

	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_get_output_config() leave\n");
	ia_css_output_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
}

/* Code generated by genparam/gencode.c:gen_set_function() */

void
ia_css_set_output_config(struct ia_css_isp_parameters *params,
			const struct ia_css_output_config *config)
{
	if (config == NULL)
		return;

	assert(params != NULL);
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "ia_css_set_output_config() enter:\n");
	ia_css_output_debug_dtrace(config, IA_CSS_DEBUG_TRACE);
	params->output_config = *config;
	params->config_changed[IA_CSS_OUTPUT_ID] = true;
#ifndef ISP2401
	params->config_changed[IA_CSS_OUTPUT_ID] = true;

#endif
	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "ia_css_set_output_config() leave: "
		"return_void\n");
}

/* Code generated by genparam/gencode.c:gen_global_access_function() */

void
ia_css_get_configs(struct ia_css_isp_parameters *params,
		const struct ia_css_isp_config *config)
{
	ia_css_get_dp_config(params, config->dp_config);
	ia_css_get_wb_config(params, config->wb_config);
	ia_css_get_tnr_config(params, config->tnr_config);
	ia_css_get_ob_config(params, config->ob_config);
	ia_css_get_de_config(params, config->de_config);
	ia_css_get_anr_config(params, config->anr_config);
	ia_css_get_anr2_config(params, config->anr_thres);
	ia_css_get_ce_config(params, config->ce_config);
	ia_css_get_ecd_config(params, config->ecd_config);
	ia_css_get_ynr_config(params, config->ynr_config);
	ia_css_get_fc_config(params, config->fc_config);
	ia_css_get_cnr_config(params, config->cnr_config);
	ia_css_get_macc_config(params, config->macc_config);
	ia_css_get_ctc_config(params, config->ctc_config);
	ia_css_get_aa_config(params, config->aa_config);
	ia_css_get_yuv2rgb_config(params, config->yuv2rgb_cc_config);
	ia_css_get_rgb2yuv_config(params, config->rgb2yuv_cc_config);
	ia_css_get_csc_config(params, config->cc_config);
	ia_css_get_nr_config(params, config->nr_config);
	ia_css_get_gc_config(params, config->gc_config);
	ia_css_get_sdis_horicoef_config(params, config->dvs_coefs);
	ia_css_get_sdis_vertcoef_config(params, config->dvs_coefs);
	ia_css_get_sdis_horiproj_config(params, config->dvs_coefs);
	ia_css_get_sdis_vertproj_config(params, config->dvs_coefs);
	ia_css_get_sdis2_horicoef_config(params, config->dvs2_coefs);
	ia_css_get_sdis2_vertcoef_config(params, config->dvs2_coefs);
	ia_css_get_sdis2_horiproj_config(params, config->dvs2_coefs);
	ia_css_get_sdis2_vertproj_config(params, config->dvs2_coefs);
	ia_css_get_r_gamma_config(params, config->r_gamma_table);
	ia_css_get_g_gamma_config(params, config->g_gamma_table);
	ia_css_get_b_gamma_config(params, config->b_gamma_table);
	ia_css_get_xnr_table_config(params, config->xnr_table);
	ia_css_get_formats_config(params, config->formats_config);
	ia_css_get_xnr_config(params, config->xnr_config);
	ia_css_get_xnr3_config(params, config->xnr3_config);
	ia_css_get_s3a_config(params, config->s3a_config);
	ia_css_get_output_config(params, config->output_config);
}

/* Code generated by genparam/gencode.c:gen_global_access_function() */

void
ia_css_set_configs(struct ia_css_isp_parameters *params,
		const struct ia_css_isp_config *config)
{
	ia_css_set_dp_config(params, config->dp_config);
	ia_css_set_wb_config(params, config->wb_config);
	ia_css_set_tnr_config(params, config->tnr_config);
	ia_css_set_ob_config(params, config->ob_config);
	ia_css_set_de_config(params, config->de_config);
	ia_css_set_anr_config(params, config->anr_config);
	ia_css_set_anr2_config(params, config->anr_thres);
	ia_css_set_ce_config(params, config->ce_config);
	ia_css_set_ecd_config(params, config->ecd_config);
	ia_css_set_ynr_config(params, config->ynr_config);
	ia_css_set_fc_config(params, config->fc_config);
	ia_css_set_cnr_config(params, config->cnr_config);
	ia_css_set_macc_config(params, config->macc_config);
	ia_css_set_ctc_config(params, config->ctc_config);
	ia_css_set_aa_config(params, config->aa_config);
	ia_css_set_yuv2rgb_config(params, config->yuv2rgb_cc_config);
	ia_css_set_rgb2yuv_config(params, config->rgb2yuv_cc_config);
	ia_css_set_csc_config(params, config->cc_config);
	ia_css_set_nr_config(params, config->nr_config);
	ia_css_set_gc_config(params, config->gc_config);
	ia_css_set_sdis_horicoef_config(params, config->dvs_coefs);
	ia_css_set_sdis_vertcoef_config(params, config->dvs_coefs);
	ia_css_set_sdis_horiproj_config(params, config->dvs_coefs);
	ia_css_set_sdis_vertproj_config(params, config->dvs_coefs);
	ia_css_set_sdis2_horicoef_config(params, config->dvs2_coefs);
	ia_css_set_sdis2_vertcoef_config(params, config->dvs2_coefs);
	ia_css_set_sdis2_horiproj_config(params, config->dvs2_coefs);
	ia_css_set_sdis2_vertproj_config(params, config->dvs2_coefs);
	ia_css_set_r_gamma_config(params, config->r_gamma_table);
	ia_css_set_g_gamma_config(params, config->g_gamma_table);
	ia_css_set_b_gamma_config(params, config->b_gamma_table);
	ia_css_set_xnr_table_config(params, config->xnr_table);
	ia_css_set_formats_config(params, config->formats_config);
	ia_css_set_xnr_config(params, config->xnr_config);
	ia_css_set_xnr3_config(params, config->xnr3_config);
	ia_css_set_s3a_config(params, config->s3a_config);
	ia_css_set_output_config(params, config->output_config);
}

