// SPDX-License-Identifier: GPL-2.0
/*
 * Support for Intel Camera Imaging ISP subsystem.
 * Copyright (c) 2015, Intel Corporation.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms and conditions of the GNU General Public License,
 * version 2, as published by the Free Software Foundation.
 *
 * This program is distributed in the hope it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 */
#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;
	}
	params->isp_params_changed = true;
	params->isp_mem_params_changed[pipe_id][stage->stage_num][IA_CSS_ISP_DMEM] =
	    true;
}

/* 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");
		}
	}
}

/* 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;
	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;
	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;
	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;
	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;
	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;
	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;
	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;
	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;
	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;
	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;
	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;
	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;
	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;
	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;
	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;
	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;
	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;
	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;
	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;
	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;
	params->config_changed[IA_CSS_SDIS_HORICOEF_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;
	params->config_changed[IA_CSS_SDIS_VERTCOEF_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;
	params->config_changed[IA_CSS_SDIS_HORIPROJ_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;
	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;
	params->config_changed[IA_CSS_SDIS2_HORICOEF_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;
	params->config_changed[IA_CSS_SDIS2_VERTCOEF_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;
	params->config_changed[IA_CSS_SDIS2_HORIPROJ_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;
	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;
	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;
	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;
	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;
	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;
	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;
	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;
	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;
	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;
	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);
}
