/*
 * 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 int pipe_id,
    const struct ia_css_pipeline_stage *stage,
    struct ia_css_isp_parameters *params)
{
	unsigned int size   =
	    stage->binary->info->mem_offsets.offsets.param->dmem.aa.size;
	unsigned int 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 int pipe_id,
    const struct ia_css_pipeline_stage *stage,
    struct ia_css_isp_parameters *params)
{
	assert(params);

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

		unsigned int 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 int pipe_id,
    const struct ia_css_pipeline_stage *stage,
    struct ia_css_isp_parameters *params)
{
	assert(params);

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

		unsigned int 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 int pipe_id,
    const struct ia_css_pipeline_stage *stage,
    struct ia_css_isp_parameters *params)
{
	assert(params);

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

		unsigned int 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 int 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 int pipe_id,
    const struct ia_css_pipeline_stage *stage,
    struct ia_css_isp_parameters *params)
{
	assert(params);

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

		unsigned int 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 int pipe_id,
    const struct ia_css_pipeline_stage *stage,
    struct ia_css_isp_parameters *params)
{
	assert(params);

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

		unsigned int 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 int pipe_id,
    const struct ia_css_pipeline_stage *stage,
    struct ia_css_isp_parameters *params)
{
	assert(params);

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

		unsigned int 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 int pipe_id,
    const struct ia_css_pipeline_stage *stage,
    struct ia_css_isp_parameters *params)
{
	assert(params);

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

		unsigned int 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 int pipe_id,
    const struct ia_css_pipeline_stage *stage,
    struct ia_css_isp_parameters *params)
{
	assert(params);

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

		unsigned int 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 int pipe_id,
    const struct ia_css_pipeline_stage *stage,
    struct ia_css_isp_parameters *params)
{
	assert(params);

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

		unsigned int 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 int pipe_id,
    const struct ia_css_pipeline_stage *stage,
    struct ia_css_isp_parameters *params)
{
	assert(params);

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

		unsigned int 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 int pipe_id,
    const struct ia_css_pipeline_stage *stage,
    struct ia_css_isp_parameters *params)
{
	assert(params);

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

		unsigned int 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 int pipe_id,
    const struct ia_css_pipeline_stage *stage,
    struct ia_css_isp_parameters *params)
{
	assert(params);

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

		unsigned int 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 int pipe_id,
    const struct ia_css_pipeline_stage *stage,
    struct ia_css_isp_parameters *params)
{
	assert(params);

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

		unsigned int 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 int size   =
		    stage->binary->info->mem_offsets.offsets.param->vamem1.gc.size;

		unsigned int 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 int pipe_id,
    const struct ia_css_pipeline_stage *stage,
    struct ia_css_isp_parameters *params)
{
	assert(params);

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

		unsigned int 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 int pipe_id,
    const struct ia_css_pipeline_stage *stage,
    struct ia_css_isp_parameters *params)
{
	assert(params);

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

		unsigned int 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 int pipe_id,
    const struct ia_css_pipeline_stage *stage,
    struct ia_css_isp_parameters *params)
{
	assert(params);

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

		unsigned int 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 int pipe_id,
    const struct ia_css_pipeline_stage *stage,
    struct ia_css_isp_parameters *params)
{
	assert(params);

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

		unsigned int 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 int pipe_id,
    const struct ia_css_pipeline_stage *stage,
    struct ia_css_isp_parameters *params)
{
	assert(params);

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

		unsigned int 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 int pipe_id,
    const struct ia_css_pipeline_stage *stage,
    struct ia_css_isp_parameters *params)
{
	assert(params);

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

		unsigned int 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 int pipe_id,
    const struct ia_css_pipeline_stage *stage,
    struct ia_css_isp_parameters *params)
{
	assert(params);

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

		unsigned int 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 int pipe_id,
    const struct ia_css_pipeline_stage *stage,
    struct ia_css_isp_parameters *params)
{
	assert(params);

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

		unsigned int 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 int pipe_id,
    const struct ia_css_pipeline_stage *stage,
    struct ia_css_isp_parameters *params)
{
	assert(params);

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

		unsigned int 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 int pipe_id,
    const struct ia_css_pipeline_stage *stage,
    struct ia_css_isp_parameters *params)
{
	assert(params);

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

		unsigned int 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 int size   =
		    stage->binary->info->mem_offsets.offsets.param->vmem.ob.size;

		unsigned int 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 int pipe_id,
    const struct ia_css_pipeline_stage *stage,
    struct ia_css_isp_parameters *params)
{
	assert(params);

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

		unsigned int 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 int pipe_id,
    const struct ia_css_pipeline_stage *stage,
    struct ia_css_isp_parameters *params)
{
	assert(params);

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

		unsigned int 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 int pipe_id,
    const struct ia_css_pipeline_stage *stage,
    struct ia_css_isp_parameters *params)
{
	assert(params);

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

		unsigned int 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 int pipe_id,
    const struct ia_css_pipeline_stage *stage,
    struct ia_css_isp_parameters *params)
{
	assert(params);

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

		unsigned int 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 int pipe_id,
    const struct ia_css_pipeline_stage *stage,
    struct ia_css_isp_parameters *params)
{
	assert(params);

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

		unsigned int 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 int pipe_id,
    const struct ia_css_pipeline_stage *stage,
    struct ia_css_isp_parameters *params)
{
	assert(params);

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

		unsigned int 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 int pipe_id,
    const struct ia_css_pipeline_stage *stage,
    struct ia_css_isp_parameters *params)
{
	assert(params);

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

		unsigned int 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 int pipe_id,
    const struct ia_css_pipeline_stage *stage,
    struct ia_css_isp_parameters *params)
{
	assert(params);

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

		unsigned int 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 int pipe_id,
    const struct ia_css_pipeline_stage *stage,
    struct ia_css_isp_parameters *params)
{
	assert(params);

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

		unsigned int 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 int pipe_id,
    const struct ia_css_pipeline_stage *stage,
    struct ia_css_isp_parameters *params)
{
	assert(params);

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

		unsigned int 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 int pipe_id,
    const struct ia_css_pipeline_stage *stage,
    struct ia_css_isp_parameters *params)
{
	assert(params);

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

		unsigned int 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 int pipe_id,
    const struct ia_css_pipeline_stage *stage,
    struct ia_css_isp_parameters *params)
{
	assert(params);

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

		unsigned int 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 int pipe_id,
    const struct ia_css_pipeline_stage *stage,
    struct ia_css_isp_parameters *params)
{
	assert(params);

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

		unsigned int 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 int pipe_id,
    const struct ia_css_pipeline_stage *stage,
    struct ia_css_isp_parameters *params)
{
	assert(params);

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

		unsigned int 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 int pipe_id,
    const struct ia_css_pipeline_stage *stage,
    struct ia_css_isp_parameters *params)
{
	assert(params);

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

		unsigned int 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 int pipe_id,
    const struct ia_css_pipeline_stage *stage,
    struct ia_css_isp_parameters *params)
{
	assert(params);

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

		unsigned int 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 int pipe_id,
    const struct ia_css_pipeline_stage *stage,
    struct ia_css_isp_parameters *params)
{
	assert(params);

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

		unsigned int 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 int pipe_id,
    const struct ia_css_pipeline_stage *stage,
    struct ia_css_isp_parameters *params)
{
	assert(params);

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

		unsigned int 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 int pipe_id,
    const struct ia_css_pipeline_stage *stage,
    struct ia_css_isp_parameters *params)
{
	assert(params);

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

		unsigned int 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 int size   =
		    stage->binary->info->mem_offsets.offsets.param->vamem0.ctc.size;

		unsigned int 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 int pipe_id,
    const struct ia_css_pipeline_stage *stage,
    struct ia_css_isp_parameters *params)
{
	assert(params);

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

		unsigned int 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 int pipe_id,
    const struct ia_css_pipeline_stage *stage,
    struct ia_css_isp_parameters *params)
{
	assert(params);

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

		unsigned int 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 int pipe_id,
    const struct ia_css_pipeline_stage *stage,
    struct ia_css_isp_parameters *params)
{
	assert(params);

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

		unsigned int 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");
		}
	}
	{
		unsigned int size   =
		    stage->binary->info->mem_offsets.offsets.param->vmem.xnr3.size;

		unsigned int 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");
		}
	}
}

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

void (*ia_css_kernel_process_param[IA_CSS_NUM_PARAMETER_IDS])(
    unsigned int 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)
		return;

	assert(params);
	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)
		return;

	assert(params);
	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;
	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)
		return;

	assert(params);
	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)
		return;

	assert(params);
	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;
	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)
		return;

	assert(params);
	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)
		return;

	assert(params);
	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;
	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)
		return;

	assert(params);
	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)
		return;

	assert(params);
	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;
	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)
		return;

	assert(params);
	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)
		return;

	assert(params);
	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;
	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)
		return;

	assert(params);
	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)
		return;

	assert(params);
	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;
	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)
		return;

	assert(params);
	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)
		return;

	assert(params);
	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;
	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)
		return;

	assert(params);
	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)
		return;

	assert(params);
	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;
	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)
		return;

	assert(params);
	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)
		return;

	assert(params);
	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;
	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)
		return;

	assert(params);
	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)
		return;

	assert(params);
	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;
	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)
		return;

	assert(params);
	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)
		return;

	assert(params);
	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;
	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)
		return;

	assert(params);
	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)
		return;

	assert(params);
	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;
	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)
		return;

	assert(params);
	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)
		return;

	assert(params);
	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;
	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)
		return;

	assert(params);
	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)
		return;

	assert(params);
	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;
	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)
		return;

	assert(params);
	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)
		return;

	assert(params);
	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;
	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)
		return;

	assert(params);
	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)
		return;

	assert(params);
	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;
	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)
		return;

	assert(params);
	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)
		return;

	assert(params);
	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;
	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)
		return;

	assert(params);
	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)
		return;

	assert(params);
	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;
	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)
		return;

	assert(params);
	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)
		return;

	assert(params);
	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;
	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)
		return;

	assert(params);
	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)
		return;

	assert(params);
	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;
	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)
		return;

	assert(params);
	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)
		return;

	assert(params);
	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;
	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)
		return;

	assert(params);
	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)
		return;

	assert(params);
	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;
	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)
		return;

	assert(params);
	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)
		return;

	assert(params);
	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;
	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)
		return;

	assert(params);
	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)
		return;

	assert(params);
	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;
	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)
		return;

	assert(params);
	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)
		return;

	assert(params);
	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;
	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)
		return;

	assert(params);
	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)
		return;

	assert(params);
	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;
	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)
		return;

	assert(params);
	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)
		return;

	assert(params);
	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;
	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)
		return;

	assert(params);
	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)
		return;

	assert(params);
	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;
	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)
		return;

	assert(params);
	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)
		return;

	assert(params);
	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;
	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)
		return;

	assert(params);
	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)
		return;

	assert(params);
	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;
	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)
		return;

	assert(params);
	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)
		return;

	assert(params);
	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;
	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)
		return;

	assert(params);
	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)
		return;

	assert(params);
	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;
	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)
		return;

	assert(params);
	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)
		return;

	assert(params);
	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;
	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)
		return;

	assert(params);
	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)
		return;

	assert(params);
	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;
	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)
		return;

	assert(params);
	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)
		return;

	assert(params);
	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;
	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)
		return;

	assert(params);
	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)
		return;

	assert(params);
	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;
	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)
		return;

	assert(params);
	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)
		return;

	assert(params);
	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;
	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);
}
